Einsendung:

Lösungsvorschlag

hier die wahrscheinlich kürzeste Lösung...

bool isdigit(char ch)// ch ist eine Ziffer
{
   return (ch>=48 && ch<=57);
}
bool isalpha(char ch)// ch ist ein Buchstabe (ohne Umlaute)
{
   return ((ch>=97 && ch<=122) ¦¦ (ch>=65 && ch<=90));
}
bool islower(char ch)// ch ist ein Kleinbuchstabe
{
   return (ch>=97 && ch<=122);
}
bool isupper(char ch)// ch ist ein Großbuchstabe
{
   return (ch>=65 && ch<=90);
}
char tolower(char ch)// macht aus ch einen Kleinbuchstaben
{
   if(isupper(ch)) return ch+32else return ch;
}
char toupper(char ch)// macht aus ch einen Großbuchstaben
{
   if(islower(ch)) return ch-32else return ch;
}

Geht es noch kürzer?

 Naja. Ein ganz klein wenig kürzer vielleicht. Aber das ist nicht so wichtig. Wichtig wäre es, die magic numbers (das sind Zahlen, die im Code stehen, und deren Herkunft nicht so einfach ersichtlich ist ) aus dem Code herauszuholen. Eigentlich sind alle Zahlen im Code außer 0, 1 und -1 magic numbers und sollten vermieden werden. Das ist übrigens der Grund dafür, daß ich in diesem Kurs alle Zahlen rot darstelle.
 Da Sie immer wieder Bedingungen der Art "liegt ch zwischen X und Y" formulieren, ist es zweckdienlich, diese in eine eigene Funktion auszulagern. Der übliche Name dieser Funktion ist range.

bool range(char a,char b,char c)
{
   return a<=b && b<=c;
};

Jetzt benutzen Sie immer, wenn es geht, die range-Funktion. Außerdem macht der Compiler (habe ich in der Lektion doch geschrieben) keinen Unterschied zwischen 'A' und 65. Also schreiben Sie einfach 'A', und der Code wird leichter zu lesen sein:

bool isdigit(char ch)// ch ist eine Ziffer
{
   return range('0',ch,'9');
};
bool islower(char ch)// ch ist ein Kleinbuchstabe
{
   return range('a',ch,'z');
};
bool isupper(char ch)// ch ist ein Großbuchstabe
{
   return range('A',ch,'Z');
}
bool isalpha(char ch)// ch ist ein Buchstabe (ohne Umlaute)
{
   return islower(ch) ¦¦ isupper(ch);
};

Jetzt noch die magic number 32 herausholen:

char tolower(char ch)// macht aus ch einen Kleinbuchstaben
{
   if(isupper(ch))
      return ch+('a'-'A');
   else
      return ch;
};

Im Vergleich zu den Profi-Lösungen sind diese Vorschläge aber noch Waisenkinder.
Schauen Sie mal in die Date <ctype.h>. Dort sind diese Funktionen bereits implementiert. Allerdings mit Sprachmitteln, die wir noch nicht hatten. Auf der Suche nach der kürzesten (und schnellsten) Lösung sind sie aber echt sehenswert.

War es klug, in tolower() und toupper() die Funktionen isupper() und islower() zu benutzen?

Das war klug. Immer volle Pulle benutzen!

Oder hätte ich da die Abfrage besser "manuell" gemacht? Ich meine, es könnte doch sein, daß jemand nur tolower() in seinem Code wiederverwenden will und dann einfach die Funktion herauskopiert. Da sie jedoch abhängig von der anderen Funktion ist, gäbe es dann Probleme. Was ist nun besser?

Das macht er nicht. Sie werden für sich schon die Funktionen so plazieren, daß Sie sie immer wieder verwenden können. Dann können es andere auch. Damit meine ich (bald kommt es auch in den Lektionen): Sie bauen sich eigene include-Dateien mit solchen Funktionen wie tolower und toupper und inkludieren sie einfach, wenn Sie die Funktionen verwenden wollen. In der Datei, wo tolower() und toupper() stehen, da stehen auch isupper() und islower().



Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00