Programmieren 2 C++ Überblick

Ähnliche Dokumente
Objektorientierte Programmierung mit C++ Vector und List

Überladen von Operatoren

Einführung in die STL

Einführung in die STL anhand eines ausgewählten Beispiels

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

Vorkurs C++ Programmierung

1. Übung zu "Numerik partieller Differentialgleichungen"

Probeklausur: Programmierung WS04/05

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

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

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Zeiger: Der Adressoperator &

Programmierung mit C Zeiger

Klausurvorbereitung Lösung

Praxisorientierte Einführung in C++ Lektion: "Smart-Pointer"

Einführung in C++ Operatoren überladen (Klassen)

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Vorlesung Datenstrukturen

C++ - Eine Ubersicht fur Java-Programmierer

Überblick. 7. Überladen von Operatoren

Probeklausur: Programmierung WS04/05

Grundkonzepte java.util.list

Programmieren in C++ Überladen von Methoden und Operatoren

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Algorithmen und Datenstrukturen (Informatik III)

Objektorientierte Programmierung mit C++ SS 2007

Informationsverarbeitung im Bauwesen

Objektbasierte Entwicklung

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Meeting C++ C++11 R-Value Referenzen

Theorie zu Übung 8 Implementierung in Java

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Objektorientiertes Programmieren für Ingenieure

Objektorientierte Programmierung Teil 1: Einführung

Einführung in die Nutzung der C++ - Standard - Bibliothek

Programmieren - C++ Funktions-Templates

Advanced Programming in C

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung

Objektorientierte Programmierung

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Systemnahe Programmierung in C/C++

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung.

Kurzeinführung in C/C++ Elementare Datentypen in C++

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Java Einführung Collections

Einführung in C++ mit Microsoft VS

Widmung Einleitung Vorwort 15 Übersicht zu diesem Buch Einführung in die Welt der Objektorientierung... 21

Praktikum Betriebssysteme 1. Aufgabe (1)

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Prof. W. Henrich Seite 1

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Einführung in die Programmierung

11.3 Virtuelle Methoden

Informatik Repetitorium SS Volker Jaedicke

Die Programmiersprache C99: Zusammenfassung

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Studentische Lösung zum Übungsblatt Nr. 7

Einführung in die Java- Programmierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Übung 13: Priority Queues (Vorrangwarteschlangen 1 )

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Beziehungen zwischen Objekten

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

C++, STL und Qt. C++, STL und Qt. Dipl.Ing. Christoph Stockmayer, Schwaig,

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Einführung in die C-Programmierung

Programmierkurs C++ Kapitel 9, Überladen Seite 1

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

Übung HP Beispielaufgaben 3

Von der UML nach C++

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Informatikpraktikum CE2. Übung 1: Einfach verkettete Liste

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Klausur in Programmieren

Angewandte Mathematik und Programmierung

Alltagsnotizen eines Softwareentwicklers

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Objektorientierte Programmierung

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

11. Klassen. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Einstieg in die Informatik mit Java

C für Java-Programmierer

3 Objektorientierte Konzepte in Java

Der C++ Crashkurs v1.0

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Kurze Einführung in die Programmiersprache C++ und in Root

Erste Schritte der Programmierung in C

Transkript:

Programmieren 2 C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 6. Templates und generische Programmierung 7. Standard Template Library 8. Vererbung 9. Klassenbeziehungen 10. Fehlerbehandlung 11. Namensräume und Typinformation zur Laufzeit 12. Dateien und Ströme 13. Zusammenfassung objektorientierter Merkmale Prof. Dr. Björn Dreher Programmieren 2 C++ 276 Programmieren 2 C++ Überblick: 5.1 Einleitung 5.4 for_each Iteratoren Prof. Dr. Björn Dreher Programmieren 2 C++ 277

