#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 liesst solange Strings von der * Standardeingabe, bis das Dateiende erreicht ist. * Die innere while-Schleife baut jeweils 5 Bits zu einem Byte * zusammen. Sollte der in der aeusseren Schleife gelesene String * nicht mehr genuegend Bits enthalten, so wird zunaechst die * aeussere Schleife fortgesetzt, um einen neuen String zu lesen. * Anschliessend macht die innere Schleife genau dort beim * Zusammenbauen eines Bytes weiter, wo sie im vorherigen Durchlauf * unterbrochen wurde. */ int main () { /* Der aktuelle String. */ char bits[100]; /* Position des naechten zu bearbeitenden Buchstabens in bits */ int pos; /* Zahl der Bits, die noch fuer das aktuelle Byte benoetigt * werden. */ int morebits; /* Der bisherige Wert, des aktuellen Bytes. */ int byte; /* Boolen Variable, die angibt, ob der Wagen im Moment * angehoben ist. */ int capslock = 0; /* Zahl der bisher geschriebenen Buchstaben */ int count = 0; /* Zu Beginn benoetigen wir 5 (weitere) Bits fuer ein * vollstaendiges Byte und das aktuelle Byte hat noch * den Wert 0. */ morebits = 5; byte = 0; /* Aeussere Schleife: Strings von der Standardeingabe lesen. */ while (scanf ("%s", bits) == 1) { /* Innere Schleife: Gelesenen String abarbeien. */ pos = 0; while (bits[pos]) { /* Ein weiteres Bit anhaengen und die Zahl * der noch benoetigten Bits um Eins reduzieren. */ switch (bits[pos]) { case '0': byte = 2*byte; morebits--; break; case '1': byte = 2*byte+1; morebits--; break; default: printf ("Ungueltige Eingabe\n"); return 1; } /* Ein vollstaendiges Byte? */ if (morebits == 0) { 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"); } } /* byte und morebits fuer den Zusammenbau * des naechsten Bytes initialisieren. */ byte = 0; morebits = 5; } /* Zur naechsten Position im String gehen. */ pos++; } } /* Eine neue Zeile am Ende kann nie schaden. */ printf ("\n"); /* Programm erfolgreich beenden. */ return 0; }