Einführung in die imperative Programmierung

WS 2017/18

Hauptklausur 2014 Aufg4

function blattmax1(inWurzel: tRefBinBaum; inMax: integer): boolean;
{berechnet, ob jedes Blatt größer ist als alle Knoten auf dem Pfad zu ihm}
{nil-Knoten werden nicht besucht}
  var 
    maximum_bisher: integer;
    erg_links,erg_rechts:boolean;
begin
  if (inWurzel^.links=nil) and (inWurzel^.rechts=nil) then
  {Blatt}
  begin
    if inWurzel^.info>inMax then
      blattmax1:=true
    else
      blattmax1:= false;
  end
  else
  {innerer Knoten}
  begin
    maximum_bisher:=inMax;
    erg_links:=true;
    erg_rechts:=true;
    if inWurzel^.info> inMax then
      maximum_bisher:= inWurzel^.info;
    if inWurzel^.links<>nil then
      erg_links:= blattmax1(inWurzel^.links,maximum_bisher); 
    if inWurzel^.rechts<>nil then
      erg_rechts:= blattmax1(inWurzel^.rechts,maximum_bisher); 
    blattmax1:=erg_links and erg_rechts;
   
  end;
end;
   
function blattmax2(inWurzel: tRefBinBaum; inMax: integer): boolean;
{berechnet, ob jedes Blatt größer ist als alle Knoten auf dem Pfad zu ihm}
{auch nil-Knoten werden besucht}
  var maximum_bisher: integer;
begin
  if inWurzel= nil then
  {lerer Knoten, liefert true, weil die Bedingung nicht verletzt wird}
    blattmax2:=true
  else
    if (inWurzel^.links=nil) and (inWurzel^.rechts=nil) then
    {Blatt}
    begin
      if inWurzel^.info>inMax then
        blattmax2:=true
      else
        blattmax2:= false;
    end
    else
    {innerer Knoten}
    begin
      maximum_bisher:=inMax;
      if inWurzel^.info> inMax then
        maximum_bisher:= inWurzel^.info;
        blattmax2:= blattmax2(inWurzel^.links,maximum_bisher) and blattmax2(inWurzel^.rechts,maximum_bisher);
    end;
end;
   

Nachklausur 2011 Aufg4

 

program liste (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;
 writeln;
 end;
 
 procedure umdrehen(var ioListe:tRefListe);
 var hilfszeiger,vorheriger,naechster:tRefListe;
 begin
 hilfszeiger:= ioListe;
 vorheriger:=nil;
 while hilfszeiger<>nil do
 begin
 naechster:= hilfszeiger^.next;
 hilfszeiger^.next:= vorheriger;
 vorheriger:= hilfszeiger;
 hilfszeiger:=naechster;
 end;
 ioListe:= vorheriger;
 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);
 
 umdrehen(listenanfang);
 
 alleDrucken(listenanfang);
 
 END.

Nachklausur 2011 Aufg5 (verschiedene Versionen)

 

function gefunden(inWurzel: tRefBinBaum; inZahl: integer) : boolean;
   {findet Wert in binärem Baum, kein Suchbaum}
   {bricht Suche ab, wenn gefunden}
   begin
 gefunden:=false;
 if inWurzel<>nil then
 if inWurzel^.Wert=inZahl then
 gefunden:= true
 else
 gefunden:= gefunden(inWurzel^.links,inZahl)
 or gefunden(inWurzel^.rechts,inZahl); 
 end;
function gefunden(inWurzel: tRefBinBaum; inZahl: integer) : boolean;
   {findet Wert in binärem Baum, kein Suchbaum}
   {bricht Suche nicht ab, wenn gefunden, weniger effizient}
   begin
   gefunden:=false;
   if inWurzel<>nil then
   if (inWurzel^.Wert=inZahl) or gefunden(inWurzel^.links,inZahl)
   or gefunden(inWurzel^.rechts,inZahl) then
   gefunden:= true
   end;
function gefunden(inWurzel: tRefBinBaum; inZahl: integer) : boolean;
   {findet Wert in binärem Baum, kein Suchbaum}
   {bricht Suche nicht ab, wenn gefunden, weniger effizient}
   begin
   gefunden:=false;
   if inWurzel<>nil then
   gefunden:= (inWurzel^.Wert=inZahl) or gefunden(inWurzel^.links,inZahl)
   or gefunden(inWurzel^.rechts,inZahl)
   end;
 

