Einführung in die imperative Programmierung

WS 2018/19

 

Aufgabe 1

program testeZeigListMax(input, output);
   { testet die Funktion ZeigListMax }
 type
   tRefListe = ^tListe;
   tListe = record
   info : integer;
   next : tRefListe
   end;
 var
   Liste,
   MaxZeig : tRefListe;
 function ZeigListMax (inRefAnfang : tRefListe) : tRefListe;
   { bestimmt rekursiv einen Zeiger auf das Listenelement mit
   der groessten Zahl }
   var 
   zeiger: tRefListe;
   begin 
   if  inRefAnfang=nil then
   ZeigListMax:= nil
   else
   begin
   zeiger := ZeigListMax(inRefAnfang^.next);
   if zeiger=nil then
   ZeigListMax := inRefAnfang
   else
   if inRefAnfang^.info > zeiger^.info then
   ZeigListMax := inRefAnfang
   else
   ZeigListMax := zeiger;
   
   end; 
   
   end; 
   
   function ZeigListMaxIt (inRefAnfang : tRefListe) : tRefListe;
   { bestimmt rekursiv einen Zeiger auf das Listenelement mit
   der groessten Zahl }
   var zeiger, zeigerMax: tRefListe;
   begin
   zeiger:= inRefAnfang;
   zeigerMax:= inRefAnfang;
   while zeiger<>nil do
   begin
   if zeiger^.info> zeigerMax^.info then
   zeigerMax:= zeiger; 
   zeiger:= zeiger^.next;
   end;
   
   ZeigListMaxIt := zeigerMax;
   end;
   
   procedure LiesListe(var outListe : tRefListe);
   { Liest eine (evtl. leere) Liste ein und gibt deren
   Anfangszeiger outListe zurueck. }
 var
   Anzahl : integer;
   i : integer;
   neueZahl : integer;
   Listenanfang,
   Listenende : tRefListe;
 
 begin
   Listenanfang := nil;
   repeat
   write ('Wie viele Zahlen wollen Sie eingeben? ');
   readln (Anzahl);
   until Anzahl >= 0;
   
   write ('Bitte geben Sie ', Anzahl, ' Zahlen ein: ');
 { Liste aufbauen }
   for i := 1 to Anzahl do
   begin
   read (neueZahl);
   if Listenanfang = nil then
   begin
   new (Listenanfang);
   Listenanfang^.next := nil;
   Listenanfang^.info := neueZahl;
   Listenende := Listenanfang;
   end
   else
   begin
   new (Listenende^.next);
   Listenende := Listenende^.next;
   Listenende^.next := nil;
   Listenende^.info := neueZahl
   end  { if Liste = nil }
   end; { for }
   outListe := Listenanfang;
   writeln
   end; { LiesListe }
 
begin 
   LiesListe (Liste);
   { Die zu testende Funktion wird zweimal aufgerufen, damit tatsaechlich
   ein Fehler auftritt, wenn die Liste durch den Aufruf zerstoert wird. }
   MaxZeig := ZeigListMax (Liste);
   MaxZeig := ZeigListMaxIt (Liste);
   if MaxZeig = nil then
   writeln('Leere Eingabefolge!')
   else
   writeln ('Das Maximum ist ', MaxZeig^.info, '.')
   end. { testeZeigListMax }
 
 

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 (
   inRefWurzel : tRefBinBaum;
   inTiefe : tNatZahl;
   var ioMaxTiefe : tNatZahl);
   { berechnet die Tiefe aller Knoten in einem Binaerbaum, auf
   dessen Wurzel ??RefWurzel zeigt; ??MaxTiefe muss vor dem Aufruf
   mit Null initialisiert sein und liefert die maximale Tiefe }
   
   begin
   if inRefWurzel<>nil then
   begin
   BerechneTiefeUndMaxTiefe(inRefWurzel^.links, inTiefe+1, ioMaxTiefe);
   
   inRefWurzel^.Tiefe := inTiefe;
   if inTiefe> ioMaxTiefe then
   ioMaxTiefe:= inTiefe;
   
   BerechneTiefeUndMaxTiefe(inRefWurzel^.rechts, inTiefe+1, ioMaxTiefe);
   
   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 }
 
 

Anzahl Knoten, Summe usw.

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 (
   inRefWurzel : tRefBinBaum;
   inTiefe : tNatZahl;
   var ioMaxTiefe : tNatZahl);
   { berechnet die Tiefe aller Knoten in einem Binaerbaum, auf
   dessen Wurzel ??RefWurzel zeigt; ??MaxTiefe muss vor dem Aufruf
   mit Null initialisiert sein und liefert die maximale Tiefe }
   
   begin
   if inRefWurzel<>nil then
   begin
   BerechneTiefeUndMaxTiefe(inRefWurzel^.links, inTiefe+1, ioMaxTiefe);
   
   inRefWurzel^.Tiefe := inTiefe;
   if inTiefe> ioMaxTiefe then
   ioMaxTiefe:= inTiefe;
   
   BerechneTiefeUndMaxTiefe(inRefWurzel^.rechts, inTiefe+1, ioMaxTiefe);
   
   end;
end; 
   
   function AnzahlKnoten(inRefWurzel : tRefBinBaum): integer;
   
   begin
   if inRefWurzel=nil then
   AnzahlKnoten:= 0
   else
   begin
   AnzahlKnoten:= 
   AnzahlKnoten(inRefWurzel^.links) + AnzahlKnoten(inRefWurzel^.rechts)+1; 
   end;
   
   end;
   
   function AnzahlBlaetter(inRefWurzel : tRefBinBaum): integer;
   
   begin
   if inRefWurzel=nil then
   AnzahlBlaetter:=0
   else
   begin
   if (inRefWurzel^.links=nil) and (inRefWurzel^.rechts=nil) then
   AnzahlBlaetter:= 1
   else
   begin
   AnzahlBlaetter:= 
   AnzahlBlaetter(inRefWurzel^.links) + AnzahlBlaetter(inRefWurzel^.rechts); 
   end;
   end;
   
   end; 
   
   function Summe(inRefWurzel : tRefBinBaum): integer;
   
   begin
   if inRefWurzel=nil then
   Summe:= 0
   else
   begin
   Summe:= 
   Summe(inRefWurzel^.links) + Summe(inRefWurzel^.rechts)+inRefWurzel^.Info; 
   end;
   
   end; 
   
   function Produkt(inRefWurzel : tRefBinBaum): integer;
   
   begin
   if inRefWurzel=nil then
   Produkt:= 1
   else
   begin
   Produkt:= 
   Produkt(inRefWurzel^.links) * Produkt(inRefWurzel^.rechts)*inRefWurzel^.Info; 
   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);
   
   writeln ('Anzahl Knoten: ', AnzahlKnoten(Wurzel));
   
   writeln ('Anzahl Blätter: ', AnzahlBlaetter(Wurzel));
   
   writeln ('Summe Knoten.Info: ', Summe(Wurzel));
   
   writeln ('Produkt Knoten.Info: ', Produkt(Wurzel));
   
   end. { testeBerechneTiefeUndMaxTiefe }
 

Pascalsches Dreieck

 

program liste (input,output);
 type
 tRefListe = ^tListe;
 tListe = record
 zahl : integer;
 next : tRefListe;
 end;
 
 var 
 listenanfang : tRefListe; 
 zeiger : tRefListe; 
 endeListe , neuzeile: tRefListe;
 
 eingabe : integer;
 
 function Dreieck(inListe:tRefListe):tRefListe;
 { Erzeugt aus einer Reihe des Pascalschen Dreiecks
 die nächste Reihe. }
 
 var neuliste,zeiger,neu: tRefListe;
 
 begin
 zeiger:=inListe;
 new(neuliste);
 neuliste^.zahl := 1;
 neuliste^.next := nil;
 
 while zeiger<>nil do
 begin
 new(neu);
 if zeiger^.next<>nil then
 begin
 neu^.zahl := zeiger^.zahl + zeiger^.next^.zahl;
 neu^.next := neuliste;
 neuliste:= neu;
 end
 else 
 begin
 neu^.zahl := 1;
 neu^.next := neuliste;
 neuliste:= neu;
 end; 
 zeiger:= zeiger^.next;
 end;
 
 Dreieck:= neuliste;
 
 end;
 
 
   procedure alleDrucken(zuDrucken:  tRefListe);
   var
   zeiger: tRefListe;
   begin
   zeiger := zuDrucken;
   while zeiger <> nil do 
   begin
   writeln(zeiger^.zahl);
   zeiger:= zeiger^.next;
   end;
   end;
   BEGIN
   listenanfang := nil;
   writeln('Eingabe der Zahlen, Beenden mit 0'); 
   readln(eingabe);
   while eingabe <> 0 do
   begin
   new(zeiger);
   zeiger^.zahl := eingabe;
   zeiger^.next:=nil;
   if listenanfang = nil then
   listenanfang := zeiger
   else
   endeListe^.next:=zeiger;
   endeListe := zeiger; 
   readln(eingabe);
   end;
   
   alleDrucken(listenanfang);
   
   neuZeile := Dreieck(listenanfang);
   
   alleDrucken(neuZeile);
   
   END.

Fibonacci

 

program Fibonacci;
var i:integer;
function fibo(inZahl: integer): integer;
   begin
   if inZahl=0 then
   fibo := 0
   else 
   if inZahl=1 then
   fibo:=1
   else
   fibo := fibo(inZahl-1) + fibo(inZahl-2);
end;
BEGIN
   readln(i);
   writeln( fibo(i));
   
   END.