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

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

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

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

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

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

Informationsverarbeitung

Zusammengesetzte Datentypen -- Arrays und Strukturen

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

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

1. Übung zu "Numerik partieller Differentialgleichungen"

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

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

Objektorientiertes Programmieren für Ingenieure

2. Semester, 2. Prüfung, Lösung

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

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Codingstandard. Softwareentwicklung Praktikum Stand:

Der C++ Crashkurs v1.0

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

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

Anweisungsblöcke (dazu zählen auch Programme) werden in geschweifte Klammern eingeschlossen.

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp

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

Objektorientierte Programmierung mit C++ SS 2007

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

Einführung in die Programmierung

Grundlegende Anweisungen in C++

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden:

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Informatik Repetitorium SS Volker Jaedicke

Einführung in die C-Programmierung

Einführung in die Programmierung (EPR)

Programmieren für Physiker: C++

Angewandte Mathematik und Programmierung

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

Von Java nach C++ Dr. Frank Weichert Lehrstuhl Informatik VII Technische Universität Dortmund

FB Informatik. Fehler. Testplan

Von Java nach C++ Frank Weichert, Heinrich Müller Informatik VII Universität Dortmund

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

C++ Programmierung. Uwe Naumann. LuFG Informatik 12, RWTH Aachen University, Germany

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

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

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

Funktionen und Parameter

Programmieren in C/C++ und MATLAB

Eine Einführung in C-Funktionen

Deklarationen in C. Prof. Dr. Margarita Esponda

Name: Klausur Programmierkonzepte SS 2011

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

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

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

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

Modellierung und Programmierung

Programmierung in C/C++

Praktikum Betriebssysteme 1. Aufgabe (1)

Objective-C CheatSheet

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Java Einführung Collections

Kurzeinführung in C++

Programmierung in C. Grundlagen. Stefan Kallerhoff

Angewandte Mathematik und Programmierung

Tutorium Rechnerorganisation

Operatoren überladen. Grundsätzliches

Klausur in Programmieren

Einführung in die C++ Programmierung für Ingenieure

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

10 Lesen und Schreiben von Dateien

Zusammenfassung des Handzettels für Programmieren in C

Informatikpraktikum CE2. Übung 1: Einfach verkettete Liste

AlDaBi Praktikum WS 15/16 Hannes Hauswedell, Johannes Röhr, Jongkyu Kim

Grundlagen. Kapitel 1

Felder. November 5, 2014

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Einführung in C++ mit Microsoft VS

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Sebastian Houben Intensivkurs C++ 1. Intensivkurs C September 2015

Übung zur Vorlesung Sehen in Mensch und Maschine

C++ für Spieleprogrammierer

Shell-Programmierung

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

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

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

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

Einführung in Boost Spirit Qi

Inhalte. Einführung. Algorithmus, Programmiersprache, Compiler und Linker. Kontrollstrukturen. Präprozessoranweisungen. Libraries

C++-Entwicklung mit Linux

Beispiel für eine rekursive Funktion

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

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

Lösungsvorschlag zum Übungsblatt 1 zur Vorlesung Informatik II / WS2001/02

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

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

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Modellierung und Programmierung

OpenCL Implementierung von OpenCV Funktionen

Klausur zur Vorlesung Grundlagen der C++-Programmierung

Fakultät Angewandte Informatik Programmierung verteilter Systeme Übungen zur Vorlesung Informatik II, Blatt 6

Programmieren in C++ Einführung

Transkript:

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

Themen der letzten Vorlesung dynamische Speicherverwaltung (Wdh.) Cast bei Zeigern STL-Vektoren + Live Programming Typedefs und Makros Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 2 / 16

Heutige Themen 1 Wdh.: Vektoren 2 Mehr zur STL Sequentielle Container Iteratoren 3 Ein-/Ausgabe über Dateien 4 Zusammengesetzte Datentypen Strukturen (Structs) Überladen von Operatoren Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 3 / 16

for ( int i =0; i < w. size (); ++ i) w[ i]= 0.07; // alternativ : w. at( i)= 0.07; Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 4 / 16 Vektoren C++-Alternative zu C-Feldern (Arrays) ein Datentyp aus der STL (Standard Template Library) Datentyp der Einträge bei Deklaration angeben, z.b. vector<double> Angabe der Größe bei Deklaration oder später mit resize, Abfrage der Größe mit size zusammenhängender Speicherbereich garantiert, aber möglicherweise keine feste Adresse Zugriff auf Einträge mit [ ]-Operator oder at Nummerierung 0,..., n-1, für [ ] keine Bereichsprüfung! # include < vector > using std :: vector ; vector < double > v(2), w; w. resize (5);

Vektoren (2) w. push_ back ( 4.1); // haengt neuen Eintrag hinten an v. pop_ back (); // letzten Eintrag loeschen double * ptr = &(v [0]); v= w; // Zuweisung, passt Groesse von v an // ptr zeigt evtl auf ungueltigen Speicherbereich!! Zuweisung = funktioniert wie erwünscht (im Gegensatz zu Feldern) kein Vektor im mathematischen Sinne: arithmetische Operatoren (+, -, *) nicht implementiert Ändern der Länge führt evtl. zu Reallozierung an anderer Speicheradresse Vorsicht mit Zeigern! STL definiert weitere Container wie list, map, dazu heute mehr Container verwenden Iteratoren statt Zeiger, auch dazu heute mehr Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 5 / 16

Sequentielle Container: Liste Seq. Container für linear angeordnete Daten (1 Vorgänger/Nachfolger) STL bietet z.b. vector (kennen wir schon), list (heute), stack,... list: doppelt verkettete Liste #include<list> einbinden jedes Element enthält Zeiger auf Vorgänger/Nachfolger Zugriff auf Elemente mittels Iterator list <int > L; L. push_ back ( 7); L. push_ back ( 23); L. push_ front ( 11); for (list <int >:: iterator it= L. begin (); it!= L. end (); ++ it) cout << *it << ","; 11 7 23 L.begin() L.end() Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 6 / 16

Liste (2) Vergleich zu Vektor: kein direkter Zugriff, z.b. auf 3. Element, möglich (kein random access) mehr Speicherbedarf als Vektor + Einfügen/Löschen von Elementen aus der Mitte + Zusätzliche Funktionalität, z.b. sort, merge, reverse // Eintraege von L: 11 7 23 list <int >:: iterator pos = L. begin (); ++ pos ; // pos zeigt nun auf 7 L. insert ( pos, 33); // 11 33 7 23 // pos zeigt weiter auf 7 L. erase ( L. begin () ); // 33 7 23 L. sort (); // 7 23 33 Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 7 / 16

Iteratoren werden in der STL benutzt, um Container zu durchlaufen verhalten sich wie Zeiger double feld [5]= { 1.1, 2.2, 3.3, 4.4, 5.5}; list < double > L; for ( int i =0; i <5; ++i) L. push_back ( feld [i ]); for ( double * zeig = feld ; zeig!= feld +5; ++ zeig ) cout << (* zeig ) << endl ; for (list < double >:: iterator it= L. begin (); it!= L. end (); ++ it) cout << (* it) << endl ; Datentyp: ContainerT::iterator Operatoren: ++, --, ==,!=, * (Dereferenzierung) feld feld+5 [0] [1] [2] [3] [4] Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 8 / 16

File Streams: Ein-/ Ausgabe über Dateien zuerst header-datei für file streams einbinden: #include <fstream> Öffnen des input bzw. output file streams zur Ein- bzw. Ausgabe: std :: ifstream ifs ; ifs. open (" mydata. txt "); std :: ofstream ofs (" results. dat "); gewohnte Verwendung von Ein- und Ausgabeoperator (wie mit cin und cout) ifs >> a; ofs << " Das Ergebnis lautet " << f(x) << ".\n"; bei Dateiausgabe: endl vermeiden, durch \n ersetzen (Pufferung) Schließen des file streams nach Verwendung: ifs.close(); ofs.close() Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 9 / 16

Basisklassen istream, ostream Beispiel: cout und ofs haben unterschiedliche Datentypen, aber gemeinsamen Basis-Datentyp: std::ostream cin und ifs haben unterschiedliche Datentypen, aber gemeinsamen Basis-Datentyp: std::istream Basis-Datentypen werden auch als Basisklassen bezeichnet, von denen speziellere Datentypen abgeleitet werden, z.b. std::ofstream ist abgeleitet von std::ostream void Ausgabe ( double x, std :: ostream & os) { os << x << \n ; } kann benutzt werden als Ausgabe( 3.14, cout); Ausgabe( 3.14, ofs); Bildschirmausgabe Dateiausgabe Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 10 / 16

Einlesen per Eingabeoperator >> Eingabeoperator >> erwartet, dass Daten durch Whitespace getrennt sind (Leerzeichen, Tabulator, Zeilenumbruch) Abfrage des Stream-Status: ifs.good() : Stream bereit zum Lesen ifs.eof( ) : Ende der Datei (end of file) erreicht ifs.fail() : letzte Leseoperation nicht erfolgreich ifs.clear(): setzt Status zurück, ermöglicht weiteres Lesen Leseoperation >> wird nur bei good-status durchgeführt Beispiel: ifstream ifs ( " input. txt "); double d; int i; string s; Datei input.txt: 17.5 4711 Hallo ifs >> d >> i; // good ifs >> i; // fail ifs. clear (); // good ifs >> s; // good ifs >> s; // fail eof Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 11 / 16

Zeilenweises Lesen Whitespace-Trennung wie hier manchmal unerwünscht: string vorname, nachname ; cout << " Bitte Vor - und Nachname eingeben : "; cin >> vorname >> nachname ; Um eine ganze Zeile bis zum nächsten Enter ( \n ) zu lesen: string name ; cout << " Bitte Vor - und Nachname eingeben : "; getline ( cin, name ); funktioniert genauso für input file streams: ifstream ifs ( " fragen. txt "); // eine Zeile pro Frage vector < string > question ; while (! ifs. eof () ) { string zeile ; getline ( ifs, zeile ); question. push_ back ( zeile ); // hinten anhaengen } Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 12 / 16

Strukturen (Structs) Strukturen: Zusammenfassung unterschiedlicher Datentypen zu einem neuen benutzerdefinierten Datentyp z.b. neuer Datentyp Datum: int string int struct Datum { int Tag ; string Monat ; int Jahr ; }; // Semikolon nicht vergessen! Datum MamasGeb, MeinGeb ; MamasGeb. Tag = 12; MamasGeb. Monat = " Februar "; MamasGeb. Jahr = 1954; MeinGeb = MamasGeb ; // Zuweisung MeinGeb. Jahr += 30; // ich bin genau 30 Jahre juenger Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 13 / 16

Objekte Struktur-Variablen nennt man auch Objekte: MeinGeb ist ein Objekt vom Datentyp Datum. Zugriff auf Datenelemente eines Objektes mit. : MeinGeb.Monat ist ein Datenelement des Objektes MeinGeb. cout << " Mein Geburtstag ist im " << MeinGeb. Monat ; Datenelemente nennt man synonym auch Attribute. Zugriff auf Datenelemente über Objektzeiger: Datum * datzeig = & MeinGeb ; (* datzeig ). Tag = 7; cout << " Mein Geburtstag ist im " << (* datzeig ). Monat ; einfachere Schreibweise mit -> ist besser lesbar: datzeig -> Tag = 7; cout << " Mein Geburtstag ist im " << datzeig -> Monat ; Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 14 / 16

Überladen von Operatoren (operator overloading) praktisch wäre, folgendes schreiben zu können: if ( MamasGeb < MeinGeb ) // Datumsvergleich cout << " Mama ist aelter als ich."; möglich, wenn man folgende Funktion operator< definiert: bool operator < ( const Datum & a, const Datum & b) {... } Das nennt man Operatorüberladung. MamasGeb < MeinGeb ist dann äquivalent zum Funktionsaufruf operator< ( MamasGeb, MeinGeb ) für viele Operatoren möglich, z.b. + - * / == >> << usw., je nach konkretem Datentyp sinnvoll Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 15 / 16

Überladen von Operatoren Beispiel Beispiel: Ein-/Ausgabeoperator für Datum: Wir wollen Code schreiben wie ifstream ifs ( " Datum. txt " ); // 3. Dezember 2014 Datum heute ; ifs >> heute ; cout << " Heute ist der " << heute << endl ; Definition des Ausgabeoperators << : ostream & operator << ( ostream & out, const Datum & d) { out << d. Tag << ". " << d. Monat << " " << d. Jahr ; return out ; } Quiz: Wie könnte der Eingabeoperator >> definiert werden? istream & operator >> ( istream & in, Datum & d) { //??? } Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 3. Juni 2016 16 / 16