Slide 1
Listen
Klaus Becker
2003
Slide 2
Listen
2
Ansgar A., Speyer
Claudia B., Koblenz
Knut B., Neustadt
Listen
Annett B., Wörrstadt
Stefani D., Bad Ems
Jochen F., Ludwigshafen
...
...
Wieland S., Trier
Harald T.-R., Biesdorf
KB
Slide 3
Listen
3
KB
Teil 1
Objektorientierte Modellierung und Implementierung
von Listen
Slide 4
Was ist eine Liste?
4
Lisa
Roland
Anna
Listen
Gerd
Bernd
Stefanie
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.
Susanne
Walter
Ulrike
Theo
...
KB
Ziel ist es zunächst, die
dynamische Datenstruktur „Liste“
mit Hilfe einer geeigneten Klasse
zu implementieren.
Slide 5
Objektorientierte Repräsentation
5
Lisa
... = Lisa
Roland
Anna
Listen
Gerd
Bernd
... = Roland
Stefanie
Susanne
... = Anna
... = Bernd
Walter
Ulrike
...
KB
... = Gerd
...
Slide 6
6
Objektorientierte Repräsentation
Listen
Die Listenelemente
werden mit Hilfe von
Objekten beschrieben.
Die Folgenstruktur der
Liste wird mit Hilfe von
Referenzen aufgebaut.
... = Lisa
... = Roland
... = Anna
... = Bernd
... = Gerd
...
KB
Slide 7
7
Objektorientierte Repräsentation
... = Lisa
Knoten
Listen
... = Roland
... = Anna
... = Bernd
... = Gerd
...
KB
Slide 8
8
Objektorientierte Repräsentation
Listen
Spezielle Liste: String-Liste
KB
Verallgemeinerte Liste: Objekt-Liste
Slide 9
Klassendiagramm
9
Listen
Spezielle Liste:
Liste
anfang: Knoten
Knoten
kennt
next: Knoten
inhalt: string
...
...
KB
kennt
Slide 10
Klassendiagramm
10
Listen
Verallgemeinerte Liste:
Liste
anfang: Knoten
Knoten
kennt
next: Knoten
inhalt:
...
...
KB
kennt
hat
Object
Slide 11
Implementierung
Listen
11
type
TKnoten = class
private
next
: TKnoten;
inhalt : TObject;
public
...
Liste
end;
anfang: Knoten
Knoten
next: Knoten
inhalt:
...
...
KB
type
TListe = class
private
anfang : TKnoten;
public
...
end;
Object
Slide 12
Listenoperationen
12
Liste
{ liste: [ ] }
- anfang: Knoten
- count: integer
Listen
liste.create
+ create
+ getCount: integer
- knotenItems(pos: integer) : Knoten
+ items(pos: integer): Object
+ delete(pos: integer)
+ insert(pos: integer; obj: Object)
liste.insert(0, Lisa)
{ liste: [Lisa] }
liste.insert(1, Anna)
{ liste: [Lisa; Anna] }
Hilfsoperation
liste.insert(1, Roland)
{ liste: [Lisa; Roland; Anna] }
liste.delete(1)
{ liste: [Lisa; Anna] }
liste.items(1) Anna
KB
liste.getCount 2
Slide 13
13
knotenItems – Spezifikation
function TListe.knotenItems
(pos: integer): TKnoten;
Listen
Die Funktion „knotenItems“ bestimmt den i-ten Knoten
der Liste, wobei i = pos+1.
KB
liste.knotenItems(2)
Slide 14
Listen
14
KB
liste.knotenItems(2) – Trace
z := 0; k := anfang;
Slide 15
Listen
15
KB
liste.knotenItems(2) – Trace
inc(z); k := k.getNext;
Slide 16
Listen
16
KB
liste.knotenItems(2) – Trace
inc(z); k := k.getNext;
Slide 17
Listen
17
KB
liste.knotenItems(2) – Trace
result := k;
Slide 18
knotenItems – Algorithmus
18
begin
z := 0;
k := anfang;
Listen
while ((z < pos) and (z < count)) do
begin
inc(z);
k := k.getNext;
end;
result := k;
end;
KB
Slide 19
19
items – Spezifikation
function TListe.items
(pos: integer): TObject;
Listen
Die Funktion „items“ bestimmt den Inhalt des i-ten
Knotens der Liste, wobei i = pos+1.
KB
liste.items(2)
Slide 20
items – Algorithmus
20
function TListe.items (pos: integer): TObject;
begin
if ((pos >= 0) and (pos < count)) then
Listen
result := knotenItems(pos).getInhalt
else
result := nil;
end;
KB
Slide 21
21
delete – Spezifikation
Listen
procedure TListe.delete(pos: integer);
KB
liste.delete(2)
Slide 22
Listen
22
KB
liste.delete(2) – Trace
hilf := knotenItems(pos);
Slide 23
Listen
23
KB
liste.delete(2) – Trace
knotenItems(pos-1).
setNext(knotenItems(pos).getNext);
Slide 24
Listen
24
KB
liste.delete(2) – Trace
hilf.getInhalt.free; hilf.free;
dec(count)
Slide 25
Listen
25
KB
Achtung: liste.delete(0)
knotenItems(pos-1).
setNext(knotenItems(pos).getNext);
Slide 26
Listen
26
KB
Achtung: liste.delete(0)
anfang := knotenItems(pos).getNext
Slide 27
Listen
27
KB
delete – Algorithmus
Slide 28
28
insert – Spezifikation
Listen
procedure TListe.insert
(pos: integer; obj: TObject);
KB
liste.insert(2,o)
Slide 29
Listen
29
KB
liste.insert(2,o) – Trace
danach := knotenItems(pos);
Slide 30
Listen
30
KB
liste.insert(2,o) – Trace
neu := TKnoten.create(danach,obj);
Slide 31
Listen
31
KB
liste.insert(2,o) – Trace
knotenItems(pos-1).setNext(neu);
inc(count);
Slide 32
Listen
32
KB
Vorsicht: liste.insert(0,o)
knotenItems(pos-1).setNext(neu);
Slide 33
Listen
33
KB
insert – Algorithmus
Slide 34
34
Aufgabe
Entwickeln Sie mit Hilfe der Trace-Beispiele die Algorithmen zu
den beiden Operationen delete und insert.
Listen
Erstellen Sie ein neues Delphi-Projekt (in einem neuen Ordner)
und implementieren Sie die Klasse TListe.
KB
Slide 35
Listen
35
KB
Lösung: delete – Algorithmus
procedure TListe.delete(pos: integer);
var hilf: TKnoten;
begin
if 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;
Slide 36
Listen
36
KB
Lösung: insert – Algorithmus
procedure TListe.insert (pos: integer; obj: TObject);
var neu, danach: TKnoten;
begin
if 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;
Slide 37
37
Listentest
Ziel ist es, ein Programm zu erstellen, mit dessen Hilfe die
Implementierung der Klasse „TListe“ gestestet werden
kann.
Listen
Z. B.: Es soll eine Namensliste [Lisa; Anna; ...] erstellt und
angezeigt werden.
KB
Slide 38
Spezialisierung
38
Listen
Allgemeine Liste:
KB
Spezialisierte Liste:
Slide 39
Spezialisierung
39
Liste
anfang: Knoten
Knoten
kennt
kennt
next: Knoten
inhalt:
...
...
hat
Object
ist
Element
Listen
wert: String
KB
create(w: String)
setWert(w: String)
getWert: String
Slide 40
Erzeugung einer Liste
40
liste := TListe.create;
e := TElement.create('Lisa');
liste.insert(0,e);
Listen
e := TElement.create('Anna');
KB
liste.insert(1,e);
...
Slide 41
Anzeige einer Liste
41
Hilfsvariable
h := '';
Listen
for i := 0 to liste.getCount-1 do
begin
w := TElement(liste.items(i)).getWert;
h := h + ' ' + w;
end;
PListe.Caption := h;
Anzeige-Panel
KB
Typumwandlung: TObject TElement
Slide 42
Aufgabe
42
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 Testliste
Listen
Zur Kontrolle: Listen2
KB
Slide 43
Listen
43
KB
Teil 2
Anwendung: Lexikon
Slide 44
Auftrag
Listen
44
Ziel ist es, ein Programm
zur Erstellung und
Benutzung eines Glossars
(Lexikons) zu entwickeln.
KB
Aus:
H. Balzert: Lehrbuch Grundlagen
der Informatik, S. 137.
Slide 45
45
Pflichtenheft
/0/ Das Lexikon ist eine endliche Folge von Einträgen. Jeder
Eintrag liefert eine Erläuterung zu einem Stichwort.
Listen
/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.
KB
Slide 46
Listen
46
KB
Prototyp
Slide 47
Listen
47
OOA
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.
KB
Slide 48
Listen
48
OOD
„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.
KB
Slide 49
Listen
49
KB
Algorithmen
constructor TLexikon.create;
begin
liste := TListe.create(nil);
end;
procedure TLexikon.addEintrag(stichwort, erlaeuterung: string);
var eintrag: TEintrag;
begin
eintrag := TEintrag.create(stichwort,erlaeuterung);
liste.insert(0,eintrag);
end;
Slide 50
Listen
50
KB
Algorithmen
procedure TLexikon.delEintrag(stichwort: string);
var i, position: integer;
begin
position := -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;
Slide 51
Listen
51
KB
Algorithmen
function TLexikon.getErlaeuterung(stichwort: string): string;
var position: integer;
erlaeuterung: string;
begin
erlaeuterung := '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;
Slide 52
52
Aufgabe
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“.
Listen
Zur Kontrolle: siehe Lexikon2
KB
Slide 53
53
Zum Vergleich
Listen
Selbstdefinierte Liste
KB
unit uLexikon;
interface
uses uEintrag, uListe {TListe};
type
TLexikon = class
private
liste: TListe;
public
constructor create;
...
end;
Vordefinierte Liste
unit uLexikon;
interface
uses uEintrag, classes {TList};
type
TLexikon = class
private
liste: TList;
public
constructor create;
...
end;
Slide 54
54
Zum Vergleich
Listen
Selbstdefinierte Liste
KB
constructor TLexikon.create;
begin
liste := TListe.create;
end;
Vordefinierte Liste
// liste := TList.create;
Slide 55
55
Zum Vergleich
Listen
Selbstdefinierte Liste
KB
Vordefinierte Liste
procedure TLexikon.addEintrag(stichwort, erlaeuterung: string);
var eintrag: TEintrag;
begin
eintrag := TEintrag.create(stichwort,erlaeuterung);
liste.insert(0,eintrag);
// liste.Insert(0, eintrag);
end;
Slide 56
56
Zum Vergleich
Listen
Selbstdefinierte Liste
KB
Vordefinierte Liste
procedure TLexikon.delEintrag(stichwort: string);
var i, position: integer;
begin
position := -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;
Slide 57
57
Zum Vergleich
Listen
Selbstdefinierte Liste
KB
Vordefinierte Liste
function TLexikon.getErlaeuterung(stichwort: string): string;
var position: integer;
erlaeuterung: string;
begin
erlaeuterung := '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]
Slide 58
Zum Vergleich
58
Properties
Listen
TListe
KB
TList
- anfang: Knoten
- count: integer
+ Count: integer
+ Items[pos: integer]: Pointer
+ create(k: Knoten)
+ getCount: integer
- knotenItems(pos: integer) : Knoten
+ items(pos: integer): TObject
+ delete(pos: integer)
+ insert(pos: integer; obj: TObject)
+ create
+ Delete(pos: integer)
+ Insert(pos: integer; obj: Pointer)
...
Slide 59
Listen
59
KB
Teil 3
Stapel und Schlangen
Slide 60
Auswertung von Termen
60
Term: ( 7 - 2 ) * 3 =
7
-
Listen
(
7
*
2
(
7
3
)
-
2
-
(
7
(
*
15
=
3
5
KB
5
Operatorenstapel
*
5
Operandenstapel
Slide 61
Stapel
61
erstes
ohneErstes
Listen
mitErstem
LIFO-Prinzip: last in, first out
KB
Slide 62
Modellierung
62
erstes
Listen
mitErstem
Stapel
+ create
+ istLeer: boolean
+ mitErstem(obj: Object)
+ erstes: Object
+ ohneErstes
KB
ohneErstes
Slide 63
Listen
63
KB
Druckerwarteschlange
Druckauftragswarteschlange
Slide 64
Schlange
64
erstes
ohneErstes
Listen
mitLetztem
FIFO-Prinzip: first in, first out
KB
Slide 65
Modellierung
65
erstes
Listen
mitLetztem
Schlange
+ create
+ istLeer: boolean
+ mitLetztem(obj: Object)
+ erstes: Object
+ ohneErstes
KB
ohneErstes
Slide 66
Vereinfachung
66
Im folgenden sollen nur Stapel und Schlangen betrachtet
werden, deren Elemente Zeichenketten sind.
Listen
Stapel
KB
+ create
+ istLeer: boolean
+ mitErstem(s: String)
+ erstes: String
+ ohneErstes
Schlange
+ create
+ istLeer: boolean
+ mitLetztem (s: String)
+ erstes: String
+ ohneErstes
Slide 67
Implementierung
67
unit uStapel;
TStringList
+ Count: integer
+ Strings: array[0..] of string
Listen
+ create
+ delete(p: integer)
+ insert(p: integer; s: String)
...
Stapel
+ create
+ istLeer: boolean
+ mitErstem(s: String)
+ erstes: String
+ ohneErstes
interface
uses classes {TStringList};
type
TStapel = class(TStringList)
private
public
constructor create;
function istLeer: boolean;
procedure mitErstem(s: string);
procedure ohneErstes;
function erstes: string;
end;
implementation
...
KB
Slide 68
Implementierung
68
TStringList
+ Count: integer
+ Strings: array[0..] of string
Listen
+ create
+ delete(p: integer)
+ insert(p: integer; s: String)
...
Stapel
+ create
+ istLeer: boolean
+ mitErstem(s: String)
+ erstes: String
+ ohneErstes
KB
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;
Slide 69
Listen
69
Aufgabe
Implementieren Sie analog die
Klasse Schlange. Benutzen Sie
hierzu die vordefinierte DelphiKlasse 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.
KB
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
Slide 70
Listen
70
KB
Slide 71
Listen
71
KB
Teil 4
Anwendung: Taschenrechner
Slide 72
Auftrag
72
Es soll ein Demo-Taschenrechner erstellt werden, der die
Bearbeitung von Klammertermen veranschaulicht.
Eingabe: ( 7 - 2 ) * 3 =
Listen
Verarbeitung:
7
-
(
7
Ergebnis: (7 - 2) * 3 = 15
KB
2
(
7
)
-
2
-
(
7
(
Slide 73
Pflichtenheft
73
Listen
/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.
KB
Slide 74
Auswertung von Termen
74
Term: ( 7 - 2 ) * 3 =
7
-
Listen
(
7
*
2
(
7
3
)
-
2
-
(
7
(
*
15
=
3
5
KB
5
*
5
Slide 75
Interpreter
75
) * 3 =
termSchlange
operandenStapel
Listen
operatorenStapel
2
-
7
(
'(7-2'
''
Interpreter
KB
Slide 76
OOM
76
) * 3 =
termSchlange
operandenStapel
Listen
operatorenStapel
2
+
7
(
'(7-2)'
''
Interpreter
KB
Slide 77
Aufgabe
77
Ergänzen Sie den Interpretieralgorithmus.
Fall 1:
Das erste Element der TermSchlange ist ein
Gleichheitszeichen und der OperatorenStapel ist
nicht leer:
Listen
=
2
7
'7-2'
''
KB
-
Slide 78
Aufgabe
78
Ergänzen Sie den Interpretieralgorithmus.
Fall 2:
Das erste Element der TermSchlange ist ein
Gleichheitszeichen und der OperatorenStapel ist
leer:
Listen
=
5
'(7-2)'
''
KB
Slide 79
Aufgabe
79
Ergänzen Sie den Interpretieralgorithmus.
Listen
( 7 - 2 ) =
''
''
KB
Fall 3:
Das erste Element der TermSchlange ist
„Klammerauf“:
Slide 80
Aufgabe
80
Ergänzen Sie den Interpretieralgorithmus.
Fall 4:
Das erste Element der TermSchlange ist
„Klammerzu“:
Listen
) =
2
-
7
(
'(7-2'
''
KB
Slide 81
Aufgabe
81
Ergänzen Sie den Interpretieralgorithmus.
Fall 5:
Das erste Element der TermSchlange ist ein
Rechenzeichen:
Listen
- 2 ) =
7
'(7'
''
KB
(
Slide 82
Aufgabe
82
Ergänzen Sie den Interpretieralgorithmus.
Fall 6:
Das erste Element der TermSchlange ist eine
Zahl:
Listen
2) =
7
'(7-'
''
KB
(
Slide 83
83
Aufgabe
Implementieren Sie den Interpreter und testen Sie das
Taschenrechner-Programm.
Listen
Welche Erweiterungen wären wünschenswert?
KB
Slide 84
Lösung
84
Fall 1:
Das erste Element der TermSchlange ist ein Gleichheitszeichen und der
OperatorenStapel ist nicht leer:
Listen
=
2
7
'7-2'
''
KB
-
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);
Slide 85
Lösung
85
Fall 2:
Das erste Element der TermSchlange ist ein Gleichheitszeichen und der
OperatorenStapel ist leer:
hilf := termSchlange.erstes;
termSchlange.ohneErstes;
term := term + hilf;
ergebnis := operandenStapel.erstes;
Listen
=
5
'(7-2)'
''
KB
Slide 86
Lösung
86
Fall 3:
Das erste Element der TermSchlange ist „Klammerauf“:
Listen
( 7 - 2 ) =
''
''
KB
hilf := termSchlange.erstes;
termSchlange.ohneErstes;
term := term + hilf;
token := hilf;
operatorenStapel.mitErstem(token);
Slide 87
Lösung
87
Fall 4:
Das erste Element der TermSchlange ist „Klammerzu“:
Listen
) =
2
-
7
(
'(7-2'
''
KB
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);
Slide 88
Lösung
88
Fall 5:
Das erste Element der TermSchlange ist ein Rechenzeichen:
hilf := termSchlange.erstes;
termSchlange.ohneErstes;
term := term + hilf;
token := hilf;
operatorenStapel.mitErstem(token);
Listen
- 2 ) =
7
'(7'
''
KB
(
Slide 89
Lösung
89
Fall 6:
Das erste Element der TermSchlange ist eine Zahl:
hilf := termSchlange.erstes;
termSchlange.ohneErstes;
term := term + hilf;
token := hilf;
operandenStapel.mitErstem(token);
Listen
2) =
-
7
'(7-'
''
KB
(
Slide 90
Literaturhinweise
90
Helmut Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Ak.
Verlag 1999.
H.-P. Gumm u. M. Sommer: Einführung in die Informatik.
Oldenbourg Verlag 2002.
Listen
...
KB