planung
Download
Skip this Video
Download Presentation
Planung

Loading in 2 Seconds...

play fullscreen
1 / 19

Planung - PowerPoint PPT Presentation


  • 103 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Planung' - ozzy


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
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.

slide2

#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();

}

slide3

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])
  • Benutzung: wiecin
  • Testen: lesen.eof() (!= 0 genau dann, wenn das Ende der Datei noch nicht erreicht ist)
  • Nach Benutzung: schließen mit lesen.close()
  • Analog: ofstream für die Ausgabe.
slide4

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!
w rter z hlen
Wörter zählen
  • Problem:
  • zähle die Wörter in einem gegebenen Text
  • gib sie mit ihrer Häufigkeit alphabetisch geordnet aus

Datenstruktur: (erweiterter) binärer Suchbaum

text

struct BinBaum {

char text[maxLen];

int zaehler;

BinBaum * LSohn, *RSohn;

};

zaehler

LSohn

RSohn

slide6

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
slide7

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;

}

}

slide8

17

6

23

4

7

18

26

Alphabetisch geordnete Ausgabe?

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

Resultat: geordnete Ausgabe

Beispiel:

17

6

23

4

7

18

26

slide9

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.

slide10

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

void KnotenDruck(BinBaum *, ofstream *);

if (K != NULL) {

Ausdrucken(K->LSohn, aus);

KnotenDruck(K, aus);

Ausdrucken(K->RSohn, aus);

}

}

slide11

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

}

slide12

mit der Variante

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

Bemerkenswert:

  • Ein- und Ausgabedateien werden als Zeiger auf ifstream und ofstream deklariert.
  • beachte die Initialisierung:

ifstream *EingabeDatei;

EingabeDatei = new ifstream("von.txt");

slide13

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()

slide14

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;

}

slide15

Herr von Ribbeck auf Ribbeck im Havelland,

Ein Birnbaum in seinem Garten stand,

Und kam die goldene Herbsteszeit

Und 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 lobesam

Der 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 Feiergesicht

Sangen »Jesus meine Zuversicht«,

Und die Kinder klagten, das Herze schwer:

»He is dod nu. Wer giwt uns nu \'ne Beer?«

1 Trugen

1 Turme

12 Und

1 Wer

1 Wieder

1 Zuversicht«,

1 ab,

1 ab.

1 alte,

1 alten

4 auf

2 aus

1 bat,

1 beide

1 bis

1 breit,

1 breit.

1 breit;

durchlauf durch b ume

Inorder(Wurzel BLinks)

w

(

)

Druck(w)

Inorder

BLinks

BRechts

Inorder(Wurzel BRechts)

Durchlauf durch Bäume

17

Diese Art des Durchlaufs

heißt Inorder-Durchlauf.

6

23

4

7

18

26

=

slide17

w

(

)

Präorder

BLinks

BRechts

Druck(w)

=

Präorder(Wurzel BLinks)

Präorder(Wurzel BRechts)

17

6

23

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

4

7

18

26

slide18

w

BLinks

BRechts

Postorder(Wurzel BLinks)

)

(

=

Postorder(Wurzel BRechts)

Postorder

Druck(w)

17

6

23

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

4

7

18

26

slide19

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.

Beispiel:

17

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

6

23

4

7

18

26

Implementation?

ad