5.1 Einleitung Behälter (container) Klassen Enthalten andere Objekte (echte Kopie) oder nur Zeiger darauf (ursprüngliche Identität bleibt erhalten) Wichtiges und häufig benötigtes Konstrukt der objektorientierten Programmierung Beispiele: Stacks, Listen, Bäume, Arrays (Vektoren), etc. Prof. Dr. Björn Dreher Programmieren 2 C++ 278 5.1 Einleitung Behälter (container) Klassen Häufig benötigt man eine Möglichkeit, individuelle Inhalte eines Containers zu besuchen, d.h. sequentiell darauf zuzugreifen Eine Möglichkeit dazu ist ein sog. Iterator, mit Hilfe dessen man ein Element eines Containers nach dem anderen besuchen und ggf. manipulieren kann Auch ein Iterator ist eine Abstraktion: Er wird so realisiert, dass der Benutzer über die Art und Weise der internen Speicherung und die Art des Zugriffs auf das nächste Element nicht Bescheid wissen muss Prof. Dr. Björn Dreher Programmieren 2 C++ 279

Programmieren 2 C++ Überblick: 5.1 Einleitung 5.4 for_each Iteratoren Prof. Dr. Björn Dreher Programmieren 2 C++ 280 Sequentieller Zugriff auf alle Elemente Üblicherweise verwendet man dazu eine Schleife: // Besuche sequentiell jedes a[i] und tue etwas damit for (i = 0; i < size; ++i) sum += a[i]; Das könnte auch anders implementiert werden: for (j = size-1; j >= 0; --j) sum += a[j]; Generell funktioniert ein solcher Zugriff nach dem Schema: bis kein weiteres Element mehr vorhanden ist sum += nächstes Element Man könnte das nächste Element in einem Zeiger zurückliefern Prof. Dr. Björn Dreher Programmieren 2 C++ 281

Iterator über Elemente eines Vektors Erweitern wir unsere Vector Klasse (mit int Elementen): class Vector public: typedef int* iterator; // Typ Vector::iterator, Zeiger auf int explicit Vector(int n = 1); Vector(const Vector& v); Vector(const int a[], int n); ~Vector() delete [] bp; iterator begin() const return bp; iterator end() const return bp + size; int ub() const return size - 1; // upper bound int& operator[](int i); // range checked Vector& operator=(const Vector& v); private: iterator bp; // base pointer int size; // Anzahl Elemente ; Prof. Dr. Björn Dreher Programmieren 2 C++ 282 Iterator über Elemente eines Vektors (fortgesetzt) class Vector public: typedef int* iterator; // Typ Vector::iterator, Zeiger auf int iterator begin() const return bp; iterator end() const return bp + size; private: iterator bp; // base pointer int size; // Anzahl Elemente ; begin() und end() liefern Grenzen des Vektors in Form von Zeigern auf das erste und (size+1)-te also eins hinter dem letzten Element zurück Nach diesem Muster funktionieren auch entsprechende Klassen der STL Prof. Dr. Björn Dreher Programmieren 2 C++ 283

Hauptprogramm: Vector v(n); // Der Vektor als Container Vector::iterator p; // Zeiger vom richtigen Elementtyp int sum = 0; for (p = v.begin(); p!= v.end(); ++p) sum += *p; // p muss dereferenziert werden Prof. Dr. Björn Dreher Programmieren 2 C++ 284 Iterator über Elemente eines Vektors Nach diesem Muster können leicht weitere Schleifen über den gesamten Vektor realisiert werden Man muss sich um Anfangs- oder Ende-Index keine Gedanken machen: ostream& operator<<(ostream& out, const Vector& v) Vector::iterator p; for (p = v.begin(); p!= v.end(); ++p) out << *p << '\t'; out << endl; return out; Prof. Dr. Björn Dreher Programmieren 2 C++ 285

Iterator über Elemente eines Vektors (fortgesetzt) istream& operator>>(istream& in, Vector& v) Vector::iterator p; for (p = v.begin(); p!= v.end(); ++p) in >> *p; return in; Hier wurden die Input- und Output-Operatoren überschrieben, so dass sich ein Vektor leicht ein- und ausgeben lässt Prof. Dr. Björn Dreher Programmieren 2 C++ 286 Programmieren 2 C++ Überblick: 5.1 Einleitung 5.4 for_each Iteratoren Prof. Dr. Björn Dreher Programmieren 2 C++ 287

