Kapitel 8: Abstrakte Datentypen. Inhalt. Definition ADT Keller ADT Schlange

Ähnliche Dokumente
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Kapitel 8: Elementare Datenstrukturen. Inhalt. Definition ADT Keller ADT Schlange ADT Liste ADT Binärbaum

Einführung in die Programmierung Wintersemester 2008/09

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 23

Einführung in die Programmierung

Einführung in die Programmierung

Einführung in die Programmierung Wintersemester 2017/18

Einführung in die Programmierung Wintersemester 2016/17

Einführung in die Programmierung Wintersemester 2018/19

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 WIng Bachelor 6. Aufgabenblatt Zeiger, verkettete Liste, Dateieingabe und -ausgabe

Hochschule Darmstadt Informatik-Praktikum SS 2017 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Programmieren in C/C++ und MATLAB

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Grundlagen der Informatik 6. Arrays I

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

ios fstream ifstream

Programmierkurs Kapitel 4: Dateien Seite 1. Verwaltungfeld im Speicher. 4.1 Alternativen zur Programmierung der Eingabe und der Ausgabe

Kapitel 2/3: Darstellung von Information / Kontrollstrukturen. Inhalt. Zusammengesetzte Datentypen Wiederholungen (in Programmen)

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Ein- und Ausgabe in Dateien (File I/O)

Die elementare Ausgabe von Daten auf externe Medien, wie Dateien und das Einlesen davon wird demonstriert.

Kapitel 7: Rekursion. Inhalt. Rekursion: Technik Rekursion vs. Iteration

Informatik 1 D- ITET. Übung 9. Christoph Zimmerli Büro: IFW D46.2 hcp://blogs.ethz.ch/infitet09/

Algorithmen und Datenstrukturen

15. Die Klasse string

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Hydroinformatik I: IO - Files

Ausnahmebehandlung I

Einführung in die Programmierung mit C++

Im Windows Betriebssystem sind Dateien eindeutig gekennzeichnet durch ihren Pfad, Dateinamen und nach einem Punkt die Dateierweiterung.

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Programmierung Wintersemester 2011/12

Einführung in die Programmierung Wintersemester 2016/17

4 Schleifen und Dateien

Informatik II Datenstrukturen und Algorithmen in C/C++ Nachtrag

Einführung in die Programmierung Wintersemester 2011/12

Entwickeln Sie ein C/C++-Programm für die Verwaltung einer Artikeldatei gemäß folgender Vorgaben!

Vorlesung Datenstrukturen

Vorlesungsprüfung Programmiersprache 1

Informatik. Wiederholung Felder (Arrays), string. Vorlesung

Quiz und Übungen. C++ Übung am 19. Mai 2016

Einführung in die Programmierung Wintersemester 2008/09

Streams, Kodierung und Funktionen. C++ Übung am 12. Mai 2016

Einführung in die Programmierung

Objektorientierte Programmierung mit C++ SS 2007

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Programmier-Befehle - Woche 08

Einführung in die Programmierung (EPR)

C++ für Ingenieure. Einführung in die objektorientierte Programmierung 4 Objektorientierte Programmierung. 4.8 Streams und Dateien HARALD NAHRSTEDT

Polymorphismus 44. Function.hpp. #include <string>

Einführung in die Programmierung

For matierte Ein-/Ausgabe iostream: multiple inheritance von istream und ostream Weitere abgeleitete Klassen (z. B. Ausgabe nach Strings)

Praxis der Programmierung

Probeklausur Name: (c)

Klausur Programmieren 2 SS 2016

Inhalt Streams Eingabe / Ausgbe in C Dateizugriff in C Eingabe / Ausgabe in C++ Dateizugriff in C++ Error Handling

Kapitel 11: Vererbung Ziele von Klassen Einführung in die Informatik für struct Naturwissenschaftler und Ingenieure

Kapitel 5: Funktionen. Inhalt

Polymorphismus 179. Function.h. #include <string>

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Grundlagen der Informatik

Dateizugriff unter C

Ein- und Ausgabe mit Dateien

Tutoraufgabe 1 (2 3 4 Bäume):

Ein-/Ausgabe, Dateisystem. Kapitel 9: Ein-/Ausgabe. Programmieren in C für Elektrotechniker. Programmieren in C. Dateisystem. Programmieren in C

7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Programmieren in C++ Stream I/O

Kapitel 2: Darstellung von Information. Inhalt. Einfache Datentypen (Fortsetzung) Erste Programme (mit Ausgabe) Exkurs: Grammatiken

Grundlagen der Informatik 2. Typen

Ein- und Ausgabe (I/O)

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1

Programmieren in C++

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Grundlagen der Informatik 12. Strukturen

