© A. Schwing, 2010Institute of Visual Computing Informatik I for D-MAVT Exercise Session 10.

Slides:



Advertisements
Ähnliche Präsentationen
M a r c – o l i v e r p a h l Informatik I – Kapitel 7 Klassen und höhere Datentypen Zusammenfassung des Kapitel 7 Küchlin, Weber, Einführung in die Informatik,
Advertisements

der Universität Oldenburg
Klassen - Verkettete Liste -
Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt.
Objektorientierte Programmierung
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Anwendungen des OODM auf die ADB / NDB
Kurt Rosenberg. C# für.NET oder.NET für C# is(C# == C++ && Java)? true : false ; reines C# Ausblick Überblick.
Agenda Sitzung 2 für den Programmaufbau
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.
Verteilte Software - Java - Prozedurale Programmierung 1
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Binäre Bäume Richard Göbel.
Java: Objektorientierte Programmierung
Java: Grundlagen der Objektorientierung
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
08-GraphikImplementierung Implementierung der Graphik in EMMA301Paint.
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Programmierung im Netz und Internet: Einführung in die Programmiersprache Java Teil I 1 Klassen Objekte von.
FH-Hof Sortieren mit Binären Bäumen Richard Göbel.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
FH-Hof Singleton Pattern Richard Göbel. FH-Hof Motivation Bestimmte Klassen sollen nur ein Objekt haben Nur ein Fabrikobjekt für eine Fabrikklasse Zentraler.
Informatik I for D-MAVT
© Alexander Schwing, 2010Institute of Visual Computing Informatik I for D-MAVT Exercise Session 2.
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Medien zwischen Technologie und Gesellschaft Dozent: Herr Prof. Dr. Manfred Thaller SS 13 Referent: Christian Braun.
OO implementieren Teil IV Objekte erzeugen. © René ProbstModul 226IV - 2 Von der Klasse zum Objekt Plan Bau Objekt Klasse Instanzierung Objekt Das Objekt.
© Roland Angst, 2010Institute of Visual Computing Informatik I for D-MAVT Exercise Session 1.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Parallel Programming Thread Synchronization. Heute 1. Lösung zu Assignment 2 2. Erstellen und Starten von Threads in Java 3. Das synchronized Schlüsselwort.
Informatik 1 Letzte Übung.
Abteilung für Telekooperation Übung Softwareentwicklung 2 für Wirtschaftsinformatik Dr. Wieland Schwinger
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Dynamische Datentypen
Purga - Scriptengine Ein Einblick.
Starten der Entwicklungsumgebung (IDE)
Learning By Doing Konstruktoren Gleicher Name wie die Klasse Zur Initialisierung des Objekts, insbesondere mit Parametern Wir immer bei der Objekterzeugung.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Programmiervorkurs WS 2014/15 Instanzmethoden
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Tutorium Software-Engineering SS14 Florian Manghofer.
Implementieren von Klassen
Grundkurs Informatik 11-13
 Präsentation transkript:

© A. Schwing, 2010Institute of Visual Computing Informatik I for D-MAVT Exercise Session 10

© A. Schwing, 2010Institute of Visual Computing Organisatorisches Teaching Assistant Alexander CAB G 89 Website: Übungsabgabe Auf Papier, keine s Später wenn Programme umfangreicher werden, ev. auch Abgabe per möglich Testatbedingungen 75% aller Übungen Voraussichtlich 12 Serien (d.h. 9 gelöste Serien)

© A. Schwing, 2010Institute of Visual Computing Bemerkungen Mehr Mühe geben beim Lösen Darstellung (Kommentare, Code korrekt einrücken, …) Auch Debuggen will gelernt sein! Abgabe von garantiert nicht funktionierendem Code Falscher Syntax nicht kompilierbar Endlosschleifen Testen des Codes (auch mit Spezialfällen!) Falls Fehler dann immer noch nicht behoben werden kann, zumindest ein Kommentar angeben, wo das Problem liegt 3 Primäre Informationsquellen Vorlesungsslides, Aufgabenblatt, Slides der Übungsstunde Abgegebene Lösungen sind zum Teil trotzdem fast nicht zu akzeptieren Lest die Aufgabenstellung GENAU durch Lösung an Prüfung, welche der Aufgabenstellung widerspricht, wird 0 Punkte geben z.B.: verwendet dynamisches Array falls in Aufgabenstellung verlangt!