Klasse List für eine doppelt verkettete Liste Schnittstelle ähnlich der gleichnamigen Klasse in der STL Rückwärtsverkettung erleichtert bestimmte Operationen, wie Löschen eines Elementes Prof. Dr. Björn Dreher Programmieren 2 C++ 288 Klassendeklaration (1/5) class List public: // Vorwärts Deklarationen struct Listelem; class Iterator; friend Iterator; // Konstruktoren List() :h(0), t(0) // Leere Liste List(size_t n_elements, char c); // Init mit c List(const List& x); // Init mit Liste x //Destruktor ~List() release(); Prof. Dr. Björn Dreher Programmieren 2 C++ 289

Klassendeklaration (2/5) // Liefere Head und Tail Adresse Iterator begin()const return h; Iterator end()const return t; // Füge am Head hinzu und lösche dort void push_front(char c); void pop_front(); // Liefer Head und Tail Daten char& front() return h -> data; char& back() return t -> data; // Prüfe auf leer und gib Liste frei bool empty()const return h == 0; void release(); // Überlade << Operator für Liste friend ostream& operator<<(ostream& out, List& x); Prof. Dr. Björn Dreher Programmieren 2 C++ 290 Klassendeklaration (3/5) private: listelem *h, *t; // Head und Tail struct listelem // Typ des Listenknoten char data; listelem *next, *prev; // Konstruktor für Listenknoten listelem(char c, listelem* n, listelem* p) :data(c), next(n), prev(p) ; Struktur listelem stellt Listenknoten dar enthält ein char als eigentliches Datenelement und die Vorwärts- und Rückwärts-Zeiger. Besitzt einen Konstruktor zum einfachen Initialisieren Prof. Dr. Björn Dreher Programmieren 2 C++ 291

Klassendeklaration (4/5) Als Bestandteil der List Klasse wird eine Iterator Klasse eingebunden: List::Iterator Instanzen dieser Klasse zeigen auf einen (aktuellen) Knoten innerhalb der Liste // im Deklarationsbereich der Klasse List class Iterator public: // Konstruktor Iterator(listelem* p = 0) :ptr(p) Prof. Dr. Björn Dreher Programmieren 2 C++ 292 Klassendeklaration (5/5) // Überlade ++ und - Prä- und Postfix Iterator operator++(); Iterator operator--(); Iterator operator++(int); Iterator operator--(int); // Überlade -> Operator listelem* operator->() return ptr; ; // Überlade Dereferenzierung char& operator*() return ptr -> data; // Konversion operator listelem*() return ptr; private: listelem* ptr; // Aktuelles listelem oder 0 ; // Ende class Iterator ; // Ende class List Prof. Dr. Björn Dreher Programmieren 2 C++ 293

Implementierung der Methoden der Klasse List (1/4) // Initialisiere mit konstantem c List::List(size_t n_elements, char c) assert(n_elements > 0); h = t = 0; for(size_t i = 0; i < n_elements; ++i) push_front(c); // Initialisiere mit anderer Liste x List::List(const List& x) List::Iterator r = x.begin(); // Iterator durch x h = t = 0; // Liste ist leer while (r!= 0) push_front(*r++); // Deref. Iterator, dann inkr. Prof. Dr. Björn Dreher Programmieren 2 C++ 294 Implementierung der Methoden der Klasse List (2/4) // Lösche Inhalt der Liste void List::release() while (h!= 0) pop_front(); // Überlade << Operator für Liste ostream& operator<<(ostream& out, List& x) List::Iterator p = x.begin(); // liefert x.h out << "List = ("; while (p!= 0) out << *p << ","; // liefert ein char& ++p; // schalte Iterator weiter cout << ")\n"; return out; Prof. Dr. Björn Dreher Programmieren 2 C++ 295