C++ Teil 7. Sven Groß. 3. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni / 16

Tutoraufgabe 1 (Implementierung eines ADTs):

Centrum für Informations- und Sprachverarbeitung SoSe 2018: Höhere Programmierung mit C++ Andreas Krieger. Musterlösung 7. Aufgabe 7.

C++ Teil 8. Sven Groß. 5. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 8 5. Dez / 16

Informatik 1 ( ) D-MAVT F2010. Schleifen, Felder. Yves Brise Übungsstunde 5

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Zeiger und dynamischer Speicher

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Geordnete Binärbäume

Einführung in I/O und File-Handling in C ++

7.1 Motivation. Tastatureingabe. Inhalt von input.txt. Bildschirmausgabe. Inhalt von output.txt. i =33 j = 44

Verwenden Sie für jede Aufgabe die C++ IDE von Eclipse (pro Aufgabe ein Projekt).

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Transkript:

Wintersemester 005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl für Algorithm Engineering Inhalt Definition ADT Keller ADT Schlange - Exkurs: Dynamischer Speicher (new / delete) ADT Liste ADT Binärbaum - - Exkurs: Strings (C++) endlich! Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen ADT Binäre Bäume: Terminologie keine Wurzel und kein Blatt ADT Binäre Bäume: Datenstruktur Wurzel innerer Knoten struct BinTree { T data; BinTree *ltree, *rtree; ; // Nutzdaten // linker und rechter Unterbaum Falls ein Unterbaum nicht existiert, dann zeigt der Zeiger auf 0. L linker Unterbaum R rechter Unterbaum Blätter bool IsElement(int key, BinTree *tree) { if (tree == 0) return false; if (tree->data == key) return true; if (tree->data < key) return IsElement(key, tree->rtree); return IsElement(key, tree->ltree); Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 3 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 4

ADT Binäre Bäume: Einfügen BinTree *Insert(int key, BinTree *tree) { if (tree == 0) { BinTree *b = new BinTree; b->data = key; b->ltree = b->rtree = 0; return b; else { if (tree->data < key) tree->rtree = Insert(key, tree->rtree); else if (tree->data > key) tree->ltree = Insert(key, tree->ltree); return tree; ADT Binäre Bäume: Aufräumen void Clear(BinTree *tree) { if (tree == 0) return; // Rekursionsabbruch Clear(tree->lTree); // linken Unterbaum löschen Clear(tree->rTree); // rechten Unterbaum löschen delete tree; // aktuellen Knoten löschen u.s.w. 1 0 18 19 7 17 16 8 9 3 6 4 5 10 15 1 13 11 14 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 5 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 6 ADT Binäre Bäume ADT Binäre Bäume 1 3 4 Höhe := Länge des längsten Pfades von der Wurzel zu einem Blatt. Höhe(leerer Baum) = 0 Höhe(nicht leerer Baum) = 1 + max { Höhe(linker U-Baum), Höhe(rechter U-Baum) Auf Ebene k können jeweils zwischen 1 und k-1 Elemente gespeichert werden. In einem Baum der Höhe h können also zwischen h und Elemente gespeichert werden! (U-Baum = Unterbaum) Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 7 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 8

ADT Binäre Bäume 1 Ein vollständiger Baum der Höhe h besitzt h 1 Knoten. Man braucht maximal h Vergleiche, um Element (ggf. nicht) zu finden. Bei n = h 1 Elementen braucht man log (n) < h Vergleiche! Ein degenerierter Baum der Höhe h besitzt h Knoten (= lineare Liste). Man braucht maximal h Vergleiche, um Element (ggf. nicht) zu finden. Bei n = h braucht man also n Vergleiche! 3 4 Datei := speichert Daten in linearer Anordnung Zwei Typen: ASCII-Dateien - sind mit Editor les- und schreibbar - Dateiendung ( suffix oder extension ) meist.txt oder.asc - betriebssystem-spezifische Übersetzung von Zeichen bei Datentransfer zwischen Programm und externem Speicher Binär-Dateien - werden byteweise beschrieben und gelesen - lesen / schreiben mit Editor ist keine gute Idee - schnellerer Datentransfer, da keine Zeichenübersetzung Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 9 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 10 Hier: einfache Dateibehandlung! Dateien können gelesen oder beschrieben werden. Vor dem ersten Lesen oder Schreiben muss Datei geöffnet werden. Man kann prüfen, ob das Öffnen funktioniert hat. Nach dem letzten Lesen oder Schreiben muss Datei geschlossen werden. Bei zu lesenden Dateien kann gefragt werden, ob Ende der Datei erreicht ist. Beim Öffnen einer zu schreibenden Datei wird vorheriger Inhalt gelöscht! Man kann noch viel mehr machen wir benötigen: #include <fstream> bzw. <fstream.h> Eingabe-Datei = input file ifstream Quelldatei; Datentyp Bezeichner Öffnen der Datei: Quelldatei.open(dateiName); ist Kurzform von Quelldatei.open(dateiName, modus); wobei fehlender modus bedeutet: ASCII-Datei, Eingabedatei (weil ifstream) Ausgabe-Datei = output file ofstream Zieldatei; Datentyp Bezeichner Öffnen der Datei: Zieldatei.open(dateiName); ist Kurzform von Quelldatei.open(dateiName, modus); wobei fehlender modus bedeutet: ASCII-Datei, Ausgabedatei (weil ofstream) Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 11 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 1

modus: ios::binary ios::in ios::out ios::app ios::nocreate binäre Datei öffnet für Eingabe (implizit bei ifstream) öffnet für Ausgabe (implizit bei ofstream) hängt Daten am Dateiende an wenn Datei existiert, dann nicht anlegen Warnung: teilweise Compiler-abhängig (nocreate fehlt in MS VS 003, dafür trunc) Man kann diese Schalter / Flags miteinander kombinieren via: ios::binary ios::app (öffnet als binäre Datei und hängt Daten an) Datei öffnen file.open(filename) bzw. file.open(filename, modus) falls Öffnen fehlschlägt, wird Nullpointer zurückgegeben Datei schließen file.close() sorgt für definierten Zustand der Datei auf Dateisystem; bei nicht geschlossenen Dateien droht Datenverlust! Ende erreicht? ja falls file.eof() == true Lesen (von ifstream) file.get(c); liest ein Zeichen file >> x; liest verschiedene Typen Schreiben (von ofstream) file.put(c); schreibt ein Zeichen file << x; schreibt verschiedene Typen Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 13 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 14 Merke: 1. Auf eine geöffnete Datei darf immer nur einer zugreifen.. Eine geöffnete Datei belegt Ressourcen des Betriebssystems. Deshalb Datei nicht länger als nötig geöffnet halten. 3. Eine geöffnete Datei unbekannter Länge kann solange gelesen werden, bis das Ende-Bit (end of file, EOF) gesetzt wird. 4. Der Versuch, eine nicht vorhandene Datei zu öffnen (zum Lesen) oder eine schreibgeschützte Datei zu öffnen (zum Schreiben), führt zu einem Nullpointer in ifstream bzw. ofstream. Das muss überprüft werden, sonst Absturz bei weiterer Verwendung! 5. Dateieingabe und -ausgabe (input/output, I/O) ist sehr langsam im Vergleich zu den Rechenoperationen. I/O Operationen minimieren. The fastest I/O is no I/O. Nils-Peter Nelson, Bell Labs Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 15 #include <iostream> #include <fstream> using namespace std; int main() { ifstream Quelldatei; ofstream Zieldatei; // zeichenweise kopien Quelldatei.open("quelle.txt"); if (!Quelldatei) { cerr << "konnte Datei nicht zum Lesen öffnen\n"; exit(1); Zieldatei.open("ziel.txt"); if (!Zieldatei) { cerr << "konnte Datei nicht zum Schreiben öffnen\n"; exit(1); Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 16

while (!Quelldatei.eof()) { char c; Quelldatei.get(c); Zieldatei.put(c); Quelldatei.close(); Zieldatei.close(); offene Datei Bisher: Zeichenketten wie char str[0]; Relikt aus C-Programmierung! bei größeren Programmen mühevoll, lästig, und insgesamt fehlerträchtig! Jetzt: Zeichenketten aus C++ sehr angenehm zu verwenden (keine 0 am Ende, variable Größe, ) eingebaute (umfangreiche) Funktionalität Start aktuelle Position eof() == true wie benötigen: #include <string> und using namespace std; Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 17 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 18 Datendefinition / Initialisierung string s1; // leerer String string s = "xyz"; // initialisieren mit C-String string s3 = s; // vollständige Kopie! string s4("abc"); // initialisieren mit C-String string s5(s4); // initialisieren mit C++-String string s6(10, * ); // ergibt String aus 10 mal * string s7(1 x ); // initialisieren mit einem char string sx( x ); // FEHLER! string s8(""); // leerer String Eingebaute Funktionen Konvertierung C++-String nach C-String via c_str() const char *Cstr = s.c_str(); Stringlänge length() cout << s.length(); Index von Teilstring finden int pos = s.find( yz ); Strings addieren s1 = s + s3; s4 = s + hello ; s5 += s4; Strings vergleichen if (s1 == s) s3 += s; if (s3 < s8) flag = true; substr(), replace(), erase(), Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 19 Rudolph: EINI (WS 005/06) Kap. 8: Abstrakte Datentypen 0