Kurs 1613 „Einführung in die imperative Programmierung

Werbung
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)
Herunterladen