#include /* Obergrenze fuer die Zahl der ausgegebenen Bytes pro Zeile. */ #define LIMIT 12 /* Konvertierung eines Buchstabens in einen Tastencode (byte). * Falls fuer die Dartstellung von c der Wagen angehoben werden * muss, wird noch 32 addiert. * Im Fehlerfall (nicht darstellbares Zeichen) wird -1 zurueckgegeben. */ int tobyte (char c) { /* Gross und Kleinbuchstaben. */ if (('A' <= c) && (c <= 'Z')) return 32+c-'A'; if (('a' <= c) && (c <= 'z')) return c - 'a'; /* Fuer die Sonderzeichen ist eine Fallunterscheidung noetig: */ switch (c) { case ':': return 32+26; case ';': return 32+27; case '+': return 32+28; case '*': return 32+29; case '.': return 26; case ',': return 27; case '-': return 28; case '/': return 29; } /* Ooops: Es wurde kein passender Tastencode gefunden. */ return -1; } /* Ein Byte als Bitstring ausgeben. Anhebungen wurden bereits vom * Aufrufer beruecksichtigt. */ void printbyte (int byte) { char s[6] ="00000"; int pos; /* byte wird in seine fuenf Bits zerlegt und das Ergebnis * wird in s gespeichert. */ for (pos = 4; pos >=0; --pos) { /* byte % 2 liefert das letzte Bit. */ if (byte % 2) { s[pos] = '1'; } /* byte /= 2 schneidet das letzte Bit ab. */ byte /= 2; } /* Uff geschafft. Jetzt nur noch ausgeben. */ printf ("%s", s); } int main () { /* Zahl der bisher in der aktuellen Zeile ausgegebenen Bytes. */ int count = 0; /* Wagen zur Zeit angehoben? */ int capson = 0; /* Der aktuelle Buchstabe */ char c; /* Hilfsvariablen */ int byte; int needcaps; /* Aeussere Schleife: Strings von der Standardeingabe lesen. */ while (scanf (" %c", &c) == 1) { /* Buchstabe in einen Tastencode konvertieren. */ byte = tobyte (c); if (byte < 0) { printf ("Ungueltige Eingabe\n"); return 1; } needcaps = 0; /* tobyte liefert genau dann eine Zahl >=32 * zurueck, wenn der Wagen angehoben werden muss. */ if (byte >= 32) needcaps = 1; /* needcaps gibt an, ob der Wagen fuer das * naechste Zeichen angehoben sein muss, capson * gibt an, ob der Wagen im Moment angehoben ist. * Wenn sich beide unterscheiden, wird ein * weiterer Tastencode benoetigt. */ if (needcaps != capson) { /* Wagen angehoben? */ if (capson) { /* Ja: absenken. */ printf ("11111"); capson = 0; } else { /* Nein: jetzt anheben. */ printf ("11110"); capson = 1; } /* Leerzeichen bzw. Newline ausgeben und * count anpassen. */ count++; if (count % LIMIT == 0) { printf ("\n"); } else { printf (" "); } } /* An dieser Stelle ist "Wagen anheben" abgehandelt. * Wir benoetigen also ab sofort diese Information * in byte nicht mehr (vgl. tobyte). */ if (byte >= 32) { byte -= 32; } /* Eigentlichen Tastencode gefolgt von Leerzeichen/ * Newline ausgeben. */ printbyte (byte); /* Leerzeichen bzw. Newline ausgeben und * count anpassen. */ count++; if (count % LIMIT == 0) { printf ("\n"); } else { printf (" "); } } /* Ev. angefangene Zeile beenden. */ printf ("\n"); return 0; }