Hauptklausur 2010 Aufg2

 

program rom;
type 
tRoemZiff = (I, V, X, L, C, D, M, Q);
tRefRoemZahlStelle = ^tRoemZahlStelle;
tRoemZahlStelle = record
                    ziffer: tRoemZiff;
                    links: tRefRoemZahlStelle;
                  end;
      
var 
liste,neu,alt: tRefRoemZahlStelle;
eingabe: tRoemZiff;
function RoemZiffWert(inZiff: tRoemZiff): integer;
begin
  if inZiff=I then 
    RoemZiffWert:=1
  else if  inZiff=V then 
    RoemZiffWert:=5
  else if  inZiff=X then 
    RoemZiffWert:=10
  else if  inZiff=L then 
    RoemZiffWert:=50
  else if  inZiff=C then 
    RoemZiffWert:=100 
  else if  inZiff=D then 
    RoemZiffWert:=500
  else if  inZiff=M then 
    RoemZiffWert:=1000 
  else 
    RoemZiffWert:=0; 
end;
function RoemZahlWert(inRoemZahl: tRefRoemZahlStelle): integer;
var
summe:integer;
zeiger: tRefRoemZahlStelle;
begin
  zeiger:= inRoemZahl;
  summe:= RoemZiffWert(zeiger^.ziffer);
  while zeiger^.links<>nil do
  begin
    if RoemZiffWert(zeiger^.links^.ziffer)>= RoemZiffWert(zeiger^.ziffer) then
      summe:= summe+ RoemZiffWert(zeiger^.links^.ziffer)
    else 
      summe:= summe- RoemZiffWert(zeiger^.links^.ziffer); 
    zeiger:= zeiger^.links;
  end;
  RoemZahlWert:=summe;
end;
BEGIN
  new(liste);
writeln ('Geben Sie roemische Ziffern ein. Nach jeder Ziffer Return');
writeln('Geben Sie Q zum Beenden ein, alles in Grossbuchstaben');
read(eingabe);
alt:=liste;
liste^.ziffer:=eingabe;
liste^.links:=nil;

read(eingabe);
while (eingabe<>Q)do
begin
new(neu);
neu^.ziffer:=eingabe;
neu^.links:=nil;
alt^.links:=neu;
alt:=neu;
read(eingabe);
end;

writeln(RoemZahlWert(liste)); END.

Hauptklausur 2010 Aufg4

function istMaxHeap(inRefWurzel: tRefKnoten): Boolean;
{ Gibt true zurück, genau dann wenn der Baum ein Max-Heap ist. }
  var linksGroesser, rechtsGroesser: Boolean;
begin
  if inRefWurzel = nil then
  {Der leere Baum ist ein (leerer) Max-Heap, da er keinen Knoten
  mit größerem Kind enthält.}
    istMaxHeap := true
  else
  begin
  {Untersuchung des Wurzelknotens und seiner Kinder}
    if inRefWurzel^.links = nil then
      linksGroesser := false
    else
      linksGroesser := inRefWurzel^.links^.info > inRefWurzel^.info;
    if inRefWurzel^.rechts = nil then
      rechtsGroesser := false
    else
      rechtsGroesser := inRefWurzel^.rechts^.info > inRefWurzel^.info;
    {Führen Sie hier die Funktion geeignet weiter!}
    if linksGroesser or rechtsGroesser then
      istMaxHeap:=false
    else
      istMaxHeap:= istMaxHeap(inRefWurzel^.links) and istMaxHeap(inRefWurzel^.rechts); 
  end;
end;
 

Nachklausur 2011 Aufg2

program zinsen;
  var 
  betrag:real;
  zinsen, laufzeit,i: integer;
BEGIN
  write('Betrag ');
  readln(betrag);
   
  write('Zinsen ');
  readln(zinsen);
   
  write('Laufzeit ');
  readln(laufzeit);
   
  for i:=1 to laufzeit do
  begin
    betrag:=betrag+zinsen/100*betrag;
    writeln('Nach ',i,' Jahren ', betrag:10:2);
  end;
   
END.