Kurs 1613 „Einführung in die imperative Programmierung“ Musterlösung Aufgabe 1 (2+4 Punkte) Gegeben sei das folgende Programm: program WasPassiert(input,output); {Berechnet für zwei Zahlen, größer als 0, das Ergebnis und den Rest der Ganzzahligen Division der größeren durch die kleinere Zahl.} type tNatZahl = 0..maxint; var a:tNatZahl; b:tNatZahl; x:tNatZahl; begin x:=0; writeln('Geben Sie zwei natürliche Zahlen ein: '); readln(a); readln(b); if a<b then begin b:=a+b; a:=b-a; b:=b-a end; while a>=b do begin a:=a-b; x:=x+1 end; writeln('Ergebnis: ',x,' ',a) end. Überlegen Sie sich was das Programm leistet und wie es dabei vorgeht. a) Was gibt das Programm für die Eingaben a=7 und b=2 aus? 'Ergebnis: 3 1 ' Was gibt das Programm für die Eingaben a=3 und b=12 aus? 'Ergebnis: 4 0 ' b) Ergänzen Sie im Programm einen erklärenden Kommentar an der grau eingefärbten Stelle und schreiben Sie eine passende Problemspezifikation: Eingabe: Zwei natürliche Zahlen a und b, wobei beide größer als 0 sind. Ausgabe: Zwei natürliche Zahlen m und r, wobei m größer als 0 ist. Nachbed.: Ist a≥b dann gilt: m = a div b und r = a mod b, sonst ist m = b div a und r = b mod a. Kurs 1613 „Einführung in die imperative Programmierung“ Musterlösung Aufgabe 2 (6 Punkte) program WallisscheProdukt(input,output); {Liest eine natürliche Zahl n ein und berechnet die ersten 2n+1 Faktoren des Wallisschen Produktes.} var n:integer; w:real; i:integer; begin writeln('Geben Sie eine natürliche Zahl ein: '); readln(n); w:=2; for i:=1 to n do w:= w*((2*i)/(2*i-1))*((2*i)/(2*i+1)); writeln(w) end. oder auch … begin writeln('Geben Sie eine natürliche Zahl ein: '); readln(n); w:=2; i:=2; while i<=2n do begin w:= w*((i)/(i-1))*((i)/(i+1)); i:=i+2; end; writeln(w) end. Kurs 1613 „Einführung in die imperative Programmierung“ Musterlösung Aufgabe 3 (6 Punkte) function blaetterGroesser(inWurzel:tRefBinBaum, inAktMax:integer):boolean; {entscheidet, ob die Werte der Blätter des Baumes inWurzel, jeweils größer sind, als alle Werte auf den Pfaden zu ihnen. inAktMax ist das aktuelle Maximum der Werte auf dem Pfad und in diesem Parameter muss beim ersten Aufruf 0 übergeben werden.} var tmpMax:=tNatZahl; begin {wenn der Baum leer ist,...} if inWurzel=nil then blaetterGroesser:=true else begin {wenn es sich um ein Blatt handelt,...} if inWurzel^.links=nil and inWurzel^.rechts=nil then {ist die Bedingung erfüllt, wenn der Wert des Blattes größer als das aktuelle Maximum der Werte auf dem Pfad ist} blaetterGroesser:=(inWurzel^.Wert > inAktMax) else begin {sonst ist die Bedingung erfüllt, wenn beide Teilbäume sie erfüllen} if inWurzel^.Wert > inAktMax then tmpMax:=inWurzel^.Wert else tmpMax:=inAktMax; blaetterGroesser:=blaetterGroesser(inWurzel^.links,tmpMax) and blaetterGroesser(inWurzel^.rechts,tmpMax) end; end; end; Kurs 1613 „Einführung in die imperative Programmierung“ Musterlösung Aufgabe 4 (3+3 Punkte) Eingabedaten für 0 Schleifendurchläufe: / Eingabedaten für 1 Schleifendurchlauf: (5,3) und (4,7) Eingabedaten für 2 Schleifendurchläufe: (8,3) und (3,7)