EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio...

32
EINI-I EINI-I Einführung in die Einführung in die Informatik Informatik für Naturwissenschaftler für Naturwissenschaftler und Ingenieure I und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido [email protected]

Transcript of EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio...

Page 1: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

EINI-IEINI-IEinführung in die Informatik Einführung in die Informatik für Naturwissenschaftler und für Naturwissenschaftler und

Ingenieure IIngenieure I

Kapitel 9

Claudio Moraga; Gisbert Dittrich

FBI Unido

[email protected]

Page 2: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

2

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Gliederung Kapitel 9Gliederung Kapitel 9

• Einfache Dateibehandlung• Beispiel: Wörter zählen

– Problem, Datenstruktur – Einfügen: Strategie + Implementierung– Alphabetisch geordnete Ausgabe: Strategie + Impl.

• Durchlaufstrategien bei Bäumen– In die Tiefe

• Inorder • Präorder • Postorder

– In die Breite

Page 3: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

3

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

DateienDateien

• 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

Page 4: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

4

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

DateienDateien

• #include <fstream.h>

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

• Benutzung von Dateien: wie Standard Ein-/Ausgabe

– ifstream: Eingabe - ofstream: Ausgabe

• Benutzung: wie cin (bzw. cout)– *Eingabedatei >> gelesen;

Page 5: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

5

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

DateienDateien

• Testen: (*Eingabedatei).eof() (liefert "true" genau dann, wenn das Ende der Datei

erreicht ist; eof: end of file)!(*Eingabedatei).eof() (liefert "true" genau dann, wenn das Ende der Datei

noch nicht erreicht ist)

• Analog: ofstream *AusgabeDatei;

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

Page 6: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

6

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

// K9-P1// Elementare Verwendung von Dateien// Vorsicht: nicht robust

#include <iostream.h>#include <fstream.h>

const int maxLen = 70;

void Einlesen(ifstream *, ofstream *);void Schreiben(char * , ofstream *);

1

Page 7: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

7

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

main() {ifstream *EingabeDatei;ofstream *AusgabeDatei;char EinDat[80], AusDat[80];cout << "bitte Eingabedatei angeben: "; cin >> EinDat;cout << "bitte AusgabeDatei angeben: "; cin >> AusDat;cout << "Danke" << endl;EingabeDatei = new ifstream(EinDat);AusgabeDatei = new ofstream(AusDat);Einlesen(EingabeDatei, AusgabeDatei);

cout << "fertig" << endl;}

2

Page 8: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

8

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

void Einlesen(ifstream *ein, ofstream *aus) {char gelesen[maxLen];*ein >> gelesen;while (!(*ein).eof()) {

cout << "gelesen: " << gelesen << "\t\t\t\t";

Schreiben (gelesen, aus);*ein >> gelesen;

}}void Schreiben(char *Wort, ofstream *aus) {

if (Wort != NULL) {

*aus << Wort << endl; // Wort mit ..... //..Zeilenumbruch in die Datei schreiben.cout << "geschrieben: " << Wort << endl;

// Wort mit Zeilenumbruch ... //..auf den Bildschirm schreiben.

}} // 3Ausführen

Page 9: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

9

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Wörter zählenWö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.

Page 10: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

10

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Datenstruktur zum Zählen von WörternDatenstruktur zum Zählen von Wörtern

text

zaehler

LSohn RSohn

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

};

Page 11: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

11

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Strategie zum EinfügenStrategie 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

Page 12: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

12

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

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;B = Hilf; Hilf = NULL;}

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ählererhöhen

Page 13: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

13

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Alphabetisch geordnete AusgabeAlphabetisch 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

Page 14: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

14

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Beispiel (Baumdurchlauf)Beispiel (Baumdurchlauf)

4 7

6

17

18

23

26

4 6 7 17 18 23 26

4 7

17

18

23

26

6

Page 15: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

15

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

BeweisBeweis

• 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".)

Page 16: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

16

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Programmtext: Programmtext: AusdruckenAusdrucken

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

Page 17: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

17

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

AnmerkungenAnmerkungen

• Zugriff auf Ein- und Ausgabedateien wird über Zeiger auf ifstream- und ofstream-Variablen bewirkt.

• Initialisierungen– EingabeDatei = new ifstream(EinDat);– AusgabeDatei = new ofstream(AusDat);

• Varianten (Ausgabedateien als Konstante bekannt) z.B.: – ofstream *Ausgabe = new ofstream("von.aus");

Page 18: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

18

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

BinBaum * Einfuegen(BinBaum *, char *);BinBaum * Einlesen(ifstream *ein) {

BinBaum *bst = NULL;char gelesen[maxLen];

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

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

}return bst;

}

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

Page 19: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

19

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Analog: AusgabeAnalog: 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;}

Page 20: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

20

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

// K9-P2 Binärer Suchbaum//#include <iostream.h>#include <fstream.h>#include <string.h> // beinhaltet void strcpy(char *, char *); // und int strcmp(char *, char *);

const int maxLen = 70;

struct BinBaum {

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

};// 1

Bibliothek für die DateibehandlungBibliothek für die Dateibehandlung

Page 21: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

21

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

// Funktionsprototypen

BinBaum * Einlesen(ifstream *);BinBaum * Einfuegen(BinBaum *, char *);void Ausdrucken(BinBaum *, ofstream *);void KnotenDruck(BinBaum *, ofstream *);void Schreiben(char * , int , ofstream *);

// 2

Page 22: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

22

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

main() {BinBaum *BST;ifstream *EingabeDatei;ofstream *AusgabeDatei;char EinDat[80], AusDat[80];

cout << "bitte Eingabedatei angeben: "; cin >> EinDat;cout << "bitte AusgabeDatei angeben: "; cin >> AusDat;cout << "Danke" << endl;EingabeDatei = new ifstream(EinDat);AusgabeDatei = new ofstream(AusDat);

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

cout << "fertig" << endl;} // 3

Page 23: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

23

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

BinBaum * Einlesen(ifstream *ein) {

BinBaum *bst = NULL; char gelesen[maxLen];

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

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

};return bst;

}

// 4

Page 24: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

24

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

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;B = Hilf; Hilf = NULL;}

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

Page 25: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

25

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

void Ausdrucken(BinBaum *K, ofstream *aus) {if (K != NULL) {

Ausdrucken(K->LSohn, aus);KnotenDruck(K, aus);Ausdrucken(K->RSohn, aus);}

}

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;

} // 6

Page 26: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

26

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Durchlauf durch BäumeDurchlauf 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)

=

4 6 7 17 18 23 26

Page 27: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

27

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

w

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

Druck(w)

Präorder(Wurzel BRechts)

=

17 6 4 7 23 18 2617

6

4 7

23

18 26

Page 28: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

28

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

w

BLinks BRechts

Postorder( )Postorder(Wurzel BLinks)

Druck(w)

Postorder(Wurzel BRechts)=

4 7

6

18 26

23

174 7 6 18 26 23 17

Page 29: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

29

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

DurchlaufstrategienDurchlaufstrategien

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

Page 30: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

30

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Beispiel BreitensucheBeispiel Breitensuche

6 23

4 7 18 26

17

17 6 23 4 7 18 26

Page 31: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

31

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

Idee zur ImplementationIdee 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.

Page 32: EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de.

32

Kap 9: Durchlaufstrategien Vorl “EINI-I"

09.01.2001

BeispielBeispiel

17 6 23 4 7 18 26

17

6 23

4 7 18 26