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.