28
Einführung Klassen Übung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++ Hartmut Stadie 1/ 28

Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Algorithmen zur Datenanalyse in C++

Hartmut Stadie

11.06.2012

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 1/ 28

Page 2: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Einführung

Klassen

Übung

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 2/ 28

Page 3: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Übersicht

EinführungInformationenBeispiel: Bruchrechnung

Klassen

Übung

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 3/ 28

Page 4: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Informationen

Ablauf:Vorlesung: montags 16:00 Hörsaal IIIÜbung: im Anschluss an die Vorlesung in 9/302 und 9/305

Material:Stroustrup: The C++ Programming Language, 3rd editionhttp://www.lernnetz-sh.de/kmLinux/doc/C++-Kurs/index.htmlhttp://www.highscore.de/cpp/einfuehrung/Press et al: Numerical Recipes, 3rd editionhttp://wwwiexp.desy.de/studium/lehre/cplusplus/

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 4/ 28

Page 5: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Aufgabe: Bruchrechnung

Aufgabe:

Schreibe ein Programm zur Addition zweier Brüche!

Schema:

Bruch a und Bruch b einlesenBruch c = a + b berechnenBruch c ausgeben

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 5/ 28

Page 6: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Kodieren

Bruch besteht aus int zaehler,nenner

#include <iostream>int main(){

//Bruch a und Bruch b einlesenint Azaehler, Anenner;std::cin >> Azaehler >> Anenner;int Bzaehler, Bnenner;std::cin >> Bzaehler >> Bnenner;//Bruch c = a + b berechnenint Czaehler, Cnenner;//?//Bruch c ausgebenstd::cout << Czaehler << "/" << Cnenner << ’\n’;;

}

Kompilieren, testen, weiterdenken...

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 6/ 28

Page 7: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Kodieren II

Addition: azan + bz

bn = az·bn+bz·anan·bn

//Bruch a und Bruch b einlesenint Azaehler, Anenner;std::cin >> Azaehler >> Anenner;int Bzaehler, Bnenner;std::cin >> Bzaehler >> Bnenner;//Bruch c = a + b berechnenint Czaehler = Azaehler * Bnenner +

Bzaehler * Anenner;int Cnenner = Anenner * Bnenner;

}

Kompilieren, testen, weiterdenken...

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 7/ 28

Page 8: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Kodieren III

Ergebnis kürzen:Zähler und Nenner durch ihren größten gemeinsamen Teilerdividieren.

int ggT(int a, int b) {if(b == 0) return a;return ggT(b, a % b);

}int main(){

...int Czaehler = Azaehler * Bnenner +

Bzaehler * Anenner;int Cnenner = Anenner * Bnenner;int d = ggT(Czaehler ,Cnenner);Czaehler /= d;Cnenner /=d;

}

Kompilieren, testen, weiterdenken...fertig

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 8/ 28

Page 9: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Übersicht

Einführung

KlassenEinführungDeklaration und MemberKonstruktorenMemberfunktionenZugriffsrechteOperatorenEin- und AusgabeStatische Member

Übung

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 9/ 28

Page 10: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Klassen

Klassen:Benutzer definierter TypTyp mit Membern(interne Variablen und Funktionen)verschiedene Zugriffsrechte:

public: alle dürfen zugreifenprivate: nur innerhalb der Klasse benutzbar

struct : Member public als defaultclass : Member private als defaultObjekt: Instanz von Typ class Tthis: Zeiger auf Objekt, für das die Funktionen aufgerufenwurde

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 10/ 28

Page 11: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Deklaration und Member

Beispiel Bruch:

class Bruch{public:int z,n;//Datenmember

};

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11/ 28

Page 12: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Addier-Funktion

Bruch addiere(Bruch a, Bruch b){Bruch c;c.z = a.z * b.n + b.z * a.n;c.n = a.n * b.n;int d = ggT(c.z ,c.n);c.z /= d;c.n /= d;return c;

}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 12/ 28

Page 13: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Hauptprogramm

int main(){//Bruch a,b,c einlesenBruch a;std::cin >> a.z >> a.n;Bruch b;std::cin >> b.z >> b.n;Bruch c;std::cin >> c.z >> c.n;//Bruch c = a + b +c berechnenBruch d = addiere(a,b);Bruch e = addiere(d,c);std::cout << e.z << "/" << e.n << ’\n’;

}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 13/ 28

Page 14: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

weitere Wünsche

weitere Wünsche:

einfache Initialisierungeinfache Ausgabeautomatisches Kürzen...

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 14/ 28

Page 15: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Konstruktoren und Destruktoren

Konstruktor:wird bei der Erzeugung von Variablen aufgerufendefiniert, wie ein Objekt initialisiert wirderlauben Typumwandlungen

Destruktor:wird bei der Zerstörung einer Variablen aufgerufen

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 15/ 28

