Einführung
in die imperative Programmierung
WS 2014/15
Fakultät rekursiv
program fakultaet;
uses crt;
var
n,
erg : integer;
function fak(n: integer) : integer;
begin
if (n=0) then
fak := 1
else
fak:= fak(n-1) * n;
end;
BEGIN
readln(n);
erg := fak(n);
writeln(erg);
END.
Fibonacci rekursiv
program fibo;
uses crt;
var
n,
erg : integer;
function fibo(n: integer) : integer;
begin
if (n=0) then
fibo := 0
else
if (n=1) then
fibo:=1
else
fibo:= fibo(n-1) + fibo(n-2);
end;
BEGIN
readln(n);
erg := fibo(n);
writeln(erg);
END.
Fibonacci Iterativ
program fibo_iterativ;
uses crt;
var
n,erg : integer;
function fibo(n: integer) : integer;
var
i,
erg1, erg2, hilf : integer;
begin
if (n<2) then
fibo := n
else
begin
erg1 := 0; erg2:=1;
for i:=2 to n do
begin
hilf:=erg2;
erg2 := erg1 + erg2;
erg1:= hilf;
end;
fibo := erg2;
end;
end;
BEGIN
readln(n);
erg := fibo(n);
writeln(erg);
END.
Forward Deklaration
program forward;
uses crt;
var i : integer;
function b(i: integer) : string; forward;
function a(i: integer) : string;
begin
if (i=0) then
a:= ''
else
a := b(i-1) + 'a';
end;
function b(i: integer) : string;
begin
if (i=0) then
b:= ''
else
b := a(i-1) + 'b';
end;
BEGIN
readln(i);
writeln(a(i));
END.
Türme von Hanoi
program hanoi (input, output);
var n: integer;
procedure han(n:integer; von,ueber,nach: string);
begin
if (n=1) then
writeln(von,'->',nach)
else
begin
han(n-1,von,nach,ueber);
writeln(von,'->',nach);
han(n-1,ueber,von,nach);
end;
end;
procedure hanoi(n: integer);
begin
han(n, 'A','B','C');
end;
begin
readln(n);
hanoi(n);
end.
inorder preorder
program preorderinorder (input, output);
type
tNatZahl = 0..maxint;
tRefBinBaum = ^tBinBaum;
tBinBaum = record
info : integer;
links : tRefBinBaum;
rechts : tRefBinBaum;
end;
var
Wurzel : tRefBinBaum;
Anzahl : integer;
procedure inorder (
inRefWurzel : tRefBinBaum) ;
{ bestimmt die Anzahl der Knoten des Binaerbaumes,
auf dessen Wurzel inRefWurzel zeigt }
begin
if (inRefWurzel <> nil) then
begin
inorder(inRefWurzel^.links);
writeln(inRefWurzel^.info);
inorder(inRefWurzel^.rechts);
end;
end;
procedure preorder (
inRefWurzel : tRefBinBaum) ;
{ bestimmt die Anzahl der Knoten des Binaerbaumes,
auf dessen Wurzel inRefWurzel zeigt }
begin
if (inRefWurzel <> nil) then
begin
writeln(inRefWurzel^.info);
preorder(inRefWurzel^.links);
preorder(inRefWurzel^.rechts);
end;
end;
procedure BBKnotenEinfuegen (
inZahl : integer;
var ioWurzel : tRefBinBaum);
{ fuegt in den Suchbaum, auf dessen Wurzel ioWurzel
zeigt, ein Blatt mit Wert inZahl an. }
var
Zeiger : tRefBinBaum;
begin
if ioWurzel = nil then
begin
new (Zeiger);
Zeiger^.Info := inZahl;
Zeiger^.links := nil;
Zeiger^.rechts := nil;
ioWurzel := Zeiger
end { if }
else { ioWurzel <> nil }
if inZahl < ioWurzel^.info then
BBKnotenEinfuegen (inZahl, ioWurzel^.links)
else
BBKnotenEinfuegen (inZahl, ioWurzel^.rechts);
end; { BBKnotenEinfuegen }
procedure BBAufbauen (var outWurzel : tRefBinBaum);
{ Liest eine Folge von Integer-Zahlen ein (0 beendet die
Eingabe, gehoert aber nicht zur Folge) und speichert
die Folge in einem binren Suchbaum. }
var
Zahl : integer;
begin
outWurzel := nil; { mit leerem Baum initialisieren }
read (Zahl);
while Zahl <> 0 do
begin
BBKnotenEinfuegen (Zahl, outWurzel);
read (Zahl)
end
end; { BBAufbauen }
begin
writeln('Bitte integer-Zahlen eingeben (0=Ende):');
BBAufbauen (Wurzel);
writeln();
writeln('Baum in preorder-Folge');
preorder (Wurzel);
writeln();
writeln('Baum in inorder-Folge');
inorder (Wurzel);
end. { TesteBBKnotenzahl }
Aufgabe 2
program TesteBBKnotenzahl (input, output);
type
tNatZahl = 0..maxint;
tRefBinBaum = ^tBinBaum;
tBinBaum = record
info : integer;
links : tRefBinBaum;
rechts : tRefBinBaum;
end;
var
Wurzel : tRefBinBaum;
Anzahl : integer;
function BBKnotenzahl (
inRefWurzel : tRefBinBaum) : tNatZahl;
{ bestimmt die Anzahl der Knoten des Binaerbaumes,
auf dessen Wurzel inRefWurzel zeigt }
var anz: integer;
begin
if (inRefWurzel <> nil) then
begin
anz:=1;
anz:= anz+ BBKnotenzahl(inRefWurzel^.links) + BBKnotenzahl(inRefWurzel^.rechts);
end;
{else anz:=0;}
BBKnotenzahl:= anz;
end;
procedure BBKnotenEinfuegen (
inZahl : integer;
var ioWurzel : tRefBinBaum);
{ fuegt in den Suchbaum, auf dessen Wurzel ioWurzel
zeigt, ein Blatt mit Wert inZahl an. }
var
Zeiger : tRefBinBaum;
begin
if ioWurzel = nil then
begin
new (Zeiger);
Zeiger^.Info := inZahl;
Zeiger^.links := nil;
Zeiger^.rechts := nil;
ioWurzel := Zeiger
end { if }
else { ioWurzel <> nil }
if inZahl < ioWurzel^.info then
BBKnotenEinfuegen (inZahl, ioWurzel^.links)
else
BBKnotenEinfuegen (inZahl, ioWurzel^.rechts);
end; { BBKnotenEinfuegen }
procedure BBAufbauen (var outWurzel : tRefBinBaum);
{ Liest eine Folge von Integer-Zahlen ein (0 beendet die
Eingabe, gehoert aber nicht zur Folge) und speichert
die Folge in einem binren Suchbaum. }
var
Zahl : integer;
begin
outWurzel := nil; { mit leerem Baum initialisieren }
read (Zahl);
while Zahl <> 0 do
begin
BBKnotenEinfuegen (Zahl, outWurzel);
read (Zahl)
end
end; { BBAufbauen }
begin
writeln('Bitte integer-Zahlen eingeben (0=Ende):');
BBAufbauen (Wurzel);
{ 2 mal aufrufen wie bei Aufg. 1 }
Anzahl := BBKnotenzahl (Wurzel);
Anzahl := BBKnotenzahl (Wurzel);
writeln ('Der Baum hat ', Anzahl, ' Knoten.');
end. { TesteBBKnotenzahl }
Aufgabe 2 Alternative
program TesteBBKnotenzahl (input, output);
type
tNatZahl = 0..maxint;
tRefBinBaum = ^tBinBaum;
tBinBaum = record
info : integer;
links : tRefBinBaum;
rechts : tRefBinBaum;
end;
var
Wurzel : tRefBinBaum;
Anzahl : integer;
function BBKnotenzahl (
inRefWurzel : tRefBinBaum) : tNatZahl;
{ bestimmt die Anzahl der Knoten des Binaerbaumes,
auf dessen Wurzel inRefWurzel zeigt }
begin
if (inRefWurzel = nil) then
BBKnotenzahl:=0
else
BBKnotenzahl:= 1 + BBKnotenzahl(inRefWurzel^.links) + BBKnotenzahl(inRefWurzel^.rechts);
end;
procedure BBKnotenEinfuegen (
inZahl : integer;
var ioWurzel : tRefBinBaum);
{ fuegt in den Suchbaum, auf dessen Wurzel ioWurzel
zeigt, ein Blatt mit Wert inZahl an. }
var
Zeiger : tRefBinBaum;
begin
if ioWurzel = nil then
begin
new (Zeiger);
Zeiger^.Info := inZahl;
Zeiger^.links := nil;
Zeiger^.rechts := nil;
ioWurzel := Zeiger
end { if }
else { ioWurzel <> nil }
if inZahl < ioWurzel^.info then
BBKnotenEinfuegen (inZahl, ioWurzel^.links)
else
BBKnotenEinfuegen (inZahl, ioWurzel^.rechts);
end; { BBKnotenEinfuegen }
procedure BBAufbauen (var outWurzel : tRefBinBaum);
{ Liest eine Folge von Integer-Zahlen ein (0 beendet die
Eingabe, gehoert aber nicht zur Folge) und speichert
die Folge in einem binren Suchbaum. }
var
Zahl : integer;
begin
outWurzel := nil; { mit leerem Baum initialisieren }
read (Zahl);
while Zahl <> 0 do
begin
BBKnotenEinfuegen (Zahl, outWurzel);
read (Zahl)
end
end; { BBAufbauen }
begin
writeln('Bitte integer-Zahlen eingeben (0=Ende):');
BBAufbauen (Wurzel);
{ 2 mal aufrufen wie bei Aufg. 1 }
Anzahl := BBKnotenzahl (Wurzel);
Anzahl := BBKnotenzahl (Wurzel);
writeln ('Der Baum hat ', Anzahl, ' Knoten.');
end. { TesteBBKnotenzahl }
Aufgabe 3
program testeBerechneTiefeUndMaxTiefe (input, output);
{ testet die Prozedur BerechneTiefeUndMaxTiefe }
type
tRefBinbaum = ^tBinbaum;
tBinBaum = record
Info,
Tiefe : integer;
links,
rechts : tRefBinBaum;
end;
tNatZahl = 0..maxint;
var
Wurzel : tRefBinBaum;
Max : tNatZahl;
procedure BerechneTiefeUndMaxTiefe (inWurzel: tRefBinbaum; instufe: integer;
var ioMax: integer);
begin
if (inWurzel <> nil) then
begin
inWurzel^.Tiefe:= instufe;
if ( ioMax < instufe) then
ioMax := instufe;
BerechneTiefeUndMaxTiefe(inWurzel^.links, instufe+1, ioMax);
BerechneTiefeUndMaxTiefe(inWurzel^.rechts, instufe+1, ioMax);
end;
end;
procedure BBKnotenEinfuegen (
inZahl : integer;
var ioWurzel : tRefBinBaum);
{ fuegt in den Suchbaum, auf dessen Wurzel ioWurzel
zeigt, ein Blatt mit Wert inZahl an. }
var
Zeiger : tRefBinBaum;
begin
if ioWurzel = nil then
begin
new (Zeiger);
Zeiger^.Info := inZahl;
Zeiger^.links := nil;
Zeiger^.rechts := nil;
Zeiger^.Tiefe := 0;
ioWurzel := Zeiger
end { if }
else { ioWurzel <> nil }
if inZahl < ioWurzel^.info then
BBKnotenEinfuegen (inZahl, ioWurzel^.links)
else
BBKnotenEinfuegen (inZahl, ioWurzel^.rechts);
end; { BBKnotenEinfuegen }
procedure BBAufbauen (var outWurzel : tRefBinBaum);
{ Liest eine Folge von Integer-Zahlen ein (0 beendet die
Eingabe, gehoert aber nicht zur Folge) und speichert
die Folge in einem binren Suchbaum. }
var
Zahl : integer;
begin
outWurzel := nil; { mit leerem Baum initialisieren }
read (Zahl);
while Zahl <> 0 do
begin
BBKnotenEinfuegen (Zahl, outWurzel);
read (Zahl)
end
end; { BBAufbauen }
procedure BaumAusgeben(inWurzel : tRefBinBaum);
{ Durchlaeuft den Binaerbaum mit Wurzel inWurzel und gibt
die Knoteninhalte und Knotentiefen in preorder-Reihenfolge aus. }
var
Knoten : tRefBinBaum;
begin
if inWurzel <> nil then
begin
write (inWurzel^.info, ':', inWurzel^.Tiefe,' ');
BaumAusgeben (inWurzel^.links);
BaumAusgeben (inWurzel^.rechts);
write('u ');
end; { if }
end; { BaumAusgeben }
begin
writeln('Bitte integer-Zahlen eingeben (0=Ende):');
BBAufbauen (Wurzel);
Max := 0;
BerechneTiefeUndMaxTiefe (Wurzel, 1, Max);
WriteLn('Jetzt wird der Baum in preorder-Reihenfolge durchlaufen und die');
WriteLn('Knoteninhalte in der Form Knoten:Tiefe ausgegeben.');
WriteLn('Um die Knotentiefen kontrollieren zu koennen, wird bei jedem ');
WriteLn('Ruecksprung aus der Prozedur ein "u" ausgegeben.');
BaumAusgeben (Wurzel);
writeln ('Maximale Tiefe: ', Max);
end. { testeBerechneTiefeUndMaxTiefe }