Professor Dr. F. Schweiggert Abteilung Angewandte Informationsverarbeitung
Johannes MayerBlatt 7


[c]



Allg. Informatik für WiWi (WS 2000)


Abgabetermin: 14. Dezember 2000


Beispiellösung

1. Wo haben sich die Fehler versteckt? (7 Punkte)

Im Verzeichnis /www/thales/ftp/pub/vorlesungen/ws00/prog/7 auf dem FTP-Server befinden sich die Dateien GGT.od und GGT.om. Leider haben sich bei beiden Dateien massiv Fehler eingeschlichen. Versuchen Sie, das Programm GGT zu compilieren, und bessern Sie dann jeweils die Fehler aus, die der Compiler meldet. Wiederholen Sie dies solange, bis das Programm compiliert ist. Erklären Sie Ihrem Tutor, was für Fehler in beiden Dateien vorkommen und wie sie behoben werden können.
Lösung:
Verbesserung der Datei GGT.od:

Verbesserung der Datei GGT.om:

2. Berechnung des KGV (7 Punkte)

Das kleinste gemeinsame Vielfache zweier positiver Zahlen erhält man, wenn man das Produkt der beiden Zahlen durch den ggT teilt. D.h.

\begin{displaymath}\mbox{kgV}(x,y) = x \cdot y / \mbox{ggT}(x,y) \end{displaymath}

wobei x und y positive ganze Zahlen seien. Seien also beispielsweise x = 12 und y = 15. Dann ist $\mbox{ggT}(x,y) = \mbox{ggT}(12,15) = 3$und somit ist $\mbox{kgV}(x,y) = \mbox{kgV}(12,15) = 12 \cdot 15 / 3
= 12 \cdot 5 = 60$.

Schreiben sie nun das Programm GGT, das Sie in der vorigen Aufgabe verbessert haben, so um, dass der KGV berechnet wird. (Falls es Ihnen nicht gelungen ist, alle Fehler in der vorigen Aufgabe zu verbessern, so können sie auch die beiden Dateien aus dem Skript abtippen.)
Lösung:
In der Definitionsdatei muss nur der Name GGT in KGV geändert werden.

DEFINITION KGV;
(* Bestimmung des kleinsten gemeinsamen
 * Vielfachen zweier positiver ganzer Zahlen
 *)
END KGV.
In der Moduldatei muss ebenfalls der Name von GGT in KGV geändert werden. Zudem speichern wir die Eingabe vor der Berechnung des ggT in den Variablen x0 und y0. Nach der Berechnung des ggT berechnen wir den kgV nach der angegebenen Formel.
MODULE KGV;
   IMPORT Read, Write, Streams;
   (* Read: Modul mit Funktionen zum Lesen von der 
    * Standardeingabe
    * Write: Modul mit Funktionen zum schreiben auf 
    * Standardausgabe / Diagnoseausgabe
    * Streams: Definition von stdin, stdout, stderr
    *)

   VAR x,y,x0,y0,ggt,kgv: INTEGER;

BEGIN
   Write.String("Bestimmung des KGV:"); Write.Ln;
   Write.String("Bitte erste pos. ganze Zahl: ");
   Read.Int(x); Write.Ln;
   Write.String("Bitte zweite pos. ganze Zahl: ");
   Read.Int(y); Write.Ln;

   (* urspruengliche Zahlen speichern *)
   x0 := x; y0 := y;

   IF (x>0) & (y>0) THEN

      (* ggT berechnen *)

      WHILE x # y DO
         IF x > y THEN
            x := x-y
         ELSE
            (*hier: y>x*)
            y := y-x
         END
      END;

      (* GGT der urspruenglichen Zahlen ist nun
       * gleich x bzw. y
       *)

      ggt := x; (* gleichbedeutend mit ggt := y; *)

      kgv := x0 * (y0 DIV ggt);

      Write.String("kgV = "); 
      Write.Int(kgv, 4); 
      Write.Ln;
   ELSE
      Write.StringS(Streams.stderr, 
                    "fehlerhafte Eingabe!!!");
      Write.LnS(Streams.stderr);
   END;
END KGV.


Johannes Mayer, 2000-12-06