Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido

Ähnliche Präsentationen


Präsentation zum Thema: "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido"—  Präsentation transkript:

1 EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido dittrich@cs.uni-dortmund.de

2 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 2 1.2.2000 Gliederung Kapitel 10 Beispiel: Warteschlange –Ansatz zur Realisierung –struct Warteschlange, Impl. von Operationen –Benutzung von "Warteschlange" Warteschlange als ADT (abstrakter Datentyp) –private - public –Neuimplementierung mit Anmerkungen –Anmerkung zu ADTs Breitensuche in binären Bäumen –unter Verwendung von Warteschlangen

3 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 3 1.2.2000 Realisierung von Warteschlangen Arbeitsweise –Einfügen von Elementen am Ende –Entfernen von Elementen am Anfang –Initialisierung ausgezeichnete Elemente Kopf und Fuß Liste von Elementen –(möchte mich nicht am Anfang auf eine feste Anzahl von Elementen festlegen; sonst: Feld möglich)

4 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 4 1.2.2000 Realisierung von Warteschlangen Operationen: –Einfügen am Ende –Entfernen am Anfang –Initialisierung -............. Wunsch nach Verkapselung: –Daten und Operationen zusammen behandeln Annahme: Nutzelemente sind ganze Zahlen. Also Listenelemente : struct IntListe { int Element; IntListe * weiter; };

5 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 5 1.2.2000 Zur Realisierung DieListe KopfFuss struct Warteschlange { IntListe * DieListe; IntListe * Kopf, * Fuss; Einfuegen(int)IntListe * Einfuegen(int); Entfernen()IntListe * Entfernen(); Init()IntListe * Init(); DerKopf()int DerKopf(); ListenDruck(...) Warteschlange void ListenDruck (ofstream *); };

6 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 6 1.2.2000 Konsequenz Kapselung: Gemeinsames Deklarieren von –Daten für die Operationen –Signatur der Operationen auf den Daten Vorteile: –alle Eigenschaften in einer einzigen Struktur (hier: des Datentyps Warteschlange) –-->: Lokalität der Änderungen Übersichtlichkeit Verständlichkeit

7 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 7 1.2.2000 Vereinbarung der Warteschlange Problem: –Es fehlt noch der Code für die Operationen. Lösung: –Der Code wird getrennt von der struct -Definition angegeben. In Analogie zu: –Angabe der Signatur der benutzten Funktionen als Funktionsprototypen, davon getrennte Angabe des Codes.

8 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 8 1.2.2000 Vereinbarung IntListe * Warteschlange :: Init() { Kopf = Fuss = NULL; return Kopf; }; Typ des Rückgabewerts Name des Typs Name der Funktion das zum Typ Warteschlange gehörende Init

9 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 9 1.2.2000 Anmerkungen struct bildet Namensraum: –Die in der struct -Definition definierten Namen (z. B. Kopf, Fuss ) sind hier sichtbar. Bei Definition einer Funktion muß der Name der struct mit angegeben werden, um die Zuordnung zu ermöglichen. –Z.B. kann Init ja auch bei anderen Typen vorkommen.

10 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 10 1.2.2000 Weitere Beispiele int Warteschlange::DerKopf() { return (DieListe == NULL ? -1 : DieListe->Element); }; void Warteschlange::ListenDruck(ofstream *aus) { IntListe * Laeufer = Kopf; *aus << endl; while (Laeufer != NULL) { *aus Element << " # "; Laeufer = Laeufer->weiter; } *aus << endl; };

11 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 11 1.2.2000 Weitere Beispiele IntListe * Warteschlange::Entfernen() { if (Kopf == NULL) DieListe = NULL; return NULL; else { if (Kopf == Fuss) { Kopf = Fuss = NULL; } else { Kopf = Kopf->weiter; } DieListe = Kopf; return DieListe; } }; Name einer struct Qualifizierungs- zeichen In der struct sichtbare Größen