Implementierung der Methoden der Klasse List (3/4) // Füge Element am Anfang der Liste an void List::push_front(char c) listelem* temp = new listelem(c, h, 0); // Neuer Knoten if (h!= 0) // Liste war nicht leer h -> prev = temp; h = temp; else h = t = temp; // Liste war leer Prof. Dr. Björn Dreher Programmieren 2 C++ 296 Implementierung der Methoden der Klasse List (4/4) // Lösche Element am Anfang der Liste void List::pop_front() listelem* temp; if (h!= 0) // Liste war nicht leer temp = h; if (t == h) // Nur 1 Element in Liste t = 0; h = 0; // Liste wird leer else h = h -> next; // Head Element ausketten h -> prev = 0; // Das ist der neue Head delete temp; Prof. Dr. Björn Dreher Programmieren 2 C++ 297

Implementierung der Methoden der Klasse Iterator (1/2) List::Iterator List::Iterator::operator++() assert(ptr!= 0); ptr = ptr -> next; return *this; List::Iterator List::Iterator::operator++(int) assert(ptr!= 0); Iterator temp = *this; ptr = ptr -> next; return temp; Prof. Dr. Björn Dreher Programmieren 2 C++ 298 Implementierung der Methoden der Klasse Iterator (2/2) List::Iterator List::Iterator::operator--() assert(ptr!= 0); ptr = ptr -> prev; return *this; List::Iterator List::Iterator::operator--(int) assert(ptr!= 0); Iterator temp = *this; ptr = ptr -> prev; return temp; Prof. Dr. Björn Dreher Programmieren 2 C++ 299

Hauptprogramm (1/2) #include <iostream> #include "list2.h" int main() List *l, *l1; char c; // Zeiger auf zwei Listen l = new List; // Erzeuge Instanz cout << endl << "---- Listen Demo-Programm ----" << endl; for (c = 'a'; c <= 'z'; ++c) l->push_front(c); cout << "a-z gepushed" << endl; cout << "Lies vom Anfang der Liste sequentiell:" << endl; List::Iterator it = l->begin(); for (; it!= 0; ++it) cout << *it; // Dereferenziere Iterator: // Liefert Listenelementwert cout << endl; Prof. Dr. Björn Dreher Programmieren 2 C++ 300 Hauptprogramm (2/2) cout << "Lies vom Ende der Liste rückwärts:" << endl; it = l->end(); for (; it!= 0; --it) cout << *it; cout << endl; cout << endl << "Gib Liste über << aus:" << endl; cout << *l; // Übergib Referenz der Liste cout << endl << "Kopie in umgek. Reihenfolge:" << endl; l1 = new List(*l); // Kopie in umgekehrter Reihenfolge cout << *l1; cout << endl << "Fertig!" << endl; delete l; delete l1; return 0; Prof. Dr. Björn Dreher Programmieren 2 C++ 301

Praktische Anwendung Eins-zu-viele Beziehungen (Assoziationen) zwischen Objekten (Analse-Modell): Adreßbuch enthält * Adresse Für die Implementierung wird das zu: Adreßbuch Iterator Liste * Adresse Prof. Dr. Björn Dreher Programmieren 2 C++ 302 Programmieren 2 C++ Überblick: 5.1 Einleitung 5.4 for_each Iteratoren Prof. Dr. Björn Dreher Programmieren 2 C++ 303

5.4 for_each Iteratoren Andere Methode, Iteratoren zu verwenden: Weiterschalten in einer Funktion for_each verbergen Dieser Funktion muss eine andere Funktion übergeben werden, die dann für jeden Iteratorschritt aufgerufen wird Prof. Dr. Björn Dreher Programmieren 2 C++ 304 5.4 for_each Iteratoren for_each Funktion: typedef void (*funktion)(char&); void for_each(list::iterator anfang, List::Iterator ende, funktion f) while(anfang!= ende) f(*anfang++); f(*ende); //.. und noch das letzte Element void gibaus(char& c) cout << c; for_each(l1->begin(), l1->end(), gibaus); Prof. Dr. Björn Dreher Programmieren 2 C++ 305