Einführung in die imperative Programmierung

WS 2018/19

 

Aufgabe 1

program testeFeldZweitMax (input, output);
   { testet die Funktion FeldZweitMax }
 const
   FELDGROESSE = 10;
 type
   tIndex = 1..FELDGROESSE;
   tFeld = array [tIndex] of integer;
 var 
   Feld : tFeld;
   i : integer;
 function FeldZweitMax (var inFeld : tFeld) : integer;
   var
   max1,max2, i, Tausch: integer;
   begin
   max1:= inFeld[1];
   max2:= inFeld[2];
   if max2>max1 then
   begin
   Tausch:= max2;
   max2:=max1;
   max1:=Tausch;
   end;
   for i:=3 to FELDGROESSE do
   begin
   if inFeld[i]> max1 then
   begin
   max2:= max1;
   max1:= inFeld[i];
   end 
   else
   if inFeld[i]> max2 then
   max2:= inFeld[i];
   end;
   FeldZweitMax:= max2;
   
   end;
   
   begin { Testprogramm }
   writeln('Bitte geben Sie ', FELDGROESSE, ' Zahlen ein:');
   for i := 1 to FELDGROESSE do
   read (Feld [i]);
   writeln('Die zweitgroesste Zahl ist ', FeldZweitMax (Feld), '.');
   end. { testeFeldZweitMax }

Aufgabe 2

program testeListenMaxBestimmen (input, output);
   { Testet die Prozedur ListenMaxBestimmen }
 type
   tRefListe = ^tListe;
   tListe = record
   info : integer;
   next : tRefListe
   end;
 var
   Liste : tRefListe;
   Max : integer;
   OK : boolean;
 
 procedure ListenMaxBestimmen ( inRefAnfang: tRefListe; 
   var outMax : integer; 
   var outOK : boolean); 
   var 
   zeiger: tRefListe; 
   
   begin
   if inRefAnfang=nil then
   outOK := false
   else
   outOK := true;
   
   if outOK  then
   begin
   outMax:= inRefAnfang^.info;
   zeiger := inRefAnfang;
   while zeiger^.next<>nil do
   begin
   zeiger:= zeiger^.next;
   if zeiger^.info > outMax then
   outMax := zeiger^.info;
   end;
   end; 
   
   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);
   ListenMaxBestimmen(Liste, Max, OK);
   if OK then 
   writeln ('Das Maximum ist ', Max, '.')
   else
   writeln ('Leere Eingabefolge!');
   end. { testeListenMaxBestimmen } 
 

Aufgabe 3

program TesteAnhaengen (input, output);
   { testet die Prozedur anhaengen }
 type
   tRefListe = ^tListe;
   tListe = record
   info : integer;
   next : tRefListe
   end;
 var 
   Liste1, 
   Liste2,
   Gesamtliste : tRefListe;
 
 procedure anhaengen (    inRefAnfang1,
   inRefAnfang2 : tRefListe;
   var outRefAnfang : tRefListe);
   { Haengt die lineare Liste mit Anfangszeiger inRefAnfang2 an
   die Liste mit Anfangszeiger inRefAnfang1 an.
   Zurueckgegeben wird outRefAnfang, der Anfangszeiger der Ergebnisliste. }
   
   var
   zeiger: tRefListe;
   
   begin
   if inRefAnfang1=nil then
   outRefAnfang := inRefAnfang2
   else 
   if inRefAnfang2=nil then
   outRefAnfang := inRefAnfang1
   else
   begin
   {bewege zeiger zum letzten Element der 1. Liste}
   zeiger := inRefAnfang1;
   while zeiger^.next<> nil do
   zeiger:= zeiger^.next;
   
   {Hänge 2. List an}
   zeiger^.next := inRefAnfang2; 
   outRefAnfang := inRefAnfang1;
   end;
   
   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 }
 
 procedure gibListeAus (inListe : tRefListe);
   { gibt die Liste mit Anfangszeiger inListe aus }
   var
   ListenElement : tRefListe;
   begin
   ListenElement := inListe;
   while ListenElement <> nil do
   begin
   write(ListenElement^.info, ' ');
   ListenElement := ListenElement^.next;
   end;
   writeln;
   end; { gibListeAus }
 
begin { testeAnhaengen }
   writeln('Bitte geben Sie die erste Liste ein! ');
   LiesListe (Liste1);
   writeln;
 writeln('Bitte geben Sie die zweite Liste ein! ');
   LiesListe (Liste2);
   writeln;
 writeln('Die konkatenierte Liste lautet: ');
   Anhaengen (Liste1, Liste2, Gesamtliste);
   GibListeAus (Gesamtliste);
   end. { TesteAnhaengen }
 

Liste Invertieren

program ListeInvertieren (input, output);
   { Testet die Prozedur ListenMaxBestimmen }
 type
   tRefListe = ^tListe;
   tListe = record
   info : integer;
   next : tRefListe
   end;
 var
   Liste : tRefListe;
   Max : integer;
   OK : boolean;
   
   procedure Invertieren( var ioRefAnfang: tRefListe);
 var 
   aktuell, vorheriges, naechstes:  tRefListe;
   
   begin
   if ioRefAnfang<>nil then
   begin
   aktuell:= ioRefAnfang;
   vorheriges:= nil;
   naechstes:= aktuell^.next;
   aktuell^.next:= vorheriges;
   while naechstes<>nil do
   begin
   vorheriges := aktuell;
   aktuell:= naechstes;
   naechstes:= naechstes^.next;
   aktuell^.next:= vorheriges;
   
   end;
   
   ioRefAnfang := aktuell;
   
   end; 
   
   end; 
   
   procedure gibListeAus (inListe : tRefListe);
   { gibt die Liste mit Anfangszeiger inListe aus }
   var
   ListenElement : tRefListe;
   begin
   ListenElement := inListe;
   while ListenElement <> nil do
   begin
   write(ListenElement^.info, ' ');
   ListenElement := ListenElement^.next;
   end;
   writeln;
   end; { gibListeAus }
 
 procedure ListenMaxBestimmen ( inRefAnfang: tRefListe; 
   var outMax : integer; 
   var outOK : boolean); 
   var 
   zeiger: tRefListe; 
   
   begin
   if inRefAnfang=nil then
   outOK := false
   else
   outOK := true;
   
   if outOK  then
   begin
   outMax:= inRefAnfang^.info;
   zeiger := inRefAnfang;
   while zeiger^.next<>nil do
   begin
   zeiger:= zeiger^.next;
   if zeiger^.info > outMax then
   outMax := zeiger^.info;
   end;
   end; 
   
   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);
   
   Invertieren(Liste);
   
   gibListeAus(Liste);
   
   end. { testeListenMaxBestimmen }