Einführung
in die imperative Programmierung
WS 2016/17
Klausuraufgabe HK10 Aufgabe 1
program aufg1;
type
tRefListe=^tListe;
tListe=record
Wert:integer;
next:tRefListe
end;
var kopf,zeiger,neu,umgedreht: tRefListe;
procedure anzeigen(inKopf : tRefListe);
var zeiger: tRefListe;
begin
zeiger:=inKopf;
while zeiger<>nil do
begin
write(zeiger^.Wert, ' ');
zeiger:= zeiger^.next;
end;
writeln();
end;
procedure NachVorn(inWert: integer; var ioRefAnfang: tRefListe);
var
vor,lauf: tRefListe;
begin
vor:=nil;
lauf:=ioRefAnfang;
while lauf^.Wert<>inWert do
begin
vor:=lauf;
lauf:= lauf^.next;
end;
if vor<>nil then
begin
vor^.next:= lauf^.next;
lauf^.next:=ioRefAnfang;
ioRefAnfang:= lauf;
end;
end;
BEGIN
new(neu);
neu^.Wert:=7;
neu^.next:=nil;
zeiger:= neu;
kopf:=neu;
new(neu);
neu^.Wert:=3;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
new(neu);
neu^.Wert:=5;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
new(neu);
neu^.Wert:=3;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
new(neu);
neu^.Wert:=1;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
anzeigen(kopf);
NachVorn(1, kopf);
anzeigen(kopf);
END.
Klausuraufgabe HK10 Aufgabe 2
program aufg2;
type tRoemZiff = (I, V, X, L, C, D, M);
tRefRoemZahlStelle = ^tRoemZahlStelle;
tRoemZahlStelle = record
ziffer: tRoemZiff;
links: tRefRoemZahlStelle;
end;
var
neu,zeiger,kopf: tRefRoemZahlStelle;
procedure anzeigen(inKopf: tRefRoemZahlStelle);
var
lauf:tRefRoemZahlStelle;
begin
lauf:= inKopf;
while lauf<>nil do
begin
write(lauf^.ziffer);
lauf:= lauf^.links;
end;
writeln();
end;
function RoemZiffWert(inZiff: tRoemZiff): integer;
{Gibt den Wert einer römischen Ziffer zurück,
z.B. RoemZiffWert(L)=50.}
begin
case inZiff of
I: RoemZiffWert:=1;
V: RoemZiffWert:=5;
X: RoemZiffWert:=10;
L: RoemZiffWert:=50;
C: RoemZiffWert:=100;
D: RoemZiffWert:=500;
M: RoemZiffWert:=1000;
end;
end;
function RoemZahlWert(inRoemZahl: tRefRoemZahlStelle): integer;
var
kopf,next:tRefRoemZahlStelle;
sum:integer;
begin
sum:=0;
kopf:=inRoemZahl;
while kopf<>nil do
begin
next:=kopf^.links;
if next<>nil then
begin
if kopf^.ziffer > next^.ziffer then
begin
sum:= sum + RoemZiffWert(kopf^.ziffer)-RoemZiffWert(next^.ziffer);
kopf:=next^.links;
end
else
begin
sum:= sum + RoemZiffWert(kopf^.ziffer);
kopf:=next;
end;
end;
end;
sum:= sum + RoemZiffWert(kopf^.ziffer);
RoemZahlWert:= sum;
end;
{
function RoemZahlWert(inRoemZahl: tRefRoemZahlStelle): integer;
var
zahl: tRefRoemZahlStelle;
sum:integer;
begin
zahl:= inRoemZahl;
sum:= RoemZiffWert(zahl^.ziffer);
while zahl^.links<>nil do
begin
if zahl^.links^.ziffer < zahl^.ziffer then
begin
sum:= sum - RoemZiffWert(zahl^.links^.ziffer);
zahl:= zahl^.links;
end
else
begin
sum:= sum + RoemZiffWert(zahl^.links^.ziffer);
zahl:= zahl^.links;
end;
end;
RoemZahlWert:= sum;
end;
}
{
function RoemZahlWert(inRoemZahl: tRefRoemZahlStelle): integer;
var
lauf: tRefRoemZahlStelle;
sum,alt:integer;
begin
alt:=0;
sum:=0;
lauf:= inRoemZahl;
while lauf<>nil do
begin
if RoemZiffWert(lauf^.ziffer) < alt then
sum := sum - RoemZiffWert(lauf^.ziffer)
else
sum := sum + RoemZiffWert(lauf^.ziffer);
alt:= RoemZiffWert(lauf^.ziffer);
lauf:= lauf^.links;
end;
RoemZahlWert:=sum;
end;
}
BEGIN
new(neu);
neu^.ziffer:=X;
neu^.links:=nil;
zeiger:= neu;
kopf:=neu;
new(neu);
neu^.ziffer:=I;
neu^.links:=nil;
zeiger^.links:= neu;
zeiger:=neu;
new(neu);
neu^.ziffer:=C;
neu^.links:=nil;
zeiger^.links:= neu;
zeiger:=neu;
new(neu);
neu^.ziffer:=X;
neu^.links:=nil;
zeiger^.links:= neu;
zeiger:=neu;
new(neu);
neu^.ziffer:=M;
neu^.links:=nil;
zeiger^.links:= neu;
zeiger:=neu;
new(neu);
neu^.ziffer:=C;
neu^.links:=nil;
zeiger^.links:= neu;
zeiger:=neu;
anzeigen(kopf);
writeln('Wert: ',RoemZahlWert(kopf));
END.
Klausuraufgabe HK10 Aufgabe 4
program aufg4;
type
tRefKnoten = ^tKnoten;
tKnoten = record
info: integer;
links,
rechts:tRefKnoten
end;
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;
if rechtsGroesser or linksGroesser then
istMaxHeap:= false
else
istMaxHeap:= istMaxHeap(inRefWurzel^.links) and istMaxHeap(inRefWurzel^.rechts);
end;
BEGIN
END.
Klausuraufgabe NK11 Aufgabe 4
program aufg4;
type
tRefListe=^tListe;
tListe=record
Wert:integer;
next:tRefListe
end;
var kopf,zeiger,neu,umgedreht: tRefListe;
procedure ListeUmdrehen(var ioKopf: tRefListe);
var
lauf,vor,nach: tRefListe;
begin
if ioKopf<>nil then
begin
vor:=ioKopf;
lauf:=vor^.next;
if lauf<>nil then
begin
nach:= lauf^.next;
while (lauf<>nil) do
begin
lauf^.next:= vor;
vor:=lauf;
lauf:= nach;
if nach<>nil then
nach:=nach^.next;
end;
ioKopf^.next:=nil;
ioKopf:= vor;
end
else
begin
lauf^.next:= vor;
vor^.next:=nil;
ioKopf:= lauf;
end;
end;
end;
procedure ListeUmdrehen2(var ioKopf: tRefListe);
var
lauf,vor,nach: tRefListe;
begin
if ioKopf<>nil then
begin
vor:=nil;
lauf:=ioKopf;
nach:=lauf^.next;
while lauf<>nil do
begin
lauf^.next:=vor;
vor:=lauf;
lauf:=nach;
if nach<>nil then
nach:=nach^.next;
end;
ioKopf:= vor;
end;
end;
procedure anzeigen(inKopf : tRefListe);
var zeiger: tRefListe;
begin
zeiger:=inKopf;
while zeiger<>nil do
begin
write(zeiger^.Wert, ' ');
zeiger:= zeiger^.next;
end;
writeln();
end;
procedure RekUmdrehen(inKopf:tRefListe; var outKopf:tRefListe);
var
rueckgabe: tRefListe;
begin
if inKopf=nil then
outKopf:=nil
else
begin
RekUmdrehen(inKopf^.next, rueckgabe);
if rueckgabe=nil then
begin
inKopf^.next:= nil;
outKopf:= inKopf;
end
else
begin
inKopf^.next^.next:= inKopf;
inKopf^.next:=nil;
outKopf:= rueckgabe;
end;
end;
end;
BEGIN
new(neu);
neu^.Wert:=7;
neu^.next:=nil;
zeiger:= neu;
kopf:=neu;
new(neu);
neu^.Wert:=3;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
new(neu);
neu^.Wert:=5;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
new(neu);
neu^.Wert:=3;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
new(neu);
neu^.Wert:=1;
neu^.next:=nil;
zeiger^.next:= neu;
zeiger:=neu;
anzeigen(kopf);
RekUmdrehen(kopf, umgedreht);
anzeigen(umgedreht);
END.
Klausuraufgabe NK11 Aufgabe 5
program aufg5;
type
tRefBinBaum=^tBinBaum;
tBinBaum=record
Wert:Integer;
links,rechts:tRefBinBaum ;
end;
function IstDrin(inZahl:integer; inBaum:tRefBinBaum): boolean;
begin
if inBaum=nil then
IstDrin:= false
else
begin
if (inBaum^.Wert=inZahl) then
IstDrin:=true
else
begin
IstDrin:= IstDrin(inZahl, inBaum^.links) or IstDrin(inZahl, inBaum^.rechts);
end;
end;
end;
BEGIN
END.