© A. Schwing, 2010Institute of Visual Computing Bemerkungen Darum neue Regel von nun an: Programmieraufgaben werden nur noch akzeptiert, wenn ein Beispielinput mit zugehörigem Output als Kommentar oder als Screenshot angegeben wird. Das zwingt euch, euren Code zu testen! Wenn ich feststelle, dass das Program nie getestet wurde Aufgabe wird nicht akzeptiert Falls ein Problem beim Testen entdeckt wird, das aber beim besten Willen nicht gelöst werden kann Kommentar mit Problembeschreibung einfügen

© A. Schwing, 2010Institute of Visual Computing Themen Nachbesprechung Repetition (Klassen, Konstruktoren) Operatoren Friends Templates Vorbesprechung Serie 10

© A. Schwing, 2010Institute of Visual Computing Nachbesprechung Verdoppeln der Arraygrösse: Wo liegt das Problem in folgendem Code? if (stack.no_elements == stack.size) { double* new_array = new double[2*stack.size]; for (int i=0; i < stack.size; i++) // Copy old array new_array[i] = stack.array[i]; delete[] stack.array; // free memory of old array stack.size *= 2; stack.array = new_array; delete[] new_array; } Erstes Element im Stack soll an Indexposition 0 stehen Acht geben, wann stack.no_elements erhöht werden muss

© A. Schwing, 2010Institute of Visual Computing Nachbesprechung Taschenrechner: Richtige Reihenfolge der Operatoren nach pop Stack: siehe Repetition

© A. Schwing, 2010Institute of Visual Computing Repetition Eine Klasse ist eine Datenstruktur mit Funktionen Ein Objekt ist eine Instanz einer Klasse Die Zugriffsart (access specifiers) zeigt an, wer auf welche Attribute/Methoden zugreifen darf Private (default) Public Protected

© A. Schwing, 2010Institute of Visual Computing Repetition Konstruktoren Werden beim Erzeugen aufgerufen und sind verantwortlich für korrekte Initialisierung Destruktoren Werden beim Auflösen eines Objekts aufgerufen und sind verantwortlich für Freigabe des Speichers und anderen Resourcen Konstruktoren können nicht wie normale Funktionen aufgerufen werden!

© A. Schwing, 2010Institute of Visual Computing Repetition Default Konstruktoren Default Ctor: MyClass::MyClass() Selbstinitialisierung Default Copy Ctor: MyClass::MyClass(const MyClass& ) Initialisierung von einer anderen Klasse des selben Typs MyClass c = a + b; MyClass d(c); Default Assignment Operator: MyClass& MyClass::operator=(const MyClass&) c = a + b; Sobald ein eigener Ctor definiert wird gibt es keinen Default Ctor mehr ? ?

© A. Schwing, 2010Institute of Visual Computing Repetition Beispiel #include class Stack{ double *s; int pos; int cap; public: Stack(int cap = 10); Stack(const Stack&); ~Stack(); Stack& operator= (const Stack&); }; Stack::Stack(int cap) {s = new double[cap];this->cap = cap;pos = 0;} Stack::Stack(const Stack& oc) {s = new double[oc.cap];memcpy(s, oc.s, oc.cap*sizeof(double)); cap = oc.cap;pos = oc.pos;} Stack::~Stack() {delete [] s;} Stack& Stack::operator= (const Stack& oc) {if(this!=&oc){this->~Stack();s = new double[oc.cap]; memcpy(s, oc.s, oc.cap*sizeof(double));cap = oc.cap;pos = oc.pos;} return *this; } int main() { Stack a; Stack b(5); Stack c(b); Stack d = a; d = c; return 0; } ?

© A. Schwing, 2010Institute of Visual Computing Repetition Paremeterübergabe By-Value Vorsicht bei Klassen die dynamische Speicherallokation verwenden Deep vs. shallow copy eigene Konstruktoren und Operatoren für deep copy void doSomething(Stack tmp) { … } int main() { Stack a; doSomething(a); return 0; } #include class Stack{ double *s; int pos; int cap; public: Stack(int cap = 10); Stack(Stack& oc); ~Stack(); Stack& operator= (const Stack&); };

© A. Schwing, 2010Institute of Visual Computing Repetition Shallow copy Deep copy Daten Objekt 1 Zeiger Objekt 2 Zeiger Daten Objekt 1 Zeiger Objekt 2 Zeiger Daten

© A. Schwing, 2010Institute of Visual Computing Repetition Konstruktor: Copy-Konstruktor: Destruktor: Assignment Operator: Stack& Stack::operator= (const Stack& oc) { if(this!=&oc) { this->~Stack(); s = new double[oc.cap]; memcpy(s, oc.s, oc.cap*sizeof(double)); cap = oc.cap; pos = oc.pos; return *this; } } Stack::Stack(const Stack& oc) { s = new double[oc.cap]; memcpy(s, oc.s, oc.cap*sizeof(double)); cap = oc.cap;pos = oc.pos; } Stack::Stack(int cap = 10) { s = new double[cap]; this->cap = cap; pos = 0; } Stack::~Stack() { delete [] s; }

© A. Schwing, 2010Institute of Visual Computing Operatoren Spezielle Funktionen die mit Operatoren (+,-,*,/,=,…) aufgerufen werden Syntax: Rückgabetyp operator Zeichen ( Parameterliste ) { Block } Operatorfunktion kann überladen werden Operatorfunktionen müssen nicht zu einer Klasse gehören (können auch global definiert sein) Operatorfunktionen haben erprobte Syntax, d.h. der Funktionskopf sieht fast immer ähnlich aus

© A. Schwing, 2010Institute of Visual Computing Operatoren Oft auftretende Syntax: Wikipedia

© A. Schwing, 2010Institute of Visual Computing Operatoren class CRational { int numerator, denominator; public: CRational(const int, const int); const CRational operator+(const CRational&) const; const CRational operator+(const int n) const; }; CRational::CRational(const int nNum, const int nDenom) { numerator = nNum; denominator = nDenom; } const CRational CRational::operator+(const int n) const { CRational var(this->numerator + n*this->denominator, this->denominator); return var; } const CRational CRational::operator +(const CRational &r) const { CRational var(this->numerator*r.denominator + r.numerator*this->denominator, r.denominator*this->denominator); return var; } CRational operator+(int& n, CRational& r) { return r+n; } Outside Class Definition Inside Class Definition int main() { CRational half(1,2); CRational tmp = half + 2; CRational tmp1 = half + tmp; CRational tmp2 = 2 + tmp1; return 0; }

© A. Schwing, 2010Institute of Visual Computing Friends innerhalb der Definition einer Klasse können Funktionen oder andere Klassen angegeben werden, die auf die privaten Daten der Klasse zugreifen dürfen. Andere Klasse: friend class OtherClassName Nur eine Funktion einer anderen Klasse: friend ReturnType OtherClassName::otherMethod(…) Globale Funktion: friend ReturnType FunctionName(…)

© A. Schwing, 2010Institute of Visual Computing Friends Friends führen zu intuitiverem Code und sind nötig um Operator Overloading korrekt (effizienter) zu implementieren Friend functions do not break encapsulation; instead they naturally extend the encapsulation barrier

© A. Schwing, 2010Institute of Visual Computing Friends Beispiel 1: #include using namespace std; class CRational { int numerator, denominator; friend ostream& operator<<(ostream &out, const CRational &r); public: CRational(const int nNumerator, const int nDenominator); }; CRational::CRational(const int nNumerator, const int nDenominator) : numerator(nNumerator), denominator(nDenominator) { } ostream& operator<<(ostream& out, const CRational &r) { // Access private members of CRational to display r. out << r.numerator << "/" << r.denominator; return out; } int main() { CRational half(1, 2); cout << half << endl; return 0; }

© A. Schwing, 2010Institute of Visual Computing Friends Beispiel 2: class CRational { int numerator, denominator; public: CRational(const int, const int); void divide(int); }; CRational::CRational(const int nNum, const int nDenom) : numerator(nNum), denominator(nDenom) { } void CRational::divide(int n) { denominator *= n; } int main() { CRational half(1, 2); half.divide(2); return 0; } class CRational { int numerator, denominator; friend CRational& operator/(CRational& r, int n); public: CRational(const int, const int); }; CRational::CRational(const int nNum, const int nDenom) : numerator(nNum), denominator(nDenom) {} CRational operator/(const CRational& r, const int n) { CRational out(r.numerator, r.denominator*n); return out; } int main() { CRational half(1, 2); CRational quater = half/2; return 0; }

© A. Schwing, 2010Institute of Visual Computing Friends Beispiel 3 class CRational { int numerator, denominator; friend CRational operator+(int, CRational&); public: CRational(const int, const int); const CRational operator+(const CRational&) const; const CRational operator+(const int n) const; }; CRational::CRational(const int nNum, const int nDenom) { numerator = nNum; denominator = nDenom; } const CRational CRational::operator+(const int n) const { CRational var(this->numerator + n*this->denominator, this->denominator); return var; } const CRational CRational::operator +(const CRational &r) const { CRational var(this->numerator*r.denominator + r.numerator*this->denominator, r.denominator*this->denominator); return var; } CRational operator+(int n, CRational& r) { return r+n; } int main() { CRational half(1,2); CRational tmp = half + 2; CRational tmp1 = half + tmp; CRational tmp2 = 2 + tmp1; return 0; } Outside oder Inside? Bemerkung: Mit dieser Implementierung wäre friend-Status nicht nötig gewesen…

© A. Schwing, 2010Institute of Visual Computing Templates Werkzeug um einen Algorithmus allgemein zu beschreiben ohne den Datentyp festzulegen Compiled on demand Für jeden Datentyp, auf den der Algorithmus angewendet wird, wird eine eigene Instanz des Algorithmus generiert und compiliert Generische Algorithmen / Klassen Algorithmen / Methoden sind oft unabhängig vom Datentyp (int, float, double, …) Minimum/Maximum/Swap Stack Sortieren …

© A. Schwing, 2010Institute of Visual Computing Templates Beispiele double min(double a, double b) { return a<b ? a : b; } template T min(T a, T b) { return a<b ? a : b; } ? double max(double a, double b) { return a>b ? a : b; } template T max(T a, T b) { return a>b ? a : b; } ? void swap(double& a, double& b) { double tmp = a; a = b; b = tmp; } template void swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } ?

