algorithmen zur datenanalyse in c++ · einführung klassenÜbung algorithmen zur datenanalyse in...
TRANSCRIPT
Einführung Klassen Übung
Algorithmen zur Datenanalyse in C++
Hartmut Stadie
11.06.2012
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 1/ 28
Einführung Klassen Übung
Einführung
Klassen
Übung
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 2/ 28
Einführung Klassen Übung
Übersicht
EinführungInformationenBeispiel: Bruchrechnung
Klassen
Übung
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 3/ 28
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
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
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
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
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
Einführung Klassen Übung
Übersicht
Einführung
KlassenEinführungDeklaration und MemberKonstruktorenMemberfunktionenZugriffsrechteOperatorenEin- und AusgabeStatische Member
Übung
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 9/ 28
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
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
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
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
Einführung Klassen Übung
weitere Wünsche
weitere Wünsche:
einfache Initialisierungeinfache Ausgabeautomatisches Kürzen...
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 14/ 28
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
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
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
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
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
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
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
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
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
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
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
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
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
Einführung Klassen Übung
Übersicht
Einführung
Klassen
Übung
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 28/ 28