EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Gliederung Kapitel 9 Einfache Dateibehandlung Beispiel: Wörter zählen –Problem, Datenstruktur –Einfügen: Strategie + Implementierung –Alphabetisch geordnete Ausgabe: Strategie + Impl. Durchlaufstrategien –In die Tiefe Inorder Präorder Postorder –In die Breite
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Dateien Einfache Dateibehandlung –(externe Dateien, Öffnen, Lesen/Schreiben, Schließen). –Am Beispiel: Problem, die Wörter in einem gegebenen Text zu zählen und sie mit ihrer Häufigkeit alphabetisch geordnet auszugeben. Zunächst: Dateien Lies aus einer Eingabe-Datei, schreibe in eine Ausgabe-Datei. Am elementaren Beispiel. Programm
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Dateien #include bindet die Bibliothek zur Dateibehandlung ein Bindung von Datei-Variablen (im Programm) an Dateien (im Dateisystem) beim Öffnen der Datei. ifstream *Eingabedatei; EingabeDatei = new ifstream (inpDat); Benutzung von Dateien: wie Standard Ein-/Ausgabe –ifstream : Eingabe - ofstream : Ausgabe Benutzung: wie cin –*Eingabedatei >> gelesen;
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Dateien Testen: !(*Eingabedatei).eof() (liefert "true" genau dann, wenn das Ende der Datei noch nicht erreicht ist; eof: end of file) Analog: ofstream *AusgabeDatei; Werden Dateien zum Schreiben geöffnet, so geht meist ihr vorheriger Inhalt verloren.
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Wörter zählen Problem: –zähle die Wörter in einem gegebenen Text, –gib sie mit ihrer Häufigkeit alphabetisch geordnet aus. Datenstruktur: –binärer Suchbaum (--> Wörter lassen sich ordnen) –erweitert um einen Zähler.
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Datenstruktur zum Zählen von Wörtern text zaehler LSohnRSohn struct BinBaum { char text[maxLen]; int zaehler; BinBaum * LSohn, *RSohn; } ;
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Strategie zum Einfügen Suchen nach einer Zeichenkette im binären Suchbaum –Zeichenkette nicht gefunden: neuen Knoten einfügen, Zähler zu 1 initialisieren –Zeichenkette gefunden: Zähler um 1 erhöhen
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich void strcpy(char *, char *); int strcmp(char *, char *); BinBaum * Einfuegen(BinBaum *B, char * k) { if (B == NULL) { BinBaum *Hilf = new BinBaum; strcpy(Hilf->text, k); Hilf->zaehler = 1; Hilf->LSohn = Hilf->RSohn = NULL; return Hilf; } else { int Vergl = strcmp(B->text,k); if (Vergl < 0) B->RSohn = Einfuegen(B->RSohn, k); else if (Vergl > 0) B->LSohn = Einfuegen(B->LSohn, k); else if (Vergl == 0) B->zaehler += 1; return B; } Text noch nicht gesehen Text bekannt: einfügen, Zähler erhöhen
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Alphabetisch geordnete Ausgabe Behauptung: Nachfolgender Durchlauf liefert als Resultat: –geordnete Ausgabe Durchlaufstrategie: –Durchlaufe den binären Suchbaum mit Wurzel w rekursiv wie folgt: Durchlauf durch den linken Unterbaum von w Ausdruck (der Nutzinfo) der Wurzel w Durchlauf durch den rechten Unterbaum von w
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Beispiel (Baumdurchlauf)
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Beweis Durch vollständige Induktion nach der Anzahl der Knoten –Der Induktionsbeginn (kein Knoten) ist erfüllt –Der Induktionsschritt: der linke Unterbaum wird geordnet ausgegeben (IV), dann wird die Wurzel ausgegeben, dann wird der rechte Unterbaum geordnet ausgegeben (IV). (Die Wurzel steht bzgl. der Ordnung "in der Mitte".)
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Programmtext: Ausdrucken void KnotenDruck(BinBaum *, ofstream *); void Ausdrucken(BinBaum *K, ofstream *aus) { if (K != NULL) { Ausdrucken(K->LSohn, aus); KnotenDruck(K, aus); Ausdrucken(K->RSohn, aus); } } Programm
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Anmerkungen Zugriff auf Ein- und Ausgabedateien wird über Zeiger auf ifstream- und ofstream- Variablen bewirkt. Initialisierungen –EingabeDatei = new ifstream(inpDat); –AusgabeDatei = new ofstream(outpDat); Varianten (Ausgabedateien als Konstante bekannt) z.B.: –ofstream *Ausgabe = new ofstream("von.aus");
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich BinBaum * Einfuegen(BinBaum *, char *); BinBaum * Einlesen(ifstream *inp) { BinBaum *bst = NULL; char gelesen[maxLen]; *inp >> gelesen; while (!(*inp).eof()) { bst = Einfuegen(bst, gelesen); *inp >> gelesen; } return bst; } Feinheiten: *inp und (*inp).eof()
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Analog: Ausgabe void Schreiben(char *, int, ofstream *); void KnotenDruck(BinBaum *T, ofstream *aus){ Schreiben(T->text, T->zaehler, aus); } void Schreiben( char * s, int k, ofstream *aus ){ *aus << k << "\t\t\t" << s << endl; }
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Durchlauf durch Bäume Diese Art des Durchlaufs heißt Inorder-Durchlauf. w BLinksBRechts Inorder () Inorder(Wurzel BLinks) Druck(w) Inorder(Wurzel BRechts) =
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich w BLinksBRechts Präorder () Präorder(Wurzel BLinks) Druck(w) Präorder(Wurzel BRechts) =
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich w BLinks BRechts Postorder ( ) Postorder(Wurzel BLinks) Druck(w) Postorder(Wurzel BRechts) =
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Durchlaufstrategien Strategie bei allen drei Durchlaufarten heißt Tiefensuche: Es wird zunächst in die Tiefe und nicht in die Breite gegangen. Alternative: Breitensuche Trage den Baum "schichtenweise" ab.
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Beispiel Breitensuche
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Idee zur Implementation Verwalte die Knoten in einer "Warteschlange" ein Knoten wird gedruckt seine Söhne werden in die Warteschlange eingefügt bis die Warteschlange leer ist Initialisierung der Warteschlange mit der Wurzel des Baums.
Kap 9: DurchlaufstrategienVorl EINI-I"Prof. Dr. G. Dittrich Beispiel