MODULE decrypt; FROM InOut IMPORT Read, Done, Write, WriteString, WriteLn; CONST maxWort = 1000; maxLaenge = 30; TYPE Wort = ARRAY [0..maxLaenge] OF CHAR; Status = (alphanum, nichtAlphanum, undefiniert); (* alphanum: man befinde sich in einem alphanumerischen Wort. nichtAlphanum: man befinde sich in einem nichtalphanumerischen Wort. undefiniert: man befindet sich in keinem Wort (nur fuer den Anfang) *) Fehler = (keiner, zuvieleWoerter, zulangesWort); VAR wort: ARRAY [1..maxWort] OF Wort; anzahl, laenge, i: INTEGER; (* Anzahl der Woerter und Laenge eines Wortes*) ch: CHAR; status: Status; fehler: Fehler; BEGIN status := undefiniert; anzahl := 0; laenge := 0; fehler := keiner; Read(ch); WHILE Done AND (fehler = keiner) DO (* Entschluesselung des Buchstaben *) CASE ch OF | 'b'..'z','B'..'Z': ch := CHR(ORD(ch)-1); | 'a': ch := 'z'; | 'A': ch := 'Z'; ELSE END; CASE ch OF | 'a'..'z','A'..'Z','0'..'9': (* aktuelles Zeichen ist alphanumerisch *) CASE status OF | alphanum: IF laenge < maxLaenge THEN wort[anzahl][laenge] := ch; INC(laenge); ELSE fehler := zulangesWort; END; | nichtAlphanum: IF anzahl < maxWort THEN INC(anzahl); wort[anzahl][0] := ch; laenge := 1; ELSE fehler := zuvieleWoerter; END; | undefiniert: INC(anzahl); wort[anzahl][laenge] := ch; INC(laenge); END; status := alphanum; ELSE (* aktuelles Zeichen ist NICHT alphanumerisch *) CASE status OF | nichtAlphanum: IF laenge < maxLaenge THEN wort[anzahl][laenge] := ch; INC(laenge); ELSE fehler := zulangesWort; END; | alphanum: IF anzahl < maxWort THEN INC(anzahl); wort[anzahl][0] := ch; laenge := 1; ELSE fehler := zuvieleWoerter; END; | undefiniert: INC(anzahl); wort[anzahl][laenge] := ch; INC(laenge); END; status := nichtAlphanum; END; wort[anzahl][laenge] := 0C; (* Nullzeichen am Ende des aktuellen Wortes setzten *) Read(ch); END; CASE fehler OF | keiner: (* Woerter rueckwaerts ausgeben *) FOR i := anzahl TO 1 BY -1 DO WriteString(wort[i]); END; | zuvieleWoerter: WriteString("Fehler: zuviele Woerter!"); WriteLn; | zulangesWort: WriteString("Fehler: Wort zu lang!"); WriteLn; END; END decrypt.