Listen

Post on 22-Mar-2016

44 views 2 download

description

Listen. Klaus Becker 2003. Listen. Ansgar A., Speyer Claudia B., Koblenz Knut B., Neustadt Annett B., Wörrstadt Stefani D., Bad Ems Jochen F., Ludwigshafen ... ... Wieland S., Trier Harald T.-R., Biesdorf. Teil 1. Objektorientierte Modellierung und Implementierung von Listen. - PowerPoint PPT Presentation

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....