#include #include /* Zahl der Buchstaben pro Zeile */ #define LIMIT 70 /* Konstanten fuer die Tastencodes zum anheben (CAPSON) bzw. absenken * (CAPSOFF) des Wagens. */ #define CAPSON 30 #define CAPSOFF 31 /* Ausgabe eines Zeichens. * - byte ist der Tastencode (0 - 29) * - capslock gibt an, ob der Wagen angehoben ist oder nicht. */ void showbyte (int byte, int capslock) { /* Zuordnug Tastencode -> Buchstabe. * - caps fuer den Fall, dass der Wagen angehoben ist. * - nocaps fuer den Fall, dass der Wagen nicht angehoben ist. * Anmerkung: ``static'' vor der eigentlichen Deklaration * bewirkt, dass die Variablen nur einmal beim Programmstart * angelegt und initialisiert werden und nicht bei jedem * Aufruf der Prozedur. Fuer die Korrektheit des Programms * ist static hier nicht notwendig. */ static char caps[40] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ:;+*"; static char nocaps[40] = "abcdefghijklmnopqrstuvwxyz.,-/"; /* Eingangsbedingung ueberpruefen. */ assert ((0 <= byte) && (byte <= 29)); if (capslock) { printf ("%c", caps[byte]); } else { printf ("%c", nocaps[byte]); } } /* Uebersicht ueber das Hauptprogram: * Die aeussere while-Schleife laeuft so lange, wie erfolgreich ein weiteres * byte eingelesen werden konnte. * Die for-Schleife baut jeweils 5 Bits zu einem Byte zusammen. Sollte * dabei das Dateiende erreicht werden, wird das aktuelle Byte nicht mehr * ausgegeben und more auf 0 (FALSE) gesetzt, damit die while-Schleife * terminiert. */ int main () { /* Boolen Variable, die angibt, ob der Wagen im Moment * angehoben ist. */ int capslock = 0; /* Zahl der bisher geschriebenen Buchstaben */ int count = 0; /* Boolean Variable, die angibt, ob beim letzten Durchlauf * noch ein vollstaendiges Byte gelesen werden konnte. */ int more = 1; while (more) { /* Variablendeklarationen sind immer zu beginn eines * Blocks moeglich. */ int i; /* Zaehlvariable fuer die Bits */ int byte; /* Das aktuelle Byte. */ char c; /* Das aktuelle Zeichen */ byte = 0; /* Fuenf Bits einlesen und ein byte daraus bauen */ for (i=0; i<5; ++i) { /* " %c" liest beliebig viele (auch 0) Leerzeichen * und einen weiteren Buchstaben. */ if (1 != scanf (" %c", &c)) { more = 0; break; } byte <<= 1; /* byte *= 2 */ switch (c) { case '0': break; case '1': byte++; break; default: printf ("Ungueltige Eingabe\n"); return 1; } } if (more) { switch (byte) { case CAPSON: /* Byte bedeutet: Wagen anheben. */ capslock = 1; break; case CAPSOFF: /* Byte bedeutet: Wagen absenken. */ capslock = 0; break; default: /* Normales Zeichen: Byte ausgeben. */ showbyte (byte, capslock); count++; if (count % 70 == 0) { printf ("\n"); } } } } /* Eine neue Zeile am Ende kann nie schaden. */ printf ("\n"); /* Programm erfolgreich beenden. */ return 0; }