2001-2002-3-LK Binaerbaum ALI\374

Werbung
3. INFORMATIK-KLAUSUR
Name:
04.03.2002
− Seite 1 −
Bearbeitungszeit: 135 min
Info 12 LK (GA)
Aufgabe 1: Bäume − Binärbaume – Suchbäume
Im Unterricht haben wir drei verschiedene Gruppen von Bäumen kennen
gelernt:
Gruppe A: Suchbäume
Gruppe B: Binärbäume
Gruppe C: Bäume
Gruppe D: keine Bäume (Graphen)
Diese stehen in einem rechts veranschaulichten Hierarchieverhältnis.
(D) Graphen
(C) Bäume
(B) Binärbäume
(A) Suchbäume
a) Ordnen Sie jede der nachfolgenden Strukturen einer dieser Gruppen zu und begründen Sie
kurz, warum die Struktur zur angegebenen Hierarchie gehört.
(2)
(1)
(3)
C
B
F
E
(4)
(5)
10
6
4
7
04.03.2002
19.09.2001
9
5
P
8
08.07.2001
25.05.2002
24.12.2001
01.10.2003
b) Zeichnen Sie den Graphen eines zu Anfang leeren Suchbaumes, in den nacheinander die
folgenden Elemente eingefügt werden (Eine Zeichnung reicht aus!):
3, 1, 7, 2, 12, 6, 4, 10, 8, 5, 11, 9
c) Geben Sie zum nachfolgenden Binärbaum die Preorder-, Inorder- und PostorderTraversierung an.
oder
Binärbäumen
Traversieren
Spass
von
das
riesen
macht
d) Löschen Sie nacheinander die folgenden Elemente aus dem rechts
abgebildeten Suchbaum.
9, 8, 7, 3, 6,
Halten Sie sich dabei exakt an das im Unterricht entwickelte
Verfahren SuchLöschen (Anlage I). Zeichnen Sie nach jeder
Löschaktion den Graphen des daraus resultierenden Baumes.
(Insgesamt sind also 5 Bäume zu zeichnen!)
einen
6
3
2
1
8
5
4
e) Entwickeln Sie eine Funktion, welche die Anzahl der Blätter eines Baumes berechnet.
Verwenden Sie wann immer möglich die Binbaum-Methoden (Anlage II).
function TBinBaum.Blattanzahl: integer;
7
10
9
11
3. INFORMATIK-KLAUSUR
Name:
04.03.2002
− Seite 2 −
Bearbeitungszeit: 135 min
Info 12 LK (GA)
Aufgabe 2: ALI – von der Hochsprache zur Maschinenebene
a) Schreiben Sie ein Pascal- sowie das zugehörige RePascal-PROGRAM Quadratsumme,
welches nach Eingabe einer natürlichen Zahl n die Summe der ersten n natürlichen
Quadratzahlen, d.h. 12 + 22 + 32 + ... + n2, berechnet und anschließend ausgibt.
Übersetzen Sie das Programm anschließend aus der Zwischensprache nach ALI!
b) Die Summe aus Teilaufgabe a) soll nun mit Hilfe der Formel
n(n + 1)(2n + 1)
berechnet werden.
12 + 2 2 + 3 2 + ... + n 2 =
6
Notieren Sie die Umwandlung der Zuweisung Summe:= n*(n+1)*(2*n+1) div 6 in
das Dreiadressformat mit Hilfe des Zerlegungsalgorithmus aus Anlage III (Achtung:
Endergebnis alleine reicht nicht aus; dokumentieren Sie die Ausführung des Algorithmus
u. a. mit passenden Stacks und Zwischenergebnissen).
Gegeben ist folgendes Pascal-Programm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program WasTueIch;
var i, j: integer;
hilf: integer;
feld: array[-6..2] of integer;
begin
for i := -6 to 2 do readln(feld[i]);
for i := -6 to 2
do begin
j:= i;
while (j > -6) and (feld[j] < feld[j-1])
do begin
hilf
:= feld[j];
feld[j] := feld[j-1];
feld[j-1]:= hilf;
j := j - 1;
end;
end;
end;
c) Veranschaulichen Sie den obigen Algorithmus an der folgenden Feld-Belegung.
0
1
−6
−5
−4
−3
−2
−1
6
3
1
7
5
9
2
4
2
8
Geben Sie dazu jedes Mal, wenn sie die Zeile 15 passieren, die aktuelle Feldbelegung an.
Der Anfang wurde bereits gemacht.
−6
−5
−4
−3
−2
−1
0
1
2
6
3
3
1
3
6
1
3
1
1
6
6
7
7
7
7
5
5
5
5
9
9
9
9
2
2
2
2
4
4
4
4
8
8
8
8
Erläuteren Sie, was der Algorithmus leistet und geben Sie ihm anschließend den aus
Informatikersicht korrekten Namen.
d) Übersetzen Sie den Algorithmus in die Zwischensprache RePascal.
e) Übersetzen Sie die for-Schleife zur Dateneingabe (Zeilen 6) in ALI!
Viel Erfolg!
Anlage II:
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
Der Datentyp TBinbaum in Delphi
----------------------------------------------------------------------------------------------------------------- }
}
Die Unit stellt einen inhaltslosten Datentypen TBinBaum zur Verfügung. Um einen Binärbaum mit Inhalt zu erhalten, }
muss eine hiervon abgeleitete Klasse erstellt werden, z. B.:
}
}
type TIntBinBaum = class(TBinBaum)
}
public
}
Wurzelinhalt: integer;
}
constructor Create(w: Integer);
}
function WurzelinhaltToString: string; override;
}
end;
}
}
Ein Binärbaum kann entweder leer sein (NIL) oder eine Wurzel mit zwei evtl. leeren Teilbäumen rtb, ltb
}
}
----------------------------------------------------------------------- Tool zum Binärbaum, (C) 2001 D. Garmann - }
unit Binbaum;
interface
type
TBinBaum = class
private
ltb, rtb: TBinBaum;
public
constructor Create;
destructor
function
function
function
function
procedure
procedure
function
function
function
function
function
end;
{ Erzeugt ein Blatt, d.h. "leeres Element mit rtb=ltb=NIL
}
Destroy;
{ Zerstört das Element inklusive seiner Teilbäume
}
Leer: boolean;
{ Liefert "true" wenn der Baum leer ist, d. h. der Baum ist = NIL
}
WurzelinhaltToString: string; virtual; abstract;
{ Abstracte Methode zur Darstellung des Inhalts auf dem Bildschirm (Editfeld, etc.) }
LinkerTeilbaum: TBinBaum;
{ Liefert den Linken Teilbaum im Funktionsergebnis zurück.
RechterTeilbaum: TBinBaum;
{ Liefert den Rechten Teilbaum im Funktionsergebnis zurück.
FuegeTeilbaumLinksAn(tb: TBinBaum);
{ Fügt einen Teilbaum an das aktuelle
{ VORSICHT! Ein eventuell vorhandener
FuegeTeilbaumRechtsAn(tb: TBinBaum);
{ Fügt einen Teilbaum an das aktuelle
{ VORSICHT! Ein eventuell vorhandener
}
}
Baumelement links an.
linker Teilbaum geht verloren!
}
}
Baumelement rechts an.
rechter Teilbaum geht verloren!
}
}
LinksLeer: Boolean;
{ Liefert "true" wenn der linke Teilbaum leer ist, d. h. ltb=NIL
{ VORSICHT! Ein leerer Baum hat keinen linken Teilbaum => Laufzeitfehler
RechtsLeer: Boolean;
{ Liefert "true" wenn der rechte Teilbaum leer ist, d. h. rtb=NIL
{ VORSICHT! Ein leerer Baum hat keinen rechten Teilbaum => Laufzeitfehler
IstBlatt: Boolean;
{ Liefert "true", wenn das aktuelle Element leere Teilbäume hat.
ErsetztDurchLinkenTeilbaum: TBinBaum;
{ Liefert den Linken Teilbaum im Funktionsergebnis zurück und LÖSCHT den Rest.
ErsetztDurchRechtenTeilbaum: TBinBaum;
{ Liefert den Rechten Teilbaum im Funktionsergebnis zurück und LÖSCHT den Rest.
}
}
}
}
}
}
}
Anlage I:
Ja
Algorithmus Suchlöschen
aktueller Baum leer?
Ja
Nein
aktueller Baum „gleich“ Suchelement?
Nein
akt. Baum „größer“ Suchel.?
{Nicht gefunden}
•
{gefunden}
Führe „EchtLöschen“
aus
ExistiertBereits
↑
FALSCH
ExistiertBereits
↑
WAHR
•
Ja
Betrachte den
linken
Teilbaum und
führe
„Suchlöschen“
darin aus
Hänge diesen
Teilbaum wieder
an den aktuellen
Baum links an
Nein
• Betrachte den
rechten Teilbaum
und führe
„Suchlöschen“
darin aus
• Hänge diesen
Teilbaum wieder
an den aktuellen
Baum rechts an
Algorithmus: „EchtLöschen“
Ja
aktueller Baum rechts leer?
Nein
aktueller Baum links leer?
Ersetze akt. Baum
durch linken
Teilbaum
Ja
Ersetze akt. Baum
durch rechten
Teilbaum
{inklusive Blatt
abschneiden}
{inklusive Blatt
abschneiden}
•
•
•
•
•
Nein
Betrachte den linken Teilbaum
„IsolieregrößtesElement:“ darin:
GroesstesElement
Hänge beide Teilbäume vom aktuellen
Baum an das GroesstesElement
Isoliere die Wurzel des aktuellen Baumes
und gib dafür den Speicher frei
Ändere den aktuellen Baum ab in
GroesstesElement
Anlage III:
Der Zerlegungsalgorithmus
Zerlegung
Zerlegung:
TZeichenketten (z. B. als Schlange oder Liste)
Ausdruck:
TZeichenkette
ODK, OTK:
TKeller (= TStack)
Zeichen:
TZeichen
• Richte zwei Keller ein (ODK, OTK)
• Wiederhole
• Lies das nächste Zeichen.
• Falls das Zeichen
a) ein Operand ist,
• kellere ihn im ODK ein (push)
b) ein Operator ist,
• überprüfe seine Priorität.
• Solange der Operator keine Priorität gegenüber dem obersten Operator
• des OTK besitzt,
wiederhole: • werte den OTK aus.
• Speichere den neuen Operator im OTK.
c) eine öffnende Klammer ist,
• speichere diese im OTK.
d) eine schließende Klammer ist,
• führe eine Auswertung aller Operatoren zurück bis zur
• entsprechenden öffnenden Klammer aus
• entferne die öffnende Klammer aus dem OTK (pop).
• bis Ausdruck ganz abgearbeitet ist.
• Solange der OTK nicht leer ist,
wiederhole: • werte den OTK aus.
ALGORITHMUS
I/O-OBJEKTE
Inp-OBJEKT
HILFSOBJ.
3. INFORMATIK-KLAUSUR
04.03.2002
− Seite 1 −
Lösungen
Info 12 LK (GA)
Aufgabe 1: Bäume − Binärbaume – Suchbäume
a) (1): Gruppe C. Nicht B, da 3 Teilbäume an einem Knoten hängen
(2): Gruppe A.
(3): Gruppe D. Nicht C, da ein Knoten zwei Väter hat.
(4): Gruppe B. Nicht A, da Ordnungsrelation verletzt.
(5): Gruppe A.
b) Der Baum sieht wie folgt aus:
c) PreOrder: oder Binärbäumen Traversieren das von Spass riesen macht einen
InOrder: Traversieren das Binärbäumen von oder Spass macht reisen einen
PostOrder: das Traversieren von Binärbäumen macht einen riesen Spass oder
d) Die Bäume sehen wie folgt aus:
6
3
2
8
5
1
6
7
3
10
4
2
11
6
3
2
1
4
5
1
10
4
11
6
10
5
7
2
11
1
5
10
5
2
11
1
10
4
4
e) Eine Implementierung könnte wie folgt aussehen:
function TBinBaum.Blattanzahl: integer;
begin
if leer
then Blattanzahl:= 0
else if istBlatt
then Blattanzahl:= 1
else Blattanzahl:= linkerTeilbaum.Blattanzahl +
rechterTeilbaum.Blattanzahl;
end;
11
3. INFORMATIK-KLAUSUR
04.03.2002
− Seite 2 −
Lösungen
Info 12 LK (GA)
Aufgabe 2: ALI – von der Hochsprache zur Maschinenebene
a) Der Algorithmus sieht wie folgt aus:
program Quadsum;
var n: integer;
i, Summe: integer;
begin
Summe:= 0;
Readln(n);
for i:= 1 to n
do Summe:= Summe + i * i;
Writeln(Summe);
end.
Quadsum START
L
ST
INI
L
ST
M1
L
C
BH
L
M
ST
L
A
ST
L
A
ST
B
M2
OUTI
EOJ
n
DS
i
DS
Summe
DS
h1
DS
END
program Quadsum_RePascal;
var n: integer;
i, Summe: integer;
h1: integer;
label M1, M2;
begin
Summe:= 0;
Readln(n);
i:= 1;
M1: if i > n then goto M2;
h1:= i * i;
Summe:= Summe + h1;
i:= i + 1;
goto M1;
M2: Writeln(Summe);
end.
0
0,’0’
0,Summe
n
0,’1’
0,i
0,i
0,n
M2
0,i
0,i
0,h1
0,Summe
0,h1
0,Summe
0,i
0,’1’
0,i
M1
Summe
F
F
F
F
Quadsum
b) Die Formel Summe:= n*(n+1)*(2*n+1) div 6 wir im Dreiadressformat zu:
div
+
*
(
*
+
(
*
:=
h6
6
h5
h4
1
h3
n
2
h2
h1
1
n
n
Summe
OTK
ODK
h1:= n + 1;
h2:= n * h1;
h3:= 2 * n;
h4:= h3 + 1;
h5:= h2 * h4;
h6:= h5 div 6;
Summe:= h6;
c) Der Algorithmus könnte wie folgt veranschaulicht werden:
−6
−5
−4
−3
−2
−1
0
1
2
6
3
1
7
5
9
2
4
8
3
6
1
7
5
9
2
4
8
3
1
1
3
6
6
7
7
5
5
9
9
2
2
4
4
8
8
1
3
6
7
5
9
2
4
8
1
1
3
3
6
5
5
6
7
7
9
9
2
2
4
4
8
8
1
3
5
6
7
9
2
4
8
1
1
1
1
1
3
3
3
3
2
5
5
5
2
3
6
6
2
5
5
7
2
6
6
6
2
7
7
7
7
9
9
9
9
9
4
4
4
4
4
8
8
8
8
8
1
1
1
1
2
2
2
2
3
3
3
3
5
5
5
4
6
6
4
5
7
4
6
6
4
7
7
7
9
9
9
9
8
8
8
8
1
2
3
4
5
6
7
8
9
Der Algorithmus sortiert die eingegebenen Zahlen mit Hilfe des Verfahrens InsertionSort.
3. INFORMATIK-KLAUSUR
04.03.2002
− Seite 3 −
Lösungen
Info 12 LK (GA)
d) Die Übersetzung sieht wie folgt aus:
program WasTueIch;
var i, j: integer;
hilf: integer;
feld: array[-6..2] of integer;
h1: integer;
label M1, M2, M3, M4, M5, M6;
begin
i:= -6;
M1: if i > 2 then goto M2;
readln(feld[i]);
i:= i + 1;
goto M1;
M2: i:= -6;
M3: if i > 2 then goto M4;
j:= i;
M5: if j <= -6 then goto M6;
h1:= j - 1;
if j feld[j] >= feld[h1] then goto M6;
hilf
:= feld[j];
feld[j] := feld[h1];
feld[h1]:= hilf;
j:= j - 1;
goto M5;
M6: i:= i + 1;
goto M3;
M4:
end.
e) Die ALI-Übersetzung der While-Schleife ist wie folgt (hier das ganze Programm):
InsSort
M1
M2
M3
M5
START
L
ST
L
C
BH
L
S
M
INI
L
A
ST
B
L
ST
L
C
BH
L
ST
L
C
BNH
L
S
ST
L
S
M
L
L
S
M
C
0
0,'-6'
0,i
0,i
0,'2'
M2
4,i
4,'-6'
4,'2'
feld(4)
0,i
0,'1'
0,i
M1
0,'-6'
0,i
0,i
0,'2'
M4
0,i
0,j
0,j
0,'-6'
M6
0,j
0,'1'
0,h1
4,j
4,'-6'
4,'2'
0,feld(4)
4,h1
4,'-6'
4,'2'
0,feld(4)
M6
M4
i
j
hilf
feld
h1
BNL
L
S
M
L
ST
L
S
M
L
L
S
M
ST
L
L
S
M
ST
L
S
ST
B
L
A
ST
B
EOJ
DS
DS
DS
DS
DS
END
M6
4,j
4,'-6'
4,'2'
0,feld(4)
0,hilf
4,h1
4,'-6'
4,'2'
0,feld(4)
4,j
4,'-6'
4,'2'
0,feld(4)
0,hilf
4,h1
4,'-6'
4,'2'
0,feld(4)
0,j
0,1
0,j
M5
0,i
0,'1'
0,i
M3
F
F
F
9F
F
InsSort
Herunterladen