12 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 12 1.2.2000 Benutzung der Warteschlange Definition der Warteschlange W Benutzung der Operationen durch qualifizierten Zugriff void main() { ofstream *out = new ofstream("aus.aus"); Warteschlange W; W.Init(); for (int i=1; i < 10; i++) W.Einfuegen(i); W.ListenDruck(out); }

13 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 13 1.2.2000 IntListe * Warteschlange::Einfuegen(int i) { IntListe *K = new IntListe; K->Element = i; K->weiter = NULL; if (DieListe == NULL){ Kopf = K; Kopf->weiter = Fuss; } else if (Fuss == NULL){ Kopf->weiter = K; Fuss = K; } else { Fuss->weiter = K; Fuss = K; } DieListe = Kopf; return DieListe; }; Weitere Beispiele

14 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 14 1.2.2000 Zugriff über Qualifikation void main() { ofstream *out = new ofstream("aus.aus"); Warteschlange W; W.Init(); for (int i=1; i < 10; i++) W.Einfuegen(i); W.ListenDruck(out); W.Einfuegen(117); *out << "\nNach Einfuegen von 117: " << endl; W.ListenDruck(out); *out << "\nKopf: " << W.DerKopf() << endl; W.Entfernen(); *out << "\nNach Entfernen des ersten Elements: "; W.ListenDruck(out); *out << "\nKopf: " << W.DerKopf() << endl; } Definition der Warteschlange

15 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 15 1.2.2000 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # Nach Einfuegen von 117: 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 117 # Kopf: 1 Nach Entfernen des ersten Elements: 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 117 # Kopf: 2 Programm Ausgabe

16 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 16 1.2.2000 Beobachtungen Die "Interna" (hier: Kopf, Fuss, DieListe ) werden "außen" überhaupt nicht benötigt. Diese Interna könnten/sollten privat, d.h. verborgen bleiben Zugriff von außen nur über die entsprechenden Operationen

17 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 17 1.2.2000 Abstrakter Datentyp Warteschlange als eine Art Datenkapsel mit – internem Zustand ( Kopf, Fuss, DieListe ) – Zugriffsoperationen ( Einfuegen etc.) – Zustand von außen nur über Zugriffsfunktionen änderbar, nicht direkt!

18 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 18 1.2.2000 innerer Zustand (verborgen) Zugriff und Änderung nur durch wohldefinierte Operationen

19 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 19 1.2.2000 Operationen auf Warteschlangen DieListe KopfFuss Einfuegen(int) Entfernen() Init() DerKopf() ListenDruck(...) privat öffentlich

20 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 20 1.2.2000 Neudeklaration struct Warteschlange { private: IntListe * DieListe; IntListe * Kopf, * Fuss; public: void Einfuegen(int); void Entfernen(); void Init(); int DerKopf(); void ListenDruck(ofstream *); }; neu beachte: void Programm

21 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 21 1.2.2000 Anmerkungen public –bewirkt, daß auf die darauf folgenden Namen von außen zugegriffen werden darf; dies geschieht durch Qualifikation. private –bewirkt, daß die darauf folgenden Namen vor dem expliziten Zugriff von außen (durch Qualifikation) geschützt sind.

22 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 22 1.2.2000 Beispiel Warteschlange W sei definiert Legal sind z.B.: –W.Init() –W.Einfuegen(45) –W.DerKopf() Illegal sind z.B.: - W.Kopf - W.DieListe - W.Fuss

23 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 23 1.2.2000 Ein Rückgabewert impliziert die Weitergabe von interner Strukturinformation nach außen. Dies kann unerwünscht sein. --> Datenkapselung. Wieso void?

