Prof. Dr. Franz Schweiggert Abteilung Angewandte Informationsverarbeitung 14. Januar 2004
Dr. Andreas Borchert, Michael Wiedemann Blatt 11


Uni Logo



Allgemeine Informatik I (WS 2003/2004)


Abgabetermin: 21. Januar 2004

23 Blumengießplan - 6 Punkte

Sie haben Pflanzen, die unterschiedlich oft gegossen werden möchten. In einer Datei haben Sie Ihre Pflanzen notiert zusammen mit der Gießfrequenz in Tagen. Zu schreiben ist ein Programm in Oberon, das eine entsprechende Datei einliest und einen Blumengießplan ausgibt für $n$ Tage, wobei $n$ das kleinste gemeinsame Vielfache aller angegebenen Gießfrequenzen ist.

Hier ist ein Beispiel:

doolin$ cat plants
Anthurium 2
Cymbidium 1
Hibiscus 3
doolin$ WateringPlan <plants
Day 1:
   Anthurium
   Cymbidium
   Hibiscus
Day 2:
   Cymbidium
Day 3:
   Anthurium
   Cymbidium
Day 4:
   Cymbidium
   Hibiscus
Day 5:
   Anthurium
   Cymbidium
Day 6:
   Cymbidium
doolin$

Sowohl für die maximale Länge eines Pflanzennamens als auch für die Zahl der Pflanzen insgesamt dürfen Sie Obergrenzen festlegen, so daß Sie mit festdimensionierten Arrays arbeiten können.

Bei diesem Übungsblatt ist insbesondere auf eine sinnvolle Aufteilung in Prozeduren Wert zu legen. Benötigt werden unter anderem Prozeduren für

Dabei sollte die Einlese-Prozedur einen BOOLEAN-Wert zurückliefern, der angibt, ob das Einlesen erfolgreich war oder nicht. Die Einlese-Prozedur sollte dabei nicht nur das Eingabe-Ende erkennen, sondern auch bei sonstigen Einlesefehlern FALSE zurückgeben. Sie dürfen in dieser Aufgabe davon ausgehen, daß Pflanzennamen keine Leerzeichen enthalten.

Ihr Programm sollte ebenso robust sein, falls sich in der Eingabe mehr Pflanzenangaben vorhanden sind, als in dem zugehörigen Array Platz haben. In diesem Falle dürfen Sie der Einfachheit halber stillschweigend die überzähligen Angaben ignorieren.

Achten Sie bitte darauf, daß Variablen so lokal wie möglich deklariert werden. Das Array mit den Pflanzen darf global deklariert werden, aber beispielsweise Index-Variablen zum Durchlaufen des Arrays sind lokal innerhalb einer Prozedur zu deklarieren.

24 Pflanzennamen mit mehreren Worten - 4 Punkte

Viele Pflanzennamen bestehen aus mehreren Worten. Um diese von Ihrem Programm unterstützen zu können, hilft folgende Konvention:

Um solche Namen einlesen zu können, sollten Sie eine Prozedur mit folgender Spezifikation entwickeln:

   PROCEDURE ReadName(VAR name: ARRAY OF CHAR) : BOOLEAN;

Führende Leerzeichen sind zu überlesen. Ist dann das erste Zeichen ein doppeltes Anführungszeichen (ASCII.quote), dann gehören alle Zeichen nach dem doppelten Anführungszeichen bis vor dem nächsten doppelten Anführungszeichen zu dem einzulesenden Namen. Steht zu Beginn kein doppeltes Anführungszeichen, so gehören alle Zeichen bis vor dem nächsten Leerzeichen oder dem Eingabeende zu dem einzulesenen Namen.

Unabhängig von der Länge des übergebenen Arrays name ist der Name vollständig einzulesen. Das führt dazu, daß eingelesene Namen in abgeschnittener Form abgelegt werden, falls das Array zu kurz sein sollte. Auch in diesem Falle sollte die Terminierung mit einem Nullbyte am Ende garantiert werden.

Bei Erfolg ist TRUE zurückzuliefern. Das Abschneiden wegen einem zu kurzem Array wird noch nicht als Mißerfolg betrachtet. Nur wenn das terminierende doppelte Anführungszeichen fehlt oder überhaupt kein Wort vorgefunden wurde, soll FALSE zurückgegeben werden.

Zu den Leerzeichen gehören auch Tabulatoren und Zeilentrenner:

   white := (ch = " ") OR (ch = ASCII.nl) OR (ch = ASCII.tab);

Beispiel:

doolin$ cat plants2
Anthurium 2
"Cymbidium 'Apollo Exburg'" 1
"Hibiscus africanus Mill." 3
doolin$ WateringPlan <plants2
Day 1:
   Anthurium 
   Cymbidium 'Apollo Exburg' 
   Hibiscus africanus Mill. 
Day 2:
   Cymbidium 'Apollo Exburg' 
Day 3:
   Anthurium 
   Cymbidium 'Apollo Exburg' 
Day 4:
   Cymbidium 'Apollo Exburg' 
   Hibiscus africanus Mill. 
Day 5:
   Anthurium 
   Cymbidium 'Apollo Exburg' 
Day 6:
   Cymbidium 'Apollo Exburg' 
doolin$

Viel Erfolg!



Andreas Borchert 2004-01-14