Objektorientierte Programmierung

Ähnliche Dokumente
Hochschule München, FK 03 SS Masterstudiengang Technische Berechnung und Simulation. Programmierung von CAx-Systemen Teil 1

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

Wiederholung C-Programmierung

Objektorientiertes Programmieren für Ingenieure

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

Erste Schritte der Programmierung in C

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

Assoziative Container in C++ Christian Poulter

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

Einführung in die STL

Angewandte Mathematik und Programmierung

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

4 Schleifen und Dateien

Informationsverarbeitung

3D Programmierpraktikum: Einführung in C++ - Teil 1

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

Kapitel 7. Zusammengesetzte Datentypen, Vektoren, Zeichenketten

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Ein- und Ausgabe (I/O)

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

Computergrundkenntnisse und Programmieren, WS 07/08, Übung 12: Numerik der Standardbibliothek

Klausurvorbereitung Lösung

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

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

Informatik Repetitorium SS Volker Jaedicke

Elementare Datentypen in C++

Verwendung von Klassen in C++

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

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

3. Semester : 1. Prüfung

Zusammengesetzte Datentypen -- Arrays und Strukturen

GI Vektoren

Grundlagen. Kapitel 1

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

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

Objektorientierte Programmierung mit C++ Vector und List

Dr. Monika Meiler. Inhalt

Einführung in die Programmierung

2. Programmierung in C

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

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

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

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

Ingenieurinformatik Diplom-FA (Teil 2, C-Programmierung)

Kapitel 1: Einführung

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

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

Javakurs für Anfänger

Der C++ Crashkurs v1.0

Vorkurs C++ Programmierung

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

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

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

magnum C++ WALTER SAUMWEBER kompakt komplett kompetent

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

Lösung Übungszettel 6 Aufgabe 1-4

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einführung in C++ mit Microsoft VS

Informationsverarbeitung im Bauwesen

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 1

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