© A. Schwing, 2010Institute of Visual Computing Templates #include int maxIX(double* arr, int len) { int mI = 0; for(int i=1;i<len;++i) { if(arr[i]>arr[mI]) mI = i; } return mI; } void maxSort(double* arr, int n) { if (n > 1) {int m = maxIX(arr, n); double tmp = arr[m]; arr[m] = arr[n-1]; arr[n-1] = tmp; maxSort(arr, n-1); } int main() { double values[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; maxSort(values, 9); for(int k=0;k<9;++k) std::cout << values[k]; return 0; } #include template int maxIX(T* arr, int len) { int mI = 0; for(int i=1;i<len;++i) { if(arr[i]>arr[mI]) mI = i; } return mI; } template void maxSort(T* arr, int n) { if (n > 1) {int m = maxIX(arr, n); T tmp = arr[m]; arr[m] = arr[n-1]; arr[n-1] = tmp; maxSort(arr, n-1); } int main() { double values[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; maxSort(values, 9); for(int k=0;k<9;++k) std::cout << values[k]; return 0; } ?

© A. Schwing, 2010Institute of Visual Computing Templates Beispiel: Templates für Klassen template class mypair { T values [2]; public: mypair (T first, T second) { values[0]=first; values[1]=second; } }; int main() { mypair Instance1(1, 2/3);//(1, 0) mypair Instance2(1, -1.7);//(1, -1) mypair Instance3(1, 2/3);//(1.0, 0.0) mypair Instance4(1, -1.7);//(1.0, -1.7) return 0; } ?

© A. Schwing, 2010Institute of Visual Computing Templates Non-Type Parameters #include using namespace std; template class mysequence { T memblock [N]; public: void setmember (int x, T value); T getmember (int x); }; template void mysequence ::setmember (int x, T value) { memblock[x]=value; } template T mysequence ::getmember (int x) { return memblock[x]; } int main () { mysequence myints; mysequence myfloats; mysequence <> mychars; myints.setmember (0,100); myfloats.setmember (3,3.1416); cout << myints.getmember(0) << '\n'; cout << myfloats.getmember(3) << '\n'; return 0; }

© A. Schwing, 2010Institute of Visual Computing Vorbesprechung Serie 10 Programmierübung: Klasse Polynom Dynamisches Array mit Polynomkoeffizienten Operatoren selbst schreiben class cPolynom { private: double *coef; int deg; public: // Ausgabefunktion fuer das Polynom (schöner wärs mit Überladen von <<) void print() const; };

© A. Schwing, 2010Institute of Visual Computing Vorbesprechung Serie 10 A) Konstruktoren cPolynom(double* coef, int degree); cPolynom(int degree); B) Destruktor ~cPolynom(); C) Eval Methode D) Addition const cPolynom operator+(const cPolynom& r) const; E) Subtraktion (siehe Addition)

© A. Schwing, 2010Institute of Visual Computing Vorbesprechung Serie 10 F) Kopierkonstruktor cPolynom(const cPolynom& r); G) Assignment Operator cPolynom& operator=(const cPolynom& r); Deep oder shallow?