Einführung in die imperative Programmierung

WS 2015/16

Maximum (mit zweiter Prozedur)

{$B+} {$R+}
program maximum (input, output);
  uses crt;
      
  var
  zahl1, zahl2, zahl3: integer;
      
  procedure inc(var ioZahl1: integer; var ioZahl2: integer);    
  begin
    ioZahl1 := ioZahl1+1;
    ioZahl2 := ioZahl2+1;
  end;
      
  procedure max(inZahl1 : integer; inZahl2 : integer; var outMax: integer);
    var zahl1: integer;
  begin
    inc(inZahl1, inZahl2);
    if inZahl1 >= inZahl2 then
      outMax := inZahl1
    else 
      outMax := inZahl2;
  end;
BEGIN
  readln(zahl1);
  readln(zahl2); 
      
  zahl3:= 5;
      
  max(zahl1, zahl2, zahl3);
      
  writeln('Maximum: ', zahl3);
  writeln('Zahl1: ', zahl1);
  writeln('Zahl2: ', zahl2);
      
END.


Liste mit Zeigern

program liste2 (input,output);
  type
  tRefListe = ^tListe;
  tListe = record
             zahl : integer;
             next : tRefListe;
  end;
   
  var 
  listenanfang : tRefListe; 
  zeiger : tRefListe; 
  endeListe : tRefListe;
  eingabe : integer;
   
  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;
   
  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);
   
END.


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
    max, zweitmax, i: integer;
   
  begin
    max:= inFeld[1];
    zweitmax := inFeld[2];
    if zweitmax > max then
    begin
     max:= inFeld[2];
     zweitmax := inFeld[1];
    end;
   
    for i:=3 to FELDGROESSE do
      if inFeld[i] > max then
      begin
       zweitmax := max;
       max := inFeld[i];
      end
      else
        if inFeld[i] > zweitmax then
          zweitmax := inFeld[i];
    FeldZweitMax := zweitmax;
  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 4

program TesteSortiereListe(input, output);
  type
  tNatZahl = 0..maxint;
  tRefListe = ^tListe;
  tListe = record
             info : tNatZahl;
             next : tRefListe;
           end;
  var
  RefListe : tRefListe;
  procedure SortiereListe (var ioRefListe : tRefListe);
  { sortiert eine lineare Liste aufsteigend }
      
    var 
    endeSortiert, kandidat, zeiger: tRefListe;    
  
  begin 
    if ioRefListe <> nil then
    begin
    {falls Liste nicht leer}
      if ioRefListe^.next <> nil then
      {Liste hat zweites Element}
      begin 
        endeSortiert := ioRefListe;
        while endeSortiert^.next <> nil do
        begin 
          kandidat :=  endeSortiert^.next;
          if kandidat^.info >= endeSortiert^.info then
            endeSortiert:= kandidat
          else
          begin
            endeSortiert^.next := kandidat^.next;
            if kandidat^.info <= ioRefListe^.info then
            begin
              kandidat^.next := ioRefListe;
              ioRefListe := kandidat;
            end
            else
            begin
              zeiger := ioRefListe;
              while zeiger^.next^.info < kandidat^.info do
                zeiger := zeiger^.next;
              kandidat^.next := zeiger^.next;
              zeiger^.next := kandidat;
            end;
          end; {while}
        end; {if ioRefListe^.next <> nil}
      end;
    end
    else 
      writeln('Liste leer!');
  end;
  procedure Anhaengen(var ioListe : tRefListe; inZahl : tNatZahl);
  { Haengt inZahl an ioListe an }
    var Zeiger : tRefListe;
  begin
    Zeiger := ioListe;
    if Zeiger = nil then
    begin
      new(ioListe);
      ioListe^.info := inZahl;
      ioListe^.next := nil;
    end
    else
    begin
      while Zeiger^.next <> nil do
      Zeiger := Zeiger^.next;
      { Jetzt zeigt Zeiger auf das letzte Element }
      new(Zeiger^.next);
      Zeiger := Zeiger^.next;
      Zeiger^.info := inZahl;
      Zeiger^.next := nil;
    end;
  end;
  procedure ListeEinlesen(var outListe:tRefListe);
  { liest eine durch Leerzeile abgeschlossene Folge von Integer-
  Zahlen ein und speichert diese in der linearen Liste RefListe. }
    var
    Liste : tRefListe;
    Zeile : string;
    Zahl, Code : integer;
  begin
    writeln('Bitte geben Sie die zu sortierenden Zahlen ein.');
    writeln('Beenden Sie Ihre Eingabe mit einer Leerzeile.');
    Liste := nil;
    readln(Zeile);
    val(Zeile, Zahl, Code); { val konvertiert String nach Integer }
    while Code=0 do
    begin
      Anhaengen(Liste, Zahl);
      readln(Zeile);
      val(Zeile, Zahl, Code);
    end; { while }
    outListe := Liste;
  end; { ListeEinlesen }
  procedure GibListeAus(inListe : tRefListe);
  { Gibt die Elemente von inListe aus }
    var Zeiger : tRefListe;
  begin
    Zeiger := inListe;
    while Zeiger <> nil do
    begin
      writeln(Zeiger^.info);
      Zeiger := Zeiger^.next;
    end; { while }
  end; { GibListeAus }
begin
  ListeEinlesen(RefListe);
  SortiereListe(RefListe);
  GibListeAus(RefListe)
end.