Page 16: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Konstruktoren

class Bruch{public:Bruch();//default constructorBruch(int n, int z);//specific constructorBruch(const Bruch& b);//copy constructor~Bruch();//destructor

};...Bruch b;Bruch a(3,2);

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 16/ 28

Page 17: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Bruch mit Konstruktoren

class Bruch{public:

Bruch();Bruch(int nz, int nn);

int z,n;};Bruch::Bruch(){

z = 0;n = 1;

}Bruch::Bruch(int nz, int nn){

z = nz;n = nn;

}Bruch addiere(Bruch a, Bruch b){

Bruch c(a.z * b.n + b.z * a.n,a.n * b.n);int d = ggT(c.z ,c.n);c.z /= d;c.n /= d;return c;

}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 17/ 28

Page 18: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Kopieren von Objekten

ohne copyconstructor: kopiere alle Member 1 zu 1;oder eigener Konstruktor:

class Bruch{public:

Bruch();Bruch(int nz, int nn);Bruch(const Bruch& b);

int z,n;};

Bruch::Bruch(const Bruch& b){

z = b.z;n = b.n;//std::cout << "copy called fuer " << z << "/" << n << "\n";

}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 18/ 28

Page 19: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Konstruktoren und Typumwandlung

Konstrukoren definieren auch die Typumwandlung(casting)Beispiel: int → Bruch

class Bruch {Bruch(int nz);...};Bruch::Bruch(int nz){

z = nz;n = 1;

}...int main() {Bruch f = 7;

}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 19/ 28

Page 20: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Memberfunktionen

Memberfunktionen werden für ein bestimmtes Objektaufgerufen.Beispiel:class Bruch{public:

...void kuerze();

};void Bruch::kuerze() {

int d = ggT(z ,n);z /= d;n /= d;

}Bruch addiere(Bruch a, Bruch b){

Bruch c(a.z * b.n + b.z * a.n,a.n * b.n);c.kuerze();return c;

}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 20/ 28

Page 21: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Memberfunktionen II

addiere:

class Bruch{public:

Bruch addiere(Bruch b);};

Bruch Bruch::addiere(Bruch b){

Bruch c(z * b.n + b.z * n,n * b.n);c.kuerze();return c;

}

int main(){...

Bruch d = a.addiere(b);}

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 21/ 28

Page 22: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Zugriffsrechte

Damit der Bruch immer richtig gekürzt ist, sollte niemand direktden Zähler oder Nenner ändern dürfen.Also: Setze z,n private

class Bruch{public:

Bruch();Bruch(int nz, int nn);Bruch(const Bruch& b);Bruch addiere(Bruch b);void print();

private:void kuerze();int z,n;

};

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 22/ 28

Page 23: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Operatoren

Idee: Bruch c = a + b;

in Klasse:Bruch operator+(Bruch b);...Bruch Bruch::operator+(Bruch b) {return Bruch(m_z * b.m_n + m_n * b.m_z,

m_n * b.m_n);}...Bruch erg = b1 + b2;Bruch erg = b1.operator+(b2);

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 23/ 28

Page 24: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Ausgabe

std::coutist vom Typ std::ostreambenutzt:std::ostream& operator<<(std::ostream& os,

Bruch b);

//mit Selbstreferenzstd::ostream& operator<<(std::ostream& os, Bruch b) {

return os << b.z << ’/’ << b.n;}

std::cout << "Bruch:" << erg2 << ’\n’;

Muss friend von Bruch sein!

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 24/ 28

Page 25: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Einlesen

std::cinist vom Typ std::istreambenutzt:std::istream& operator>>(std::istream& is,

Bruch& b);

std::istream& operator>>(std::istream& is,Bruch& b) {is >> z >> n;return is;

}int main() {Bruch a;std::cin >> a;}

Muss friend von Bruch sein!

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 25/ 28

Page 26: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Statische Member

statischer MemberMember, der nur einmal für alle Objekte des neuen Typsexistieren soll.

class Bruch{static int ggT(int a, int b);};int g = Bruch::ggT(5,3);

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 26/ 28

Page 27: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Design mit Klassen

Wann Klassen und wann Funktionen?Beschreibe Aufgabe

Substantive werden zu Objekten (Klassen)Verben werden zu Funktionen der entsprechenden Klassen

Beschreibe Objekteist beschreibt Typhat beschreibt Member

Benutzer interessieren nur die Memberfunktionen!!!

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 27/ 28

Page 28: Algorithmen zur Datenanalyse in C++ · Einführung KlassenÜbung Algorithmen zur Datenanalyse in C++ Hartmut Stadie 11.06.2012 Algorithmen zur Datenanalyse in C++Hartmut Stadie 1

Einführung Klassen Übung

Übersicht

Einführung

Klassen

Übung

Algorithmen zur Datenanalyse in C++ Hartmut Stadie 28/ 28