19
Planung infache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). iskussion des Problems, die Wörter in einem gegeben zu zählen und sie mit ihrer Häufigkeit alphabetisch geordnet auszugeben. ächst: Dateien. Lese aus einer Eingabe-Datei, schre eine Ausgabe-Datei. gramm: nächste Folie.

Planung

  • Upload
    ozzy

  • View
    40

  • Download
    1

Embed Size (px)

DESCRIPTION

Planung. einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text zu zählen und sie mit ihrer Häufigkeit alphabetisch geordnet auszugeben. Zunächst: Dateien. Lese aus einer Eingabe-Datei, schreibe - PowerPoint PPT Presentation

Citation preview

Page 1: Planung

Planung• einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen).• Diskussion des Problems, die Wörter in einem gegebenen Text zu zählen und sie mit ihrer Häufigkeit alphabetisch geordnet auszugeben.

Zunächst: Dateien. Lese aus einer Eingabe-Datei, schreibe in eine Ausgabe-Datei. Programm: nächste Folie.

Page 2: Planung

#include <fstream.h>#include <conio.h>#include <stdlib.h>

const int Max_LG = 30;void main() {

ifstream lesen;ofstream schreiben;char Gelesen[Max_LG];

lesen.open("prog-11.cpp");if (!lesen) {

cout << "Fehler\n";exit(-1);}

schreiben.open("aus.out");if (!schreiben) {

cout << " Fehler\n";exit(-1);}

while (!lesen.eof()) { lesen >> Gelesen; schreiben << Gelesen

<< endl; }

lesen.close();schreiben.close();}

Page 3: Planung

• Benutzung: wie cin • Testen: lesen.eof() (!= 0 genau dann, wenn das Ende der Datei noch nicht erreicht ist)• Nach Benutzung: schließen mit lesen.close()

Zu beachten:• #include <fstream.h> bindet die Bibliothek ein.• ifstream lesen: von der Datei-Variablen lesen soll gelesen werden, sie muß also einen Wert bekommen und zum Lesen geöffnet werden (mit lesen.open("prog-11.cpp"); Erfolg beim Öffnen: lesen != 0, Mißerfolg: lesen == 0 [z.B.: Datei existiert nicht])

• Analog: ofstream für die Ausgabe.

Page 4: Planung

Punkte:• Benutzung von Dateien: wie Standard Ein-/Ausgabe

• ifstream: Eingabe, ofstream: Ausgabe

• Bindung von Datei-Variablen an Dateien beim Öffnen. Schließen der Datei beim Verlassen des entsprechenden Blocks.

• Werden Dateien zum Schreiben geöffnet, so geht ihr vorheriger Inhalt verloren!

Page 5: Planung

Wörter zählenProblem: • zähle die Wörter in einem gegebenen Text• gib sie mit ihrer Häufigkeit alphabetisch geordnet aus

Datenstruktur: (erweiterter) binärer Suchbaum

text

zaehler

LSohn RSohn

struct BinBaum {char text[maxLen];int zaehler;BinBaum * LSohn, *RSohn;

};

Page 6: Planung

Strategie:

• 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

Page 7: Planung

BinBaum * Einfuegen(BinBaum *B, char * k) {void strcpy(char *, char *);int strcmp(char *, char *);

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;}

}

Page 8: Planung

Alphabetisch geordnete Ausgabe?

Durchlaufe den binären Suchbaum mit Wurzel w rekursiv wie folgt:• Durchlauf durch den linken Unterbaum von w• Ausdruck der Wurzel w• Durchlauf durch den rechten Unterbaum von w

Resultat: geordnete Ausgabe

Beispiel:

4 7

617

18

23

26 4 7

6

17

18

23

26

Page 9: Planung

Wie beweist man das?

Durch vollständige Induktion nach der Anzahl der Knoten.

Der Induktionsbeginn (kein Knoten) ist trivial.

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.

Page 10: Planung

void Ausdrucken(BinBaum *K, ofstream *aus) {void KnotenDruck(BinBaum *, ofstream *);

if (K != NULL) {Ausdrucken(K->LSohn, aus);KnotenDruck(K, aus);Ausdrucken(K->RSohn, aus);}

}

