Prof. Dr. Franz Schweiggert -- Sektion Angewandte Informationsverarbeitung -- 15. Dezember 1998
Dr. Andreas Borchert Blatt 9
Ingo Melzer  

[c]



Allgemeine Informatik I (WS 1998/99)


Abgabetermin 13. Januar 1999

10 Traveling Santa Claus (10 Punkte)

Wie jedes Jahr darf unser lieber Weihnachtsmann eine Menge von Geschenken verteilen[*]. Da dies mit viel Arbeit verbunden ist, ist er auf der Suche nach einem kurzen Weg. Um ihm zu helfen, schreiben Sie ein Programm, das zuerst eine Wegmatrix liest (ein Array, wobei m[i][j] die Länge des Weges von i nach j enthält) und dann nach folgendem Algorithmus einen Weg sucht. Die Rentiere sind auf Punkt 1 geparkt, daher beginnt die Reise dort und sie sollte an diesem Punkt auch wieder aufhören. Nachdem Santa ein Geschenk verteilt hat (was er an jedem Punkt genau einmal macht), möchte er schnell wieder eines verschenken. Daher wählt er immer den nächstgelegenen Ort, den er noch nicht besucht hat. Gibt es mehrere solche Orte, so wird der Ort mit der niedrigsten Nummer gewählt, da liebe Kinder kleinere Zahlen haben.

11 Die Zeit Vergeht (10 Punkte)

Da Santa oft schon für die Zukunft plant, braucht er auch noch ein Programm, das ihm die Anzahl der Tage bis zu einem gegebenen Datum in der Zukunft sagt. Ergänzen Sie daher das folgende Programm, das auch auf dem FTP-Server liegt, für ihn. Das importierte Modul Calendar verwendet Records. Es reicht für diese Aufgabe, daß Sie wissen, dass für jede Variable vom Typ Calendarday name.day, name.month und name.year zur Verfügung steht. Diese können Sie als normale Variablen betrachten.

MODULE timediff;

   FROM Calendar IMPORT CurrentTime, ConvertTime, ConvertDate, Calendarday,
      Date, Day, Daytime, Month;
   FROM InOut IMPORT ReadCard, WriteInt, WriteCard, WriteLn, WriteString;

   VAR date: Date;
      daytime: Daytime;
      today, future: Calendarday;
      tmp: CARDINAL;

PROCEDURE calcdays(today, future: Calendarday):INTEGER;
   (* Add some lines here *)
END calcdays;

BEGIN
   ConvertTime(CurrentTime(), date, daytime);
   ConvertDate(date, today);
   WriteString("Bitte Tag eingeben: "); ReadCard(tmp); future.day := tmp;
   WriteString("Bitte Monat eingeben: "); ReadCard(tmp); future.month := tmp;
   WriteString("Bitte Jahr eingeben: "); ReadCard(future.year);
   WriteString("Heute ist: ");
   WriteCard(today.day,0); WriteCard(today.month,3); WriteCard(today.year,5);
   WriteString(" Von heute bis zu Ihrem Wunschtag sind es nur ");
   WriteInt(calcdays(today, future), 0);
   WriteString(" Tage");
   WriteLn;
END timediff.


Footnotes

...verteilen
Siehe auch http://www.mathematik.uni-ulm.se/sai/melzer/santa.html.



Ingo Melzer 12/15/1998