
PROGRAM RuekSort (input, output); {Blatt 4 - Gibt die Eingabe rckwrts und sortiert aus.}

CONST   Maximum=81;
        LF=CHR(10);
VAR     Zeile: ARRAY [1..Maximum] OF CHAR;
        Ende: INTEGER;
        dummy: CHAR;

PROCEDURE Einlesen(VAR Feld: ARRAY OF CHAR; Maximum: INTEGER; VAR Position: INTEGER);
{Liest ab Position Zeichen ins Feld, bis entweder RETURN gedrckt wird,
 oder Maximum erreicht ist}
VAR     Zeichen: CHAR;
BEGIN
     REPEAT
           IF Position=Maximum THEN
              Zeichen:=LF
           ELSE
              READ(Zeichen);
           IF Zeichen<>chr(13) THEN BEGIN
              Feld[Position]:=Zeichen;
              Position:=Position+1;
           END;
     UNTIL Zeichen=LF;
     Position:=Position-1;
END { Einlesen };

PROCEDURE Ausgeben(Feld: ARRAY OF CHAR);
{Gibt Feld zeichenweise aus, bis LF erreicht ist.}
VAR   i:INTEGER;
BEGIN
     i:=0;
     REPEAT
           i:=i+1;
           WRITE(Feld[i]);
     UNTIL Feld[i]=LF;
     WRITELN('');
END;

PROCEDURE Tausch(VAR a: CHAR; VAR b: CHAR);
{Ringtausch zweier Variablen}
VAR c:CHAR;
BEGIN
     c:=a; a:=b; b:=c;
END;

PROCEDURE Umdrehen(VAR Zeile: ARRAY OF CHAR; Endpos: INTEGER);
VAR   unt,ob:INTEGER;
BEGIN
      unt:=1;
      ob:=Endpos-1; {Endpos = LF, sollte am Ende bleiben!}

      WHILE unt<ob DO BEGIN
            Tausch(Zeile[unt],Zeile[ob]);
            unt:=unt+1;
            ob:=ob-1;
      END;
END;

Procedure Sortieren(VAR Zeile: ARRAY OF CHAR; Endpos: INTEGER);
VAR x,y: INTEGER;
BEGIN
     FOR x:=1 TO Endpos-2 DO  {Endpos = LF, sollte am Ende bleiben!}
         FOR y:=x+1 to Endpos-1 DO
             IF Zeile[y]<Zeile[x] THEN
                 Tausch(Zeile[x],Zeile[y]);

END;

BEGIN {Hauptprogramm}
      Ende:=1; {Das Feld mit LF abschlieen}

      WRITELN('Bitte geben sie eine Zeile ein');
      Einlesen(Zeile,Maximum,Ende);

      WRITELN('Die eingegebene Zeile lautet: ');
      Ausgeben(Zeile);

      WRITELN('Drehe die Zeile um ... ');
      Umdrehen(Zeile,Ende);
      Ausgeben(Zeile);

      WRITELN('Jetzt sortiere ich sie ...');
      Sortieren(Zeile,Ende);
      Ausgeben(Zeile);

END {Blatt3.pas}
.