Page 11: Planung

void main() {BinBaum * Einlesen(ifstream *), *BST;void Ausdrucken(BinBaum *, ofstream *);ifstream *EingabeDatei;ofstream *Ausgabe = new

ofstream("von.aus");

EingabeDatei = new ifstream("von.txt");if (!EingabeDatei) {

cout << "Problem: Eingabe\n";exit(-1);

}

BST = Einlesen(EingabeDatei);Ausdrucken(BST, Ausgabe);

}

Page 12: Planung

Bemerkenswert:

• Ein- und Ausgabedateien werden als Zeiger auf ifstream und ofstream deklariert.

• beachte die Initialisierung:

ifstream *EingabeDatei;EingabeDatei = new ifstream("von.txt");mit der Variante

ofstream *Ausgabe = new ofstream("von.aus");

Page 13: Planung

BinBaum * Einlesen(ifstream *inp) {

BinBaum *bst = NULL, * Einfuegen(BinBaum *, char *);

char gelesen[maxLen];

*inp >> gelesen;while (!(*inp).eof()) {

bst = Einfuegen(bst, gelesen);*inp >> gelesen;

}return bst;

}

Feinheiten: *inp und (*inp).eof()

Page 14: Planung

Analog: Ausgabe

void KnotenDruck(BinBaum *T, ofstream *aus){void Schreiben(char *, int, ofstream *);Schreiben(T->text, T->zaehler, aus);

}

void Schreiben(char * s, int k, ofstream *aus) {*aus << k << "\t\t\t" << s << endl;

}

Page 15: Planung

Herr von Ribbeck auf Ribbeck im Havelland,Ein Birnbaum in seinem Garten stand,Und kam die goldene HerbsteszeitUnd die Birnen leuchteten weit und breit,Da stopfte, wenn's Mittag vom Turme scholl,Der von Ribbeck sich beide Taschen voll,Und kam in Pantinen ein Junge daher,So rief er: »Junge, wiste 'ne Beer?«Und kam ein Mädel, so rief er: »Lütt Dirn,Kumm man röwer, ick hebb 'ne Birn.«So ging es viel Jahre, bis lobesamDer von Ribbeck auf Ribbeck zu sterben kam.Er fühlte sein Ende. 's war Herbsteszeit,Wieder lachten die Birnen weit und breit;Da sagte von Ribbeck: »Ich scheide nun ab.Legt mir eine Birne mit ins Grab.«Und drei Tage drauf, aus dem Doppeldachhaus,Trugen von Ribbeck sie hinaus,Alle Bauern und Büdner mit FeiergesichtSangen »Jesus meine Zuversicht«,Und die Kinder klagten, das Herze schwer:»He is dod nu. Wer giwt uns nu 'ne Beer?«

1 Trugen1 Turme12 Und1 Wer1 Wieder1 Zuversicht«,1 ab,1 ab.1 alte,1 alten4 auf2 aus1 bat,1 beide1 bis1 breit,1 breit.1 breit;

Page 16: Planung

Durchlauf durch Bäume

4 7

6

17

18

23

26

Diese Art des Durchlaufs heißt Inorder-Durchlauf.

w

BLinks BRechtsInorder ( )

Inorder(Wurzel BLinks)

Druck(w)

Inorder(Wurzel BRechts)

=

Page 17: Planung

w

BLinks BRechtsPräorder( ) Präorder(Wurzel BLinks)

Druck(w)

Präorder(Wurzel BRechts)

=

17

6

4 7

23

18 26

17 # 6 # 4 # 7 # 23 # 18 # 26

Page 18: Planung

w

BLinks BRechtsPostorder ( )

Postorder(Wurzel BLinks)

Druck(w)

Postorder(Wurzel BRechts)=

4 7

6

18 26

23

17

4 # 7 # 6 # 18 # 26 # 23 # 17

Page 19: Planung

Strategie bei allen drei Durchlaufarten heißt Tiefensuche (eswird zunächst in die Tiefe und nicht in die Breite gegangen).

Alternative: Breitensuche - trage den Baum schichtenweise ab.

Beispiel:

17

6 23

4 7 18 26

17 # 6 # 23 # 4 # 7 # 18 # 26

Implementation?