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 Tage, wobei 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.
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!