Listen
description
Transcript of Listen
ListenListen
Klaus Becker2003
2
KB
Liste
nListenListen
Ansgar A., SpeyerClaudia B., KoblenzKnut B., NeustadtAnnett B., WörrstadtStefani D., Bad EmsJochen F., Ludwigshafen......Wieland S., TrierHarald T.-R., Biesdorf
3
KB
Liste
nTeil 1Teil 1
Objektorientierte Modellierung und Implementierung von Listen
4
KB
Liste
nWas ist eine Liste?Was ist eine Liste?
LisaRolandAnnaGerdStefanieSusanneWalterUlrikeTheo...
Bernd
Eine Liste ist eine endliche, beliebig lange Folge von Elementen, in der an jeder Stelle neue Elemente eingefügt oder vorhandene Elemente entfernt werden können.
Ziel ist es zunächst, die dynamische Datenstruktur „Liste“ mit Hilfe einer geeigneten Klasse zu implementieren.
5
KB
Liste
nObjektorientierte RepräsentationObjektorientierte Repräsentation
... = Lisa
... = Roland
... = Anna
... = Gerd
... = Bernd
...
LisaRolandAnnaGerdStefanieSusanneWalterUlrike...
Bernd
6
KB
Liste
nObjektorientierte RepräsentationObjektorientierte Repräsentation
... = Lisa
... = Roland
... = Anna
... = Gerd
... = Bernd
Die Listenelemente werden mit Hilfe von Objekten beschrieben.Die Folgenstruktur der Liste wird mit Hilfe von Referenzen aufgebaut.
...
7
KB
Liste
nObjektorientierte RepräsentationObjektorientierte Repräsentation
... = Lisa
... = Roland
... = Anna
... = Gerd
... = Bernd
...
Knoten
8
KB
Liste
nObjektorientierte RepräsentationObjektorientierte Repräsentation
Spezielle Liste: String-Liste
Verallgemeinerte Liste: Objekt-Liste
9
KB
Liste
nKlassendiagrammKlassendiagramm
Liste
anfang: Knoten
...
Knoten
next: Knoteninhalt: string
...
Spezielle Liste:
kenntkennt
10
KB
Liste
nKlassendiagrammKlassendiagramm
Liste
anfang: Knoten
...
Knoten
next: Knoteninhalt:
...
Object
Verallgemeinerte Liste:
kennt kennt
hat
11
KB
Liste
nImplementierungImplementierung
type TKnoten = class private next : TKnoten; inhalt : TObject; public ... end;
type TListe = class private anfang : TKnoten; public ... end;
Liste
anfang: Knoten
...
Knoten
next: Knoteninhalt:
...
Object
12
KB
Liste
nListenoperationenListenoperationen
{ liste: [ ] } liste.create
{ liste: [Lisa] }liste.insert(0, Lisa)
{ liste: [Lisa; Anna] }liste.insert(1, Anna)
liste.insert(1, Roland){ liste: [Lisa; Roland; Anna] }
{ liste: [Lisa; Anna] }liste.delete(1)
liste.items(1) Annaliste.getCount 2
Liste
- anfang: Knoten- count: integer
+ create+ getCount: integer- knotenItems(pos: integer) : Knoten+ items(pos: integer): Object+ delete(pos: integer)+ insert(pos: integer; obj: Object)
Hilfsoperation
13
KB
Liste
nknotenItems – SpezifikationknotenItems – Spezifikation
liste.knotenItems(2)
Die Funktion „knotenItems“ bestimmt den i-ten Knoten der Liste, wobei i = pos+1.
function TListe.knotenItems(pos: integer): TKnoten;
14
KB
Liste
nliste.knotenItems(2) – Traceliste.knotenItems(2) – Trace
z := 0; k := anfang;
15
KB
Liste
nliste.knotenItems(2) – Traceliste.knotenItems(2) – Trace
inc(z); k := k.getNext;
16
KB
Liste
nliste.knotenItems(2) – Traceliste.knotenItems(2) – Trace
inc(z); k := k.getNext;
17
KB
Liste
nliste.knotenItems(2) – Traceliste.knotenItems(2) – Trace
result := k;
18
KB
Liste
nknotenItems – AlgorithmusknotenItems – Algorithmus
beginz := 0;k := anfang;while ((z < pos) and (z < count)) do begin inc(z); k := k.getNext; end;result := k;end;
19
KB
Liste
nitems – Spezifikationitems – Spezifikation
liste.items(2)
Die Funktion „items“ bestimmt den Inhalt des i-ten Knotens der Liste, wobei i = pos+1.
function TListe.items(pos: integer): TObject;
20
KB
Liste
nitems – Algorithmusitems – Algorithmus
function TListe.items (pos: integer): TObject;beginif ((pos >= 0) and (pos < count)) then result := knotenItems(pos).getInhaltelse result := nil;end;
21
KB
Liste
ndelete – Spezifikationdelete – Spezifikation
liste.delete(2)
procedure TListe.delete(pos: integer);
22
KB
Liste
nliste.delete(2) – Trace liste.delete(2) – Trace
hilf := knotenItems(pos);
23
KB
Liste
nliste.delete(2) – Traceliste.delete(2) – Trace
knotenItems(pos-1). setNext(knotenItems(pos).getNext);
24
KB
Liste
nliste.delete(2) – Traceliste.delete(2) – Trace
hilf.getInhalt.free; hilf.free;dec(count)
25
KB
Liste
nAchtung: liste.delete(0)Achtung: liste.delete(0)
knotenItems(pos-1). setNext(knotenItems(pos).getNext);
26
KB
Liste
nAchtung: liste.delete(0)Achtung: liste.delete(0)
anfang := knotenItems(pos).getNext
27
KB
Liste
ndelete – Algorithmusdelete – Algorithmus
28
KB
Liste
ninsert – Spezifikationinsert – Spezifikation
liste.insert(2,o)
procedure TListe.insert(pos: integer; obj: TObject);
29
KB
Liste
nliste.insert(2,o) – Traceliste.insert(2,o) – Trace
danach := knotenItems(pos);
30
KB
Liste
nliste.insert(2,o) – Traceliste.insert(2,o) – Trace
neu := TKnoten.create(danach,obj);
31
KB
Liste
nliste.insert(2,o) – Traceliste.insert(2,o) – Trace
knotenItems(pos-1).setNext(neu);inc(count);
32
KB
Liste
nVorsicht: liste.insert(0,o)Vorsicht: liste.insert(0,o)
knotenItems(pos-1).setNext(neu);
33
KB
Liste
ninsert – Algorithmusinsert – Algorithmus
34
KB
Liste
nAufgabeAufgabe
Entwickeln Sie mit Hilfe der Trace-Beispiele die Algorithmen zu den beiden Operationen delete und insert.Erstellen Sie ein neues Delphi-Projekt (in einem neuen Ordner) und implementieren Sie die Klasse TListe.
35
KB
Liste
nLösung: delete – AlgorithmusLösung: delete – Algorithmus
procedure TListe.delete(pos: integer); var hilf: TKnoten;beginif pos <= count-1 then begin hilf := knotenItems(pos); if pos = 0 then anfang := knotenItems(pos).getNext else knotenItems(pos-1).setNext(knotenItems(pos).getNext); hilf.getInhalt.free; hilf.free; dec(count); end;end;
36
KB
Liste
nLösung: insert – AlgorithmusLösung: insert – Algorithmus
procedure TListe.insert (pos: integer; obj: TObject); var neu, danach: TKnoten;beginif pos <= count then begin if pos = 0 then begin danach := anfang; neu := TKnoten.create(danach, obj); anfang := neu; inc(count); end else begin danach := knotenItems(pos); neu := TKnoten.create(danach, obj); knotenItems(pos-1).setNext(neu); inc(count); end; end;end;
37
KB
Liste
nListentestListentest
Ziel ist es, ein Programm zu erstellen, mit dessen Hilfe die Implementierung der Klasse „TListe“ gestestet werden kann.Z. B.: Es soll eine Namensliste [Lisa; Anna; ...] erstellt und angezeigt werden.
38
KB
Liste
nSpezialisierungSpezialisierung
Spezialisierte Liste:
Allgemeine Liste:
39
KB
Liste
nSpezialisierungSpezialisierung
Liste
anfang: Knoten
...
Knoten
next: Knoteninhalt:
... Element
Object
wert: String
create(w: String)setWert(w: String)getWert: String
kenntkennt
hatist
40
KB
Liste
nErzeugung einer ListeErzeugung einer Liste
liste := TListe.create;e := TElement.create('Lisa');liste.insert(0,e);e := TElement.create('Anna');liste.insert(1,e);...
41
KB
Liste
nAnzeige einer ListeAnzeige einer Liste
h := '';for i := 0 to liste.getCount-1 do begin w := TElement(liste.items(i)).getWert; h := h + ' ' + w; end;PListe.Caption := h;
Hilfsvariable
Anzeige-Panel
Typumwandlung: TObject TElement
42
KB
Liste
nAufgabeAufgabe
Die Klasse „TElement“ ist noch nicht implementiert. Ergänzen Sie die fehlenden Teile.Erstellen Sie eine einfache Testoberfläche und ergänzen Sie die Methodenaufrufe zur Erzeugung und zur Anzeige einer TestlisteZur Kontrolle: Listen2
43
KB
Liste
nTeil 2Teil 2
Anwendung: Lexikon
44
KB
Liste
nAuftragAuftrag
Aus: H. Balzert: Lehrbuch Grundlagen der Informatik, S. 137.
Ziel ist es, ein Programm zur Erstellung und Benutzung eines Glossars (Lexikons) zu entwickeln.
45
KB
Liste
nPflichtenheftPflichtenheft
/0/ Das Lexikon ist eine endliche Folge von Einträgen. Jeder Eintrag liefert eine Erläuterung zu einem Stichwort./1/ Im Lexikon kann der Benutzer eine Erklärung zu einem Stichwort nachschlagen. Der Benutzer muss hierzu das ihn interessierende Stichwort eingeben./2/ Das Lexikon kann vom Benutzer ergänzt und verändert werden: Es können jederzeit neue Einträge eingefügt und bereits bestehende Einträge gelöscht werden./3/ Das Lexikon kann extern gespeichert und wieder geladen werden.
46
KB
Liste
nPrototypPrototyp
47
KB
Liste
nOOAOOA
Ein Lexikon ist eine endliche Folge von Einträgen. Jeder Eintrag liefert eine Erläuterung zu einem Stichwort.Im Lexikon kann man eine Erklärung zu einem Stichwort nachschlagen. Das Lexikon kann ergänzt und verändert werden: Es können neue Einträge eingefügt und bereits bestehende Einträge gelöscht werden.Das Lexikon kann extern gespeichert und wieder geladen werden.
48
KB
Liste
nOODOOD
„create“ erstellt ein neues Listenobjekt „liste“.„addEintrag“ erstellt zunächst ein „Eintrag“-Objekt und fügt es dann in „liste“ ein.„delEintrag“ durchsucht zunächst die Liste „liste“ nach dem „stichwort“ und bestimmt gegebenenfalls die Position. Anschließend wird der zugehörige Eintrag in der Liste gelöscht.„getErlaeuterung“ liefert zu dem „stichwort“ die zugehörige Erläuterung im Lexikon.
49
KB
Liste
nAlgorithmenAlgorithmen
constructor TLexikon.create;beginliste := TListe.create(nil); end;
procedure TLexikon.addEintrag(stichwort, erlaeuterung: string); var eintrag: TEintrag;begineintrag := TEintrag.create(stichwort,erlaeuterung);liste.insert(0,eintrag); end;
50
KB
Liste
nAlgorithmenAlgorithmen
procedure TLexikon.delEintrag(stichwort: string); var i, position: integer;beginposition := -1;for i := 0 to liste.getCount-1 do if TEintrag(liste.items(i)).getStichwort = stichwort then position := i; if position >= 0 then liste.delete(position); end;
51
KB
Liste
nAlgorithmenAlgorithmen
function TLexikon.getErlaeuterung(stichwort: string): string; var position: integer; erlaeuterung: string;beginerlaeuterung := 'kein Eintrag gefunden!';for position := 0 to liste.getCount-1 do if TEintrag(liste.items(position)).getStichwort = stichwort then erlaeuterung := TEintrag(liste.items(position)).getErlaeuterung;result := erlaeuterung;end;
52
KB
Liste
nAufgabeAufgabe
Delphi verfügt über eine vordefinierte Klasse „TList“. Informieren Sie sich über diese Klasse mit der Delphi-Hilfe. Implementieren Sie dann das Lexikon mit dieser vordefinierten Klasse „TList“ an Stelle der selbst entwickelten Klasse „TListe“.Zur Kontrolle: siehe Lexikon2
53
KB
Liste
nZum VergleichZum Vergleich
unit uLexikon;interfaceuses uEintrag, classes {TList};type TLexikon = class private liste: TList; public constructor create; ... end;
unit uLexikon;interfaceuses uEintrag, uListe {TListe};type TLexikon = class private liste: TListe; public constructor create; ... end;
Vordefinierte Liste
Selbstdefinierte Liste
54
KB
Liste
nZum VergleichZum Vergleich
constructor TLexikon.create;beginliste := TListe.create; // liste := TList.create;end;
Vordefinierte Liste
Selbstdefinierte Liste
55
KB
Liste
nZum VergleichZum Vergleich
procedure TLexikon.addEintrag(stichwort, erlaeuterung: string); var eintrag: TEintrag;begineintrag := TEintrag.create(stichwort,erlaeuterung);liste.insert(0,eintrag); // liste.Insert(0, eintrag);end;
Vordefinierte Liste
Selbstdefinierte Liste
56
KB
Liste
nZum VergleichZum Vergleich
procedure TLexikon.delEintrag(stichwort: string); var i, position: integer;beginposition := -1;for i := 0 to liste.getCount-1 do // liste.Count-1 if TEintrag(liste.items(i)).getStichwort = stichwort then position := i; // liste.Items[i] if position >= 0 then liste.delete(position); // liste.Delete(position)end;
Vordefinierte Liste
Selbstdefinierte Liste
57
KB
Liste
nZum VergleichZum Vergleich
function TLexikon.getErlaeuterung(stichwort: string): string; var position: integer; erlaeuterung: string;beginerlaeuterung := 'kein Eintrag gefunden!';for position := 0 to liste.getCount-1 do // liste.Count-1 if TEintrag(liste.items(position)).getStichwort = stichwort then erlaeuterung := TEintrag(liste.items(position)).getErlaeuterung;result := erlaeuterung;end; // liste.Items[position]
Vordefinierte Liste
Selbstdefinierte Liste
58
KB
Liste
nZum VergleichZum Vergleich
TListe
- anfang: Knoten- count: integer
+ create(k: Knoten)+ getCount: integer- knotenItems(pos: integer) : Knoten+ items(pos: integer): TObject+ delete(pos: integer)+ insert(pos: integer; obj: TObject)
TList
+ Count: integer+ Items[pos: integer]: Pointer
+ create+ Delete(pos: integer)+ Insert(pos: integer; obj: Pointer)...
Properties
59
KB
Liste
nTeil 3Teil 3
Stapel und Schlangen
60
KB
Liste
nAuswertung von TermenAuswertung von Termen
Term: ( 7 - 2 ) * 3 =
7
(
-
( 7
2
( 7 -
)
*
5
3
* 5
( 7 - 2
=
* 5 3
15
OperandenstapelOperatorenstapel
61
KB
Liste
nStapelStapel
LIFO-Prinzip: last in, first out
mitErstem erstes ohneErstes
62
KB
Liste
nModellierungModellierung
mitErstem erstes ohneErstes
Stapel
+ create+ istLeer: boolean+ mitErstem(obj: Object)+ erstes: Object+ ohneErstes
63
KB
Liste
nDruckerwarteschlangeDruckerwarteschlange
Druckauftragswarteschlange
64
KB
Liste
nSchlangeSchlange
FIFO-Prinzip: first in, first out
mitLetztem erstes ohneErstes
65
KB
Liste
nModellierungModellierung
mitLetztem erstes ohneErstes
Schlange
+ create+ istLeer: boolean+ mitLetztem(obj: Object)+ erstes: Object+ ohneErstes
66
KB
Liste
nVereinfachungVereinfachung
Im folgenden sollen nur Stapel und Schlangen betrachtet werden, deren Elemente Zeichenketten sind.
Stapel
+ create+ istLeer: boolean+ mitErstem(s: String)+ erstes: String+ ohneErstes
Schlange
+ create+ istLeer: boolean+ mitLetztem (s: String)+ erstes: String+ ohneErstes
67
KB
Liste
nImplementierungImplementierung
unit uStapel;interfaceuses classes {TStringList};type TStapel = class(TStringList) private public constructor create; function istLeer: boolean; procedure mitErstem(s: string); procedure ohneErstes; function erstes: string; end;implementation...
Stapel
+ create+ istLeer: boolean+ mitErstem(s: String)+ erstes: String+ ohneErstes
TStringList
+ Count: integer+ Strings: array[0..] of string
+ create+ delete(p: integer)+ insert(p: integer; s: String)...
68
KB
Liste
nImplementierungImplementierung
constructor TStapel.create;begin inherited create; end;function TStapel.istLeer: boolean;begin result := (Count = 0); end;function TStapel.erstes: string;begin result := Strings[0]; end;procedure TStapel.ohneErstes;begin delete(0); end;procedure TStapel.mitErstem(s: string);begin insert(0,s); end;
Stapel
+ create+ istLeer: boolean+ mitErstem(s: String)+ erstes: String+ ohneErstes
TStringList
+ Count: integer+ Strings: array[0..] of string
+ create+ delete(p: integer)+ insert(p: integer; s: String)...
69
KB
Liste
nAufgabeAufgabe
Implementieren Sie analog die Klasse Schlange. Benutzen Sie hierzu die vordefinierte Delphi-Klasse TStringList. Die benötigten Attribute (Properties) und Operationen sind im nebenstehenden Klassendiagramm aufgeführt. Die Bedeutung der Bestandteile kann mit der Delphi-Hilfe ermittelt werden.Erstellen Sie auch (einfache) Testprogramme, um die Korrektheit der Operationen zu überprüfen.
TStringList
+ Count: integer+ Strings: array[0..] of string
+ create+ delete(p: integer)+ insert(p: integer; s: String)...
Schlange
+ create+ istLeer: boolean+ mitLetztem (s: String)+ erstes: String+ ohneErstes
70
KB
Liste
n
71
KB
Liste
nTeil 4Teil 4
Anwendung: Taschenrechner
72
KB
Liste
nAuftragAuftrag
Es soll ein Demo-Taschenrechner erstellt werden, der die Bearbeitung von Klammertermen veranschaulicht.Eingabe: ( 7 - 2 ) * 3 =
7
(
-
( 7
2
( 7 -
)
( 7 - 2
Verarbeitung:
Ergebnis: (7 - 2) * 3 = 15
73
KB
Liste
nPflichtenheftPflichtenheft
/0/ Der Benutzer gibt die Bestandteile des Terms – auch Token genannt – Schritt für Schritt ein: Klammern, Zahlen, Rechenzeichen (+, -, *, :), Gleicheitszeichen. Z.B.: ( 7 - 2 ) * 3 =/1/ Die Bearbeitung des Terms wird Schritt für Schritt mit Hilfe eines Buttons ausgelöst. Die benutzten Stapel werden dabei jeweils auf dem Bildschirm angezeigt./2/ Der gesamte Term und das berechnete Ergebnis wird abschließend angezeigt.
74
KB
Liste
nAuswertung von TermenAuswertung von Termen
Term: ( 7 - 2 ) * 3 =
7
(
-
( 7
2
( 7 -
)
*
5
3
* 5
( 7 - 2
=
* 5 3
15
75
KB
Liste
nInterpreterInterpreter
) * 3 =
( -
7 2
termSchlangeoperandenStapeloperatorenStapel
Interpreter
'(7-2'
''
76
KB
Liste
nOOMOOM
) * 3 =
( +
7 2
Interpreter
'(7-2)'
''
termSchlangeoperandenStapeloperatorenStapel
77
KB
Liste
nAufgabeAufgabe
Fall 1: Das erste Element der TermSchlange ist ein Gleichheitszeichen und der OperatorenStapel ist nicht leer:
=
-
7
'7-2'
''
Ergänzen Sie den Interpretieralgorithmus.
2
78
KB
Liste
nAufgabeAufgabe
Fall 2: Das erste Element der TermSchlange ist ein Gleichheitszeichen und der OperatorenStapel ist leer:
Ergänzen Sie den Interpretieralgorithmus.
=
5
'(7-2)'
''
79
KB
Liste
nAufgabeAufgabe
Fall 3: Das erste Element der TermSchlange ist „Klammerauf“:
Ergänzen Sie den Interpretieralgorithmus.
( 7 - 2 ) =
''
''
80
KB
Liste
nAufgabeAufgabe
Fall 4: Das erste Element der TermSchlange ist „Klammerzu“:
Ergänzen Sie den Interpretieralgorithmus.
) =
( -
7
'(7-2'
''
2
81
KB
Liste
nAufgabeAufgabe
Fall 5: Das erste Element der TermSchlange ist ein Rechenzeichen:
Ergänzen Sie den Interpretieralgorithmus.
- 2 ) =
(
7
'(7'
''
82
KB
Liste
nAufgabeAufgabe
Fall 6: Das erste Element der TermSchlange ist eine Zahl:
Ergänzen Sie den Interpretieralgorithmus.
2 ) =
( -
7
'(7-'
''
83
KB
Liste
nAufgabeAufgabe
Implementieren Sie den Interpreter und testen Sie das Taschenrechner-Programm.Welche Erweiterungen wären wünschenswert?
84
KB
Liste
nLösungLösung
Fall 1: Das erste Element der TermSchlange ist ein Gleichheitszeichen und der OperatorenStapel ist nicht leer:
=
-
7
'7-2'
''
2
hilf := termSchlange.erstes;termSchlange.ohneErstes;term := term + hilf;z1 := StrToInt(operandenStapel.erstes);operandenStapel.ohneErstes;z2 := StrToInt(operandenStapel.erstes);operandenStapel.ohneErstes;op := operatorenStapel.erstes;operatorenStapel.ohneErstes;if (op = '+') then erg := z2 + z1;if (op = '-') then erg := z2 - z1;if (op = '*') then erg := z2 * z1;if (op = ':') then erg := z2 div z1;ergebnis := IntToStr(erg);operandenStapel.mitErstem(ergebnis);
85
KB
Liste
nLösungLösung
Fall 2: Das erste Element der TermSchlange ist ein Gleichheitszeichen und der OperatorenStapel ist leer:
=
5
'(7-2)'
''
hilf := termSchlange.erstes;termSchlange.ohneErstes;term := term + hilf;ergebnis := operandenStapel.erstes;
86
KB
Liste
nLösungLösung
Fall 3: Das erste Element der TermSchlange ist „Klammerauf“:
( 7 - 2 ) =
''
''
hilf := termSchlange.erstes;termSchlange.ohneErstes;term := term + hilf;token := hilf;operatorenStapel.mitErstem(token);
87
KB
Liste
nLösungLösung
Fall 4: Das erste Element der TermSchlange ist „Klammerzu“:
) =
( -
7
'(7-2'
''
2
hilf := termSchlange.erstes;termSchlange.ohneErstes;term := term + hilf;z1 := StrToInt(operandenStapel.erstes);operandenStapel.ohneErstes;z2 := StrToInt(operandenStapel.erstes);operandenStapel.ohneErstes;op := operatorenStapel.erstes;operatorenStapel.ohneErstes;operatorenStapel.ohneErstes;if (op = '+') then erg := z2 + z1;if (op = '-') then erg := z2 - z1;if (op = '*') then erg := z2 * z1;if (op = ':') then erg := z2 div z1;token := IntToStr(erg);operandenStapel.mitErstem(token);
88
KB
Liste
nLösungLösung
Fall 5: Das erste Element der TermSchlange ist ein Rechenzeichen:
- 2 ) =
(
7
'(7'
''
hilf := termSchlange.erstes;termSchlange.ohneErstes;term := term + hilf;token := hilf;operatorenStapel.mitErstem(token);
89
KB
Liste
nLösungLösung
Fall 6: Das erste Element der TermSchlange ist eine Zahl:
2 ) =
( -
7
'(7-'
''
hilf := termSchlange.erstes;termSchlange.ohneErstes;term := term + hilf;token := hilf;operandenStapel.mitErstem(token);
90
KB
Liste
nLiteraturhinweiseLiteraturhinweise
Helmut Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Ak. Verlag 1999.H.-P. Gumm u. M. Sommer: Einführung in die Informatik. Oldenbourg Verlag 2002....