Universität Ulm -Sektion Angewandte Informationsverarbeitung
10.Übungsblatt (12.01.00 bis 19.01.00)
zur Vorlesung Allgemeine Informatik I (WS 99)


Aufgabe 1 (10 Punkte)

Ihr bester, aber etwas skuriler Studienkumpel Hugo ist leider bei dem Versuch gescheitert, "Ich hätte auch WIMA studiert, wenn es nicht so schwer wäre!" an die Tür des Dekans der Medizinischen Fakultät zu schreiben. Er wurde erwischt und sofort wegen Majestätsbeleidigung verhaftet. Nun sitzt er in Stammheim und wartet auf seine Verhandlung. Um sich die Zeit zu verkürzen, kann er eine leichte Tätigkeit annehmen. Er darf wählen zwischen Büroklammern biegen und Zahlen sortieren. Da er mit der Beißzange nicht richtig umgehen kann, wählt er letzteres. Nachts träumt er öfter von seiner früheren Karriere als Bardame auf Studentenfeschden, und erfindet deshalb zum Sortieren der Zahlenkolonnen den Shakersort:

Zahlen von der Standardeingabe einlesen und in das Array drinks ablegen - vom Anfang bis zum Ende des Arrays laufen - immer die aktuelle Zahl drinks[i] mit dem Nachfolger drinks[i+1] vergleichen - ist drinks[i+1] kleiner, werden beide getauscht - am Ende des Arrays wieder rückwärts laufen - drinks[i] mit drinks[i-1] vergleichen - ist drinks[i] kleiner, werden beide getauscht - dieses Auf und Ab solange durchführen, bis bei einem Durchgang nichts mehr getauscht wurde.

Seinem Hang zum Selbstquälen folgend, portiert er in den ersten 2 Wochen seiner Inhaftierung das Ulmer Oberonsystem auf den anstaltseigenen 386er und beginnt dann mit dem eigentlichen Sortierprogramm. Er liest die Zahlen von der Standardeingabe in das VAR drinks: ARRAY 200 OF INTEGER  bleibt dann aber stecken, nachdem er sich entschlossen hat, das Array an eine Prozedur zum Sortieren zu übergeben. Er weiß nur noch, dass er unbedingt die

PROCEDURE ShakeIt(VAR longdrink: ARRAY OF INTEGER; drinklen: INTEGER);

mit exakt diesen Parametern (drinklen enthält die Anzahl der eingelesenen Zahlen) zum Sortieren verwenden will. Er bittet Sie als seinen besten Freund um Hilfe ... Lassen Sie Ihren Kumpel in dieser miesen Lage nicht im Stich und schreiben Sie ihm das komplette Oberonprogramm! Da Sie brilliant mit Prozeduren umzugehen wissen, entschließen Sie sich gleich noch zum Einsatz von

PROCEDURE ReadIt(VAR longdrink: ARRAY OF INTEGER): INTEGER;

das die Zahlen einliest und die Anzahl der eingelesenen Zahlen zurückliefert sowie von

PROCEDURE PrintIt(longdrink: ARRAY OF INTEGER; drinklen: INTEGER);

das die sortierte Zahlenkolonne am Bildschirm wieder ausgibt. Der Hauptteil Ihres Programmes ist nun denkbar klein:
 

len := ReadIt(drinks);
ShakeIt(drinks, len);
PrintIt(drinks, len);
 

Hugo ist ausgesprochen dankbar und wird in der Verhandlung freigesprochen, nachdem er eine kleine anonyme Spende an die Partei getätigt hat, der auch zufällig der Richter angehört ...