24 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 24 1.2.2000 void Warteschlange::Einfuegen(int i) { IntListe *K = new IntListe; K->Element = i; K->weiter = NULL; if (DieListe == NULL){ Kopf = Fuss = K; } else { Fuss->weiter = K; Fuss = K; } DieListe = Kopf; }; Änderungen: Typ der Rückgabe ist void ; return eliminiert Änderungen: Typ der Rückgabe ist void ; return eliminiert IntListe * Warteschlange::Einfuegen(int i){ IntListe *K = new IntListe; K->Element = i; K->weiter = NULL; if (DieListe == NULL){ Kopf = K; Kopf->weiter = Fuss; } else if (Fuss == NULL){ Kopf->weiter = K; Fuss = K; } else { Fuss->weiter = K; Fuss = K; } DieListe = Kopf; return DieListe; }; Änderungen: Typ der Rückgabe wird void ; return eliminiert Änderungen: Typ der Rückgabe wird void ; return eliminiert IntListe * Warteschlange::Einfuegen(int i){ IntListe *K = new IntListe; K->Element = i; K->weiter = NULL; if (DieListe == NULL){ Kopf = Fuss = K; } else { Fuss->weiter = K; Fuss = K; } DieListe = Kopf; return DieListe; };

25 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 25 1.2.2000 Anmerkung: Trick Kopf ist als privat deklariert –auf Kopf kann also von außen nicht zugegriffen werden, –kann also Kopf weder lesen noch von außen verändern. Trick: definiere eine öffentliche Zugriffsfunktion DerKopf () –damit kann ich den Wert von Kopf lesen –analog: schreiben.

26 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 26 1.2.2000 Warteschlange als abstrakter Datentyp Warteschlange wurde hier als abstrakter Datentyp (ADT) definiert. ADTs sind charakterisiert durch – Offenlegen der Schnittstellen (Signaturen) – Verbergen der Implementation (d.h. Zugriff nur über wohldefinierte Operationen) Wichtige Konstruktion in der Softwaretechnik, insb. im objektorientierten Entwurf. Wichtig im nächsten Semester.

27 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 27 1.2.2000 Zurück zur Breitensuche Strategie –Verwendung einer Warteschlange Q, die aus Knoten des Baums besteht, –Füge zunächst den Wurzelknoten in Q ein, der Kopf K von Q wird gedruckt. nach dem Druck: –ist K.LSohn != NULL, so wird dieser Knoten in Q eingefügt, –ist K.RSohn != NULL, so wird dieser Knoten in Q eingefügt, das geschieht solange, bis Q leer ist

28 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 28 1.2.2000 Änderung im Typ des Listen- elements Anpassung der Datentypen struct BinBaum { char text[maxLen]; int zaehler; BinBaum * LSohn, *RSohn; }; struct BaumListe { BinBaum * Element; BaumListe * weiter; }; struct Warteschlange { private: BaumListe * DieListe; BaumListe * Kopf, * Fuss; public: void Einfuegen(BinBaum *); void Entfernen(); void Init(); int IstLeer(); BinBaum * DerKopf(); };

29 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 29 1.2.2000 Zentrale Prozedur void KnotenDruck(BinBaum *, ofstream *); void BreitenSuche(BinBaum *K, ofstream *aus) { Warteschlange W; W.Init(); W.Einfuegen(K); while (!W.IstLeer()) { BinBaum *L = W.DerKopf(); W.Entfernen(); W.Einfuegen(L->LSohn); W.Einfuegen(L->RSohn); KnotenDruck(L, aus); } } Programm:

30 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 30 1.2.2000 Suche in WWW-Seiten. K1 K1.1 K1.2 K1.3 K1.1.1 K1.1.2 K1.1.3 usw. Weitere Anwendung: WWW-Seite enthält eingebettete Links. Annahme: in Kapiteln organisiertes "Buch".

31 Kap 10: Warteschlange als ADTVorl EINI-I"Prof. Dr. G. Dittrich 31 1.2.2000 Hierarchische Struktur K1 K1.1K1.2 K1.1.1K1.1.2K1.1.3 ETC. Breitensuche: liest erst alle Kapitel, bevor die einzelnen Unterkapitel gelesen werden (z.B. Überblick) Tiefensuche: geht in die Tiefe, z. B. gezieltere Suche


Herunterladen ppt "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido"

Ähnliche Präsentationen


Google-Anzeigen