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

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

Embed Size (px)

Citation preview

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

© A. Schwing, 2010 Institute of Visual Computing

Informatik I for D-MAVT

Exercise Session 10

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

© A. Schwing, 2010 Institute of Visual Computing

Organisatorisches

Teaching Assistant Alexander Schwing([email protected])

CAB G 89

Website: http://www.alexander-schwing.de/Info1DMaVt/

Übungsabgabe Auf Papier, keine Emails

Später wenn Programme umfangreicher werden, ev. auch Abgabe per Email möglich

Testatbedingungen 75% aller Übungen

Voraussichtlich 12 Serien (d.h. 9 gelöste Serien)

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

© A. Schwing, 2010 Institute 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!

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

© A. Schwing, 2010 Institute 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

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

© A. Schwing, 2010 Institute of Visual Computing

Themen

Nachbesprechung

Repetition (Klassen, Konstruktoren)

Operatoren

Friends

Templates

Vorbesprechung Serie 10

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

© A. Schwing, 2010 Institute 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

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

© A. Schwing, 2010 Institute of Visual Computing

Nachbesprechung

Taschenrechner:Richtige Reihenfolge der Operatoren nach pop

Stack: siehe Repetition

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

© A. Schwing, 2010 Institute 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

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

© A. Schwing, 2010 Institute of Visual Computing

Repetition

KonstruktorenWerden beim Erzeugen aufgerufen und sind

verantwortlich für korrekte Initialisierung

DestruktorenWerden 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!

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

© A. Schwing, 2010 Institute of Visual Computing

Repetition

Default Konstruktoren

Default C’tor: MyClass::MyClass()Selbstinitialisierung

Default Copy C’tor: MyClass::MyClass(const MyClass& )

Initialisierung von einer anderen Klasse des selben TypsMyClass c = a + b; MyClass d(c);

Default Assignment Operator: MyClass& MyClass::operator=(const MyClass&)c = a + b;

Sobald ein eigener C’tor definiert wird gibt es keinen Default C’tor mehr

?

?

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

© A. Schwing, 2010 Institute of Visual Computing

Repetition

Beispiel#include <memory>

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;

}?

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

© A. Schwing, 2010 Institute 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 <memory>

class Stack{

double *s;

int pos;

int cap;

public:

Stack(int cap = 10);

Stack(Stack& oc);

~Stack();

Stack& operator= (const Stack&);

};

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

© A. Schwing, 2010 Institute of Visual Computing

Repetition

Shallow copy

Deep copy

Daten

Objekt 1Zeiger

Objekt 2Zeiger

Daten

Objekt 1Zeiger

Objekt 2Zeiger

Daten

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

© A. Schwing, 2010 Institute 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;

}

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

© A. Schwing, 2010 Institute 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

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

© A. Schwing, 2010 Institute of Visual Computing

Operatoren

Oft auftretende Syntax:Include

din C As member of T1 Outside class definitions

+a Yes Yes

T1 T1::operator +() const;

T1 operator +(const T1& a);

a + b Yes Yes

T1 T1::operator +(const T2& b) const;

T1 operator +(const T1& a, const T2& b);

Prefix ++a Yes Yes

T1& T1::operator ++();

T1& operator ++(T1& a);

T1 T1::operator ++(int);

T1 operator ++(T1& a, int);

a += b Yes Yes

T1& T1::operator +=(const T2& b);

T1& operator +=(T1& a, const T2& b);

-a Yes Yes

T1 T1::operator -() const;

T1 operator -(const T1& a);

a - b Yes Yes

T1 T1::operator -(const T2& b) const;

T1 operator -(const T1& a, const T2& b);

Prefix --a Yes Yes

T1& T1::operator --();

T1& operator --(T1& a);

T1 T1::operator --(int);

T1 operator --(T1& a, int);

a -= b Yes Yes

T1& T1::operator -=(const T2& b);

T1& operator -=(T1& a, const T2& b);

a * b Yes Yes

T1 T1::operator *(const T2& b) const;

T1 operator *(const T1 &a, const T2& b);

Yes YesNote: C++ uses the unnamed dummy-parameter

int

to differentiate between prefix and postfix decrement operators.

Assignment by subtractionMultiplication (product)

Assignment by additionUnary minus (negation)Subtraction (difference)

Decrement Postfix a--

Increment Postfix a++Yes Yes

Note: C++ uses the unnamed dummy-parameter

int

to differentiate between prefix and postfix increment operators.

Operator name Syntax OverloadablePrototype examples (T1 and T2 are types)

Unary plusAddition

Wikipedia

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

© A. Schwing, 2010 Institute of Visual Computing

Operatorenclass 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;

}

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

© A. Schwing, 2010 Institute 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(…)

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

© A. Schwing, 2010 Institute 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”

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

© A. Schwing, 2010 Institute of Visual Computing

Friends

Beispiel 1:#include <iostream>

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;

}

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

© A. Schwing, 2010 Institute 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;

}

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

© A. Schwing, 2010 Institute of Visual Computing

Friends

Beispiel 3class 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…

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

© A. Schwing, 2010 Institute 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

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

© A. Schwing, 2010 Institute of Visual Computing

Templates

Beispieledouble min(double a, double b) {

return a<b ? a : b;

}

template <class T>T min(T a, T b) {

return a<b ? a : b;

}

?

double max(double a, double b) {return a>b ? a : b;

}

template <class T>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<class T>void swap(T& a, T& b) {

T tmp = a;a = b;b = tmp;

}

?

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

© A. Schwing, 2010 Institute of Visual Computing

Templates#include <iostream>

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 <iostream>

template <class T> 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 <class T>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;

}

?

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

© A. Schwing, 2010 Institute of Visual Computing

Templates

Beispiel: Templates für Klassentemplate <class T>class mypair {

T values [2];public:

mypair (T first, T second) {values[0]=first; values[1]=second;

}};

int main() {mypair<int> Instance1(1, 2/3); //(1, 0)

mypair<int> Instance2(1, -1.7); //(1, -1)

mypair<double> Instance3(1, 2/3); //(1.0, 0.0)

mypair<double> Instance4(1, -1.7); //(1.0, -1.7)

return 0;

}

?

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

© A. Schwing, 2010 Institute of Visual Computing

Templates

Non-Type Parameters#include <iostream>using namespace std;template <class T = char, int N = 10>class mysequence {

T memblock [N];public:

void setmember (int x, T value);T getmember (int x);

};template <class T, int N>void mysequence<T,N>::setmember (int x, T value) {

memblock[x]=value;}template <class T, int N>T mysequence<T,N>::getmember (int x) {

return memblock[x];}int main () {

mysequence <int,5> myints;mysequence <double,5> myfloats;mysequence <> mychars;myints.setmember (0,100);myfloats.setmember (3,3.1416);cout << myints.getmember(0) << '\n';cout << myfloats.getmember(3) << '\n';return 0;

}

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

© A. Schwing, 2010 Institute of Visual Computing

Vorbesprechung Serie 10

Programmierübung: Klasse PolynomDynamisches Array mit Polynomkoeffizienten

Operatoren selbst schreibenclass cPolynom{private: double *coef; int deg;public: // Ausgabefunktion fuer das Polynom (schöner wär’s mit Überladen von <<) void print() const;};

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

© A. Schwing, 2010 Institute 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)

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

© A. Schwing, 2010 Institute of Visual Computing

Vorbesprechung Serie 10

F) Kopierkonstruktor cPolynom(const cPolynom& r);

G) Assignment Operator cPolynom& operator=(const cPolynom& r);

Deep oder shallow?