Die abgeleiteten Klassen Kreis und Viereck erben die Elemente des Basisklasse und verfügen über zusätzliche Eigenschaften (Seitenlänge,

Programmieren 3 C++ Prof. Peter Sommerlad Fredy Ulmer

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

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

Aufbau von Klassen. class punkt {...

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

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Einführung in die Programmierung

Grundlagen der Informatik - 6. Praktikum

Klausur in Programmieren

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

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

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

Klausur in Programmieren

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Benutzerdefinierte und zusammengesetzte Datentypen

C++ - Eine Ubersicht fur Java-Programmierer

Einführung in die Programmiersprache C

Programmierung mit C Zeiger

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Überladen von Operatoren

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

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

Programmieren für Physiker: C++

Überblick. 7. Überladen von Operatoren

Einführung in die Programmierung (EPR)

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

CEN1112 Labor Software-Entwicklung

Programmieren für Physiker: C++ SS 2016

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

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

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Transkript:

2.1. Gliederung Kapitel 2 Objektorientierte Programmierung Standardbibliothek: Strings, Container, Streams Definition von neuen Klassen Konstruktoren, Destruktoren Vererbung Folie 1

2.2. Standardbibliothek Einleitung Gelegentlich merkt man, dass die Programmiersprache C etwas in die Jahre gekommen ist. Gewisse Dinge lassen sich nur umständlich programmieren. Häufig kommt es auch vor, dass vermeintlich einfache Funktionen oder Programme unentdeckte Fehler enthalten, die dann mit etwas Pech durch Schadsoftware ausgenutzt werden. Etwa, um das jeweilige Programm zum Absturz zu bringen oder gar den betroffenen Rechner zu kompromittieren. In drei Beispielen werden die Verarbeitung von Zeichenketten (Strings), die Arbeit mit Feldern und Vektoren sowie die Ein- und Ausgabe von Variablen in C gezeigt. Anschließend werden dieselben Beispiele auf eine andere (modernere?) Art in der Programmiersprache C++ gelöst. Viele weitere Beispiele lassen sich leicht finden Folie 2

2.3. Standardbibliothek Beispiel 1: Zeichenketten (Strings) /* (Schlechtes) Beispiel: Zeichenketten in C */ #include <stdio.h> #include <string.h> void append_str(char *str) strcat(str, " bla bla"); Welche Probleme haben sich in diesem C-Programm versteckt? int main(void) int i; char str[100]; printf("zeichenkette eingeben: "); scanf("%s", str); printf("integer-zahl eingeben: "); scanf("%d", &i); append_str(str); printf("zeichenkette: %s\ninteger-zahl: %d\n\n", str, i); return 0; Folie 3

2.4. Standardbibliothek Beispiel 1a: Zeichenketten (Strings) in C++ #include <iostream> #include <string> using namespace std; string append(string s) s = s + " bla bla"; return s; int main() string str; int i; cout << "Zeichenkette eingeben: "; cin >> str; cout << "Integer-Wert eingeben: "; cin >> i; str = append(str); cout << "Zeichenkette: " << str << endl; cout << "Integer-Wert: " << i << endl << endl; Folie 4

2.5. Standardbibliothek Beispiel 2: Vektoren #include <stdio.h> #include <stdlib.h> void zufall(double *par) // oder: double par[] int i; for(i = 0; i < 10; ++i) *(par + i) = 2.0 * rand() / RAND_MAX - 1.0; // par[i] =... int main(void) int i; double a[10]; 1. Kann die Funktion zufall auch Vektoren mit mehr/weniger als 10 Elementen verarbeiten? 2. Kann man Vektoren auch by value statt by reference übergeben? zufall(&a[0]); // oder: zufall(a); for(i = 0; i < 10; ++i) printf("%10.6f\n", a[i]); return 0; Folie 5

2.6. Standardbibliothek Beispiel 2a: Vektoren in C++ #include <iostream> #include <vector> #include <stdlib.h> using namespace std; vector<double> fill() vector<double> result; for(int i = 0; i < 10; ++i) result.push_back(1.0 * rand() / RAND_MAX); return result; int main() vector<double> v; v = fill(); for(int i = 0; i < v.size(); ++i) cout << v[i] << endl; Folie 6

2.7. Standardbibliothek Beispiel 3: Ein- und Ausgabe #include <stdio.h> #include <complex.h> #include "matrix.h" Ist dies nicht furchtbar?! int main(void) int i; double d, re, im; float f; double _Complex dc; double m[2][2]; printf("int: "); scanf("%d", &i); printf("float: "); scanf("%f", &f); printf("double: "); scanf("%lf", &d); printf("complex: "); scanf("%lf %lf", &re, &im); dc = re + I * im; printf("2x2-matrix: "); scanf("%lf %lf %lf %lf", &m[0][0], &m[0][1], &m[1][0], &m[1][1]); printf("int: %d\n", i); printf("float: %f\n", f); printf("double: %f\n", d); printf("complex: %f + %fi\n", creal(dc), cimag(dc)); printf("matrix:\n"); m_print(2, m); return 0; Folie 7

2.8. Standardbibliothek Beispiel 3a: Ein- und Ausgabe in C++ #include <iostream> #include <complex> #include "matrix.hpp" using namespace std; using namespace HMMatrix; int main() int i; float f; double d; complex<double> c; Matrix m(2); cout << "int: "; cin >> i; cout << "float: "; cin >> f; cout << "double: "; cin >> d; cout << "complex: "; cin >> c; cout << "Matrix: "; cin >> m(0,0) >> m(0,1) >> m(1,0) >> m(1,1); cout << "int: " << i << endl; cout << "float: " << f << endl; cout << "double: " << d << endl; cout << "complex: " << c << endl; cout << "Matrix:\n" << m << endl; Folie 8

2.9. Standardbibliothek Die C++-Standardbibliothek Kaum ein Programmierer nutzt zur Softwareentwicklung eine nackte Programmiersprache. Stattdessen werden für Standardaufgaben zunächst leistungsfähige Bibliotheken entwickelt, diese bilden die Grundlage für die weitere Programmierung. Die Beschreibung der C++- Standardbibliothek umfasst rund 2/3 des gesamten ISO-C++-Standards. Die C++-Standardbibliothek bietet neben vielen anderen Dingen Klassen zum Speichern von Daten (z. B. std::vector), Klassen zur Arbeit mit Zeichenketten (z. B. std::string) und Klassen zur Ein- und Ausgabe auf dem Bildschirm und in Dateiform (z. B. std::cout). std::string s1; oder using namespace std; string s2; Die Standardklassen sind im Namensraum std definiert, um mögliche Namenskollisionen mit eigenen Definitionen zu verhindern. Folie 9

2.10. Standardbibliothek Objektorientierte Programmierung Bei objektorientierten Sprachen wie C++ können zusätzlich zu den eingebauten Variablentypen (int, float, char ) weitere, neue Typen (sog. Klassen, zum Beispiel std::string) definiert werden. Klassen stellen öffentliche Schnittstellen mit Funktionen (Methoden) und Daten (Attribute) zur Verfügung. Auf interne Daten und Abläufe zum Beispiel die interne Speicherverwaltung von Strings kann von außen dagegen nicht zugegriffen werden. Nachdem eine neue Klasse implementiert wurde, können Variablen dieses Typs angelegt werden (Instanzen): Hier stehen die Definitionen drin Klassen #include <vector> #include <string> std::string s1, s2; std::vector<double> my_vec; Instanzen Folie 10

2.11. Standardbibliothek Templates (engl.: Vorlagen, Schablonen) Ein std::vector eignet sich zur Speicherung grundlegender Datentypen wie int, float oder double. Es können aber auch Zeichenketten des Typs std::string gespeichert werden. Oder sogar Instanzen von selbst definierten Klassen, die nicht Teil der C++-Standardbibliothek sind. Bei der Definition von Vektor-Instanzen wird in eckigen Klammern angegeben, welcher Datentyp gespeichert werden soll: using namespace std; using namespace std; vector<double> v1; vector<string> v2; v1.push_back(1.234); v2.push_back("hallo"); v1.push_back(2.345); v2.push_back("welt!"); Die Vektoren in der C++-Standardbibliothek sind sog. Templates. Vorteil: Es müssen nicht für alle möglichen Datentypen separate Vektoren programmiert werden (Integer-Vektor, String-Vektor ) sondern nur eine einzige allgemeine Vorlage. Folie 11

2.12. Standardbibliothek Zeichenketten (Strings), Übersicht #include <iostream> #include <string> using namespace std; int main() string s1 = "eins", s2 = "zwei"; // String-Instanzen definieren string s3 = s1 + " und " + s2; // Strings "addieren" cout << s3 << endl; // Ausgabe von Strings getline(cin, s1); cin >> s2; cout << s1 << s2 << endl; int len = s3.size(); for(int i = 0; i < len; ++i) char c = s3[i]; cout << c << endl; // Ganze Zeile einlesen // Bis zum Leerzeichen einlesen // Anzahl der Zeichen ermitteln // Zeichen im String durchlaufen // Auf einzelnes Zeichen zugreifen // Einzelnes Zeichen ausgeben Folie 12

2.13. Standardbibliothek Containerklassen (Vektoren, Listen ), Übersicht #include <iostream> #include <vector> #include <string> using namespace std; int main() vector<int> iv; vector<string> sv; Es gibt etliche weitere Containerklassen, zum Beispiel std::list und std::set, siehe: http://www.cplusplus.com/reference/stl/ Containerklassen als Funktionsparameter oder als Rückgabewert sind problemlos möglich. // Vektoren definieren, // Template-Schreibweise beachten iv.push_back(1234); iv.push_back(2345); // Elemente ans Ende sv.push_back("aa"); sv.push_back("bb"); // des Vektors anhängen int ilen = iv.size(); for(int i = 0; i < ilen; ++i) cout << iv[i] << endl; // Anzahl der Elemente ermitteln, // alle Elemente im Vektor // durchlaufen und ausgeben. for(auto x : sv) // So funktioniert das ab C++11, cout << x << endl; // QMAKE_CXXFLAGS += -std=c++11 // in.pro-datei einfügen! Folie 13

2.14. Standardbibliothek Ein- und Ausgabestreams, Übersicht #include <iostream> // Definitionen von cin, cout #include <fstream> // Definitionen von ofstream, ifstream using namespace std; int main() int i = -10; double d = 123.456; string s = " Hallo ", s1; cout << i << s << d << endl; // Ausgabe auf Bildschirm ofstream my_file("c:/temp/test.txt"); // Ausgabedatei öffnen my_file << i << s << d << endl; // Ausgabe in Datei cout << "Komplette Zeile eingeben: "; getline(cin, s); cout << "Zeichenkette ohne Leerzeichen: "; cin >> s1; cout << "Bitte Integerzahl eingeben: "; cin >> i; cout << s << ", " << s1 << ", " << i << endl; Folie 14

2.15. Gliederung Kapitel 2 Objektorientierte Programmierung Standardbibliothek: Strings, Container, Streams Definition von neuen Klassen Konstruktoren, Destruktoren Vererbung Folie 15

2.16. Definition von neuen Klassen Beispiel: Definition einer Klasse für komplexe Zahlen mit Methoden zum Setzen und zum Abfragen von Real- und Imaginärteil. Später können weitere Methoden zum Setzen und Abfragen von Betrag und Winkel, für die vier Grundrechenarten sowie für die Ein- und Ausgabe über std::cin bzw. std::cout hinzugefügt werden. (In der C++-Standardbibliothek steht übrigens bereits eine Klasse std::complex für komplexe Zahlen zur Verfügung. Dazu ist mittels #include <complex> die entsprechende Header-Datei einzubinden.) Öffentliche Methoden: Zum Setzen von Real- und Imaginärteil, zum Abfragen von Real- und Imaginärteil. Interne Attribute: Zwei double-variablen für Real- und Imaginärteil Folie 16

2.17. Definition von neuen Klassen #include <iostream> using namespace std; class Complex private: double re, im; Aufgabe: Fügen Sie weitere Methoden hinzu zum Abfragen von Betrag und Winkel, zum Addieren und Subtrahieren, zur Ausgabe auf std::cout. public: void Set(double real, double imag) re = real; im = imag; double Real() return re; double Imag() return im; ; int main() Complex c1, c2; c1.set(1, 0); c2 = c1; cout << c1.real() << ", " << c1.imag() << endl; cout << c2.real() << ", " << c2.imag() << endl; return 0; Folie 17

2.18. Gliederung Kapitel 2 Objektorientierte Programmierung Standardbibliothek: Strings, Container, Streams Definition von neuen Klassen Konstruktoren, Destruktoren Vererbung Folie 18

2.19. Konstruktoren, Destruktoren Das Anlegen neuer Instanzen und das Löschen nicht mehr benötigter Instanzen sind besondere Momente im Leben einer Klasse! int main() Complex comp1; Welche Werte werden hier eigentlich ausgegeben? cout << comp1.real() << ", " << comp1.imag() << endl; Complex comp2; comp2.set(10.0, 20.0);... Kann man dies nicht auch kürzer schreiben? Zusatzfrage: Wie schafft es ein std::vector, dass der von ihm belegte Speicher freigegeben wird, wenn der Vektor nicht mehr benötigt wird? Folie 19

2.20. Konstruktoren, Destruktoren class Complex public: // Standard-Konstruktor Complex() Set(0, 0); Beim Anlegen von neuen Instanzen sorgen Konstruktoren dafür, dass notwendige Initialisierungen durchgeführt und Attribute auf definierte Startwerte gesetzt werden. // Zusätzlicher Konstruktor Complex(double real, double imag) Set(real, imag); Destruktoren geben zum Beispiel reservierten Speicherplatz wieder frei oder erledigen andere Aufräumarbeiten. // Destruktor ~Complex() // cout << "Speicher wird wieder freigegeben" << endl;... Folie 20

2.21. Gliederung Kapitel 2 Objektorientierte Programmierung Standardbibliothek: Strings, Container, Streams Definition von neuen Klassen Konstruktoren, Destruktoren Vererbung Folie 21

2.22. Vererbung... class Complex... ; Wie kann es sein, dass der Ausgabe-Operator (<<) mit allen möglichen Stream-Arten funktioniert (Ausgabe auf dem Bildschirm, in Dateien usw.)? ostream& operator<< (ostream& strm, Complex c) strm << "(" << c.real() << ", " << c.imag() << ")"; return strm; int main() Complex c1; c1.set(1, 0); cout << c1 << endl; Antwort: Vererbung! std::ostream std::ofstream std::ostringstream ofstream file("c:/temp/test.txt"); file << c1 << endl; return 0; Folie 22

2.23. Vererbung Beispiele für Vererbung: Basisklasse Autoreifen Sommerreifen Winterreifen Ganzjahresreifen Abgeleitete Klasse mit Spikes ohne Spikes Grafisches Benutzeroberflächen-Element ( GUI-Widget ) Eingabe-Widget Ausgabe-Widget Schalt- Menü- Text- Bitmap- Listen- Textfläche eintrag feld anzeige ansicht anzeige einzeilig mehrzeilig einzeilig mehrzeilig Folie 23

2.24. Vererbung class Auto // Basisklasse private: double v; public: double Geschw() return v; void SetGeschw(double neu) v = neu; Auto() SetGeschw(100); ; class E_Auto : public Auto // Abgeleitete Klasse private: double ladung; public: double Ladezustd() return ladung; void SetLadezustd(double neu) ladung = neu; E_Auto() SetGeschw(50); SetLadezustd(100); ; void PrintGeschw(Auto a) // Diese Funktion erwartet als Parameter ein Auto cout << "Geschwindigkeit: " << a.geschw() << endl; int main() Auto a; E_Auto e; PrintGeschw(a); PrintGeschw(e); Die Klasse E_Auto erbt die Attribute und Methoden von der Klasse Auto und fügt weitere Attribute und Methoden hinzu. Die Funktion PrintGeschw kann auch mit E_Auto-Instanzen aufgerufen werden, denn E_Autos sind Autos! Folie 24