Einführung in die imperative Programmierung

WS 2018/19

 

Listen

Rotieren einer Liste ( NK2010 Aufg 1)

Umdrehen einer Liste

program liste (input,output);
   type
   tRefElement = ^tElement;
   tElement = record
   zahl : integer;
   next : tRefElement;
   end;
   
   var 
   listenanfang : tRefElement; 
   zeiger : tRefElement; 
   endeListe : tRefElement;
   eingabe : integer;
   
   procedure alleDrucken(zuDrucken:  tRefElement);
   var
   zeiger: tRefElement;
   begin
   writeln('Liste');
   zeiger := zuDrucken;
   while zeiger <> nil do 
   begin
   writeln(zeiger^.zahl);
   zeiger:= zeiger^.next;
   end;
   end;
   
   procedure RotiereListe(var ioRefAnfang: tRefElement);
   { Liste rotieren durch Ändern der Verkettung}
   var 
   zeiger: tRefElement;
   begin
   if (ioRefAnfang<>nil) then
   if (ioRefAnfang^.next <> nil) then
   begin
   {letztes Element finden und next auf erstes umbiegen}
   zeiger:= ioRefAnfang;
   while (zeiger^.next<>nil) do
   zeiger:=zeiger^.next;
   zeiger^.next:= ioRefAnfang; 
 {Anfangszeiger umsetzen}
   ioRefAnfang := ioRefAnfang^.next;
 {Zeiger next des letzten Elements auf nil}
   {zeiger^.next^.next := nil;}
   zeiger:= zeiger^.next;
   zeiger^.next := nil; 
   end; {if (ioRefAnfang<>nil)}
   
   end; {prozedure RotiereListe}
   
   procedure umdrehen(var ioRefAnfang: tRefElement);
   var
   vorher,zeiger,nachher: tRefElement;
   begin
   if (ioRefAnfang<>nil) then
   if (ioRefAnfang^.next <> nil) then
   begin
   zeiger:= ioRefAnfang;
   vorher:= nil;
   nachher:= zeiger^.next;
   while (zeiger<>nil) do
   begin
   zeiger^.next:= vorher;
   vorher:=zeiger;
   zeiger:=nachher;
   if (zeiger<>nil) then
   nachher:= zeiger^.next;
   end;
   ioRefAnfang := vorher;
   
   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);
   
   RotiereListe(listenanfang);

   alleDrucken(listenanfang);
   
   umdrehen(listenanfang);
   
   alleDrucken(listenanfang);
   
   END.
 

Zyklische Listen

Rotieren einer Liste

Einfügen am Anfang oder Ende (NK 2010 Aufg 2)

program liste (input,output);
   type
   tRefElement = ^tElement;
   tElement = record
   zahl : integer;
   next : tRefElement;
   end;
   
   var 
   listenanfang : tRefElement; 
   zeiger : tRefElement; 
   endeListe : tRefElement;
   eingabe : integer;
   
   procedure alleDrucken(zuDrucken:  tRefElement);
   var
   zeiger: tRefElement;
   begin
   writeln('Liste');
   zeiger := zuDrucken;
   if (zuDrucken <> nil) then
   repeat 
   writeln(zeiger^.zahl);
   zeiger:= zeiger^.next;
   until zeiger = zuDrucken 
   end;
   
   procedure RotiereListe(var ioRefAnfang: tRefElement);
   { Liste rotieren durch Ändern der Verkettung}
   var 
   zeiger: tRefElement;
   begin
   if (ioRefAnfang<>nil) then
   if (ioRefAnfang^.next <> nil) then
   begin
   {letztes Element finden und next auf erstes umbiegen}
   zeiger:= ioRefAnfang;
   while (zeiger^.next<>nil) do
   zeiger:=zeiger^.next;
   zeiger^.next:= ioRefAnfang; 
 {Anfangszeiger umsetzen}
   ioRefAnfang := ioRefAnfang^.next;
 {Zeiger next des letzten Elements auf nil}
   {zeiger^.next^.next := nil;}
   zeiger:= zeiger^.next;
   zeiger^.next := nil; 
   end; {if (ioRefAnfang<>nil)}
   
   end; {prozedure RotiereListe}
   
   procedure einfuegen ( inInfo: integer;
   inEinfuegenAmAnfang: Boolean;
   var ioRefAnfang: tRefElement);
   {Fügt ein neues Element mit Info-Wert inInfo in eine zyklische Liste
   ein, auf deren erstes Element ioRefAnfang zeigt.
   Ist inEinfuegenAmAnfang = true, wird am Listenanfang, andernfalls am
   Listenende eingefügt.}
   var
   zeiger,neu:tRefElement;
   
   begin
   if inEinfuegenAmAnfang then
   begin
   {Listenelement anlegen}
   new(neu);
   neu^.zahl:=inInfo;
   
   {next-Zeiger des letzten Elements umbiegen}
   zeiger:= ioRefAnfang;
   while (zeiger^.next <> ioRefAnfang) do
   zeiger := zeiger^.next;
   zeiger^.next := neu;
   
   {next von neuem Element umsetzen}
   neu^.next :=  ioRefAnfang;
   
   {}
   ioRefAnfang := neu; 
   
   end
   else
   begin
   {Listenelement anlegen}
   new(neu);
   neu^.zahl:=inInfo;
   
   {next-Zeiger des letzten Elements umbiegen}
   zeiger:= ioRefAnfang;
   while (zeiger^.next <> ioRefAnfang) do
   zeiger := zeiger^.next;
   zeiger^.next := neu;
   
   {next von neuem Element umsetzen}
   neu^.next :=  ioRefAnfang;
   
   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
   begin
   listenanfang := zeiger;
   zeiger^.next := listenanfang;
   end 
   else
   begin
   endeListe^.next:=zeiger;
   zeiger^.next := listenanfang;
   end;
   endeListe := zeiger; 
   readln(eingabe);
   end;
   
   alleDrucken(listenanfang);
   
   einfuegen(7, true, listenanfang);
   
   einfuegen(8, false, listenanfang);
   
   alleDrucken(listenanfang);
   
   END.

Arrays

Sudoku ( NK2010 Aufg 4)

 

function pruefeTeilfeld(inSudoku: tSudokuFeld;
   inStartZeile, inStartSpalte,
   inEndZeile, inEndSpalte: tZiffer):boolean;
   {Prueft, ob das eingegebene Sudokufeld (inSudoku) innerhalb des durch
   die restlichen vier Parameter definierten Ausschnittes jede der Ziffern
   von 1 bis 9 mindestens einmal enthält.}
   var
   marker:tZifferMarkerFeld;
   i,j:integer;
   begin
   initZifferMarkerFeld(marker);
   
   for i:= inStartSpalte to inEndSpalte do
   for j:= inStartZeile to inEndZeile do
   marker[inSudoku[j,i]] := true;
   
   pruefeTeilfeld:= alleZiffernMarkiert(marker);
   
 {pruefeTeilfeld:= marker[1] and marker[2] ... and marker[9];}
end;
 

Binärer Suchbaum

Umdrehen, Suche von Zahlen aus einem Intervall im Baum, Suche nach einer Zahl

 

program suchbaum (input, output);
   { Binärer Suchbaum }
 type
   tRefBinbaum = ^tBinbaum;
   tBinBaum = record
   Info:integer;
   links,
   rechts : tRefBinBaum;
   end;
   tNatZahl = 0..maxint;
 var
   Wurzel : tRefBinBaum;
   Max : tNatZahl; 
   zahl1,zahl2,ergebnis,tiefe:integer;
   gefunden:boolean; 
   oben,unten:integer;
   
   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 }
 
   procedure inorder(inWurzel: tRefBinBaum);
   begin
   if (inWurzel <> nil) then
   begin
   inorder(inWurzel^.links);
   writeln(inWurzel^.Info);
   inorder(inWurzel^.rechts);
   end;
   end;
   
   procedure umdrehen(inWurzel: tRefBinBaum);
   var
   tausch: tRefBinBaum;
   begin
   if inWurzel<>nil then
   begin
   umdrehen(inWurzel^.links);
   umdrehen(inWurzel^.rechts);
   
   tausch:= inWurzel^.links;
   inWurzel^.links:= inWurzel^.rechts;
   inWurzel^.rechts:= tausch; 
   
   end;
   end;
   
   procedure IntervallSuche(inWurzel: tRefBinBaum; 
   inUnten, inOben: integer);
   begin
   if (inWurzel <> nil) then
   begin
   IntervallSuche(inWurzel^.links,inUnten,inOben);
   
   if ((inWurzel^.Info>= inUnten) and (inWurzel^.Info<=inOben)) then
   writeln(inWurzel^.Info);
   
   IntervallSuche(inWurzel^.rechts,inUnten,inOben); 
   
   end;
   
   end;
   
   procedure IntervallSucheOptimiert(inWurzel: tRefBinBaum; 
   inUnten, inOben: integer);
   begin
   if (inWurzel <> nil) then
   begin
   if (inUnten < inWurzel^.Info) then
   IntervallSucheOptimiert(inWurzel^.links,inUnten,inOben);
   
   if ((inWurzel^.Info>= inUnten) and (inWurzel^.Info<=inOben)) then
   writeln(inWurzel^.Info);
   writeln('besucht: ' , inWurzel^.Info); 
   
   if (inOben > inWurzel^.Info) then
   IntervallSucheOptimiert(inWurzel^.rechts,inUnten,inOben); 
   
   end;
   
   end;
   
   function Suche(inWurzel: tRefBinBaum; inZahl: integer): boolean;
   begin 
   if (inWurzel= nil) then
   Suche:= false
   else
   if (inWurzel^.Info = inZahl) then
   Suche:=true
   else
   if (inWurzel^.Info > inZahl) then
   Suche := Suche(inWurzel^.links, inZahl)
   else
   Suche:= Suche(inWurzel^.rechts, inZahl); 
   end;
   
   function SucheIterativ(inWurzel: tRefBinBaum; inZahl: integer): boolean;
   var
   zeiger: tRefBinBaum;
   gefunden: boolean;
   begin
   zeiger:= inWurzel;
   gefunden:=false;
   while ((zeiger <> nil) and (not gefunden)) do
   begin
   if (zeiger^.Info=inZahl) then
   gefunden:= true;
   if (inZahl < zeiger^.Info) then
   zeiger:= zeiger^.links
   else 
   zeiger:= zeiger^.rechts; 
   end;
   SucheIterativ:=gefunden; 
   
   end;
 
begin
   writeln('Bitte integer-Zahlen eingeben (0=Ende):');
   BBAufbauen (Wurzel);
   writeln('Inorder-Reihenfolge');
   inorder(Wurzel);
   
   {umdrehen(Wurzel);}
   
   {write('unten: ');
   readln(unten);
   write('oben: ');
   readln(oben);
   
   IntervallSucheOptimiert(Wurzel,unten,oben);
   
   writeln('Inorder-Reihenfolge');
   inorder(Wurzel);}
   
   writeln(SucheIterativ(Wurzel, 5));
   
end. { suchbaum }