Informatik 1 ( ) D-MAVT F2011. Klassen. Yves Brise Übungsstunde 10

Save this PDF as:
 WORD  PNG  TXT  JPG

Größe: px
Ab Seite anzeigen:

Download "Informatik 1 ( ) D-MAVT F2011. Klassen. Yves Brise Übungsstunde 10"

Transkript

1 Informatik 1 ( ) D-MAVT F2011 Klassen

2 Übungsbetrieb Es gibt noch eine Übung 11 (7.5 Punkte ist trotzdem die Testatgrenze) Testate bestätige ich euch per Mail Es gibt noch 3 weitere Übungstermine, in denen nicht viel Übungen zu bearbeiten sind (Prüfungsvorbereitung, Fragestunde, Kaffee trinken) In den Semesterferien wird es 1-2 Präsenztermine geben (Raum mit einigen Assistenten) zur Klärung von Fragen und zur Prüfungsvorbereitung

3 Nachbesprechung Blatt 8, Aufgabe 1 Fibonacci Zahlen int fib_rec(int n) { if (n==0) return 0; if (n==1) return 1; return fib_rec(n-1) + fib_rec(n-2); int fib_it(int n) { int a(0), b(1); if (n==0) return 0; for (int i=1; i < n; ++i) { int temp = a; a = b; b = temp + a; return b; Das Problem ist nicht fib_it... das ist relativ effizient. Das Problem ist fib_rec. Der Auswertungsbaum hat exponentiell viele Knoten. Viele der Werte werden mehrfach ausgerechnet. F n = 1 1+ n n

4 Nachbesprechung Blatt 8, Telefonbuch // Ein Glied der verketteten Liste mit Telefonnummer und Name struct eintrag{!eintrag * next;! int nr;! char name[100]; ; int main() { eintrag * buch = 0;!// Erstelle leeres Telefonbuch // Ermoeglicht dem Benutzer die naechste Aktion zu waehlen int wahl = 1; while (wahl!= 0) { // Erleutere die Wahlmoeglichkeit cin >> wahl; cin.ignore(); // Rufe je nach Wahl die richtige Funktion auf switch (wahl) { case 0: deletebuch(buch); break; case 1: addeintrag(buch); break; case 2: printbuch(buch); break; case 3: deleteeintrag(buch); break; default: cout << "keine gueltige Angabe" << endl; return 0;

5 Nachbesprechung Blatt 8, Telefonbuch void deletebuch(eintrag * &node) { eintrag * temp; // Gehe durch die verkettete Liste und loesche jeden Eintrag while (node!= 0) { temp = node; node = node->next; delete temp; void printbuch(eintrag * node) { cout << "Ihr Telefonbuch" << endl << " " << endl; while (node!= 0) // Gehe durch die verkettete Liste { // Schreibe Name und Telefonummer auf die Konsole aus cout << node->name << " " << node->nr << endl; node = node->next; cout << " " << endl;

6 Nachbesprechung Blatt 8, Telefonbuch void addeintrag(eintrag * &node) { eintrag * neu = new eintrag; // Alloziert Speicher fuer neuen Eintrag eintrag * temp; // Einlesen Name und Telefonnummer // Gibt es noch gar keinen Eintrag im Telefonbuch? if (node == 0) { node = neu; // Muss der neue Eintrag an 1.Stelle stehen? else if (strcmp (node->name, neu->name) > 0) { neu->next = node; node = neu; // Dann muss der Eintrag an einer anderen Stelle stehen else { temp = node; while (temp->next!= 0 && strcmp (temp->next->name, neu->name) < 0) temp = temp->next; neu->next = temp->next; temp->next = neu;

7 Nachbesprechung Blatt 8, Telefonbuch void deleteeintrag(eintrag * &node) { eintrag * temp, * nodetemp; char name[100] = Johann Muster ; // Gibt es noch gar keinen Eintrag im Telefonbuch if (node == 0) { cout << "Ihr Telefonbuch ist noch leer."<< endl; // Muss der 1. Eintrag geloescht werden? else if (strcmp (node->name, name) == 0) { temp = node; node = node->next; delete temp; cout << "Der Eintrag " << name << " wurde im Telefonbuch geloescht."<< endl; // Muss ein anderer Eintrag geloescht werden else { nodetemp = node; while (nodetemp->next!= 0 && strcmp (nodetemp->next->name, name)!= 0) nodetemp = nodetemp->next; if (nodetemp->next!= 0 && strcmp (nodetemp->next->name, name) == 0) { temp = nodetemp->next; nodetemp->next = nodetemp->next->next; delete temp; else { // Name nicht im Telefonbuch cout << "Es gibt keinen Eintrag fuer " << name << " im Telefonbuch."<< endl;

8 Klassen Objektorientierte Programmierung Reale Dinge oder logische Untereinheiten werden als Klassen modelliert. Beispiele: Klassen enthalten nicht nur Daten sondern auch Funktionalität (Methoden). Rechteck Höhe Breite Skalieren Rotieren Spielbrett Felder Zug Bewege Figur Gewinnstellung? Kinosaal #Reihen Sitze Klimaanlage Reservieren Abfragen Matrix Dimension Einträge Zerlegen Multiplizieren Eintrag setzen Eintrag abfragen Auto Position Ziel Richtung Geschwindigkeit Bewege Kollision Berechne Weg

9 Vorteile Objektorientierte Programmierung simplicity: software objects model real world objects, so the complexity is reduced and the program structure is very clear; modularity: each object forms a separate entity whose internal workings are decoupled from other parts of the system; modifiability: it is easy to make minor changes in the data representation or the procedures in an OO program. Changes inside a class do not affect any other part of a program, since the only public interface that the external world has to a class is through the use of methods; extensibility: adding new features or responding to changing operating environments can be solved by introducing a few new objects and modifying some existing ones; maintainability: objects can be maintained separately, making locating and fixing problems easier; re-usability: objects can be reused in different programs.

10 Vererbung Auto Position Ziel Richtung Geschwindigkeit Bewege Kollision Berechne Weg Limousine Pool Helipad Heize Pool Öffne Trennscheibe class Auto { double posx, posy; double zielx, ziely; bool kollision();... ; class Limousine : public Auto { private: Pool pool; Helipad helipad; void heizepool(int celsius); void oeffnescheibe(): ; int main() { Auto auto; Limousine limo; auto = limo; // OK (Daten gehen verloren) limo = auto; // NOK (keine Zuweisung moegl.)

11 Friends Berechtigungen in Klassen Es gibt private, protected und public. Zusätzlich können auch Freunde deklariert werden, die privaten Zugriff haben sollen. class Foo { friend void fkt(foo&); friend class Bar; private: void geheim(); ; class Bar { void oeffentlich(foo& f) { f.geheim(); ; void Foo::geheim() { std::cout << Geheim!\n ; void fkt(foo& f) { f.geheim(); int main() { Foo f; Bar b; f.geheim(); // NOK (private) b.oeffentlich(f); // OK fkt(f); // OK Erster Aufruf schlägt fehl, da die Funktion geheim nicht öffentlich ist. Die anderen Aufrufe sind in Ordnung, weil sie indirekt über befreundete Funktionen/Klassen getätigt werden.

12 Overloading vs Virtuelle Funktionen #include <iostream> using namespace std; class Foo { void f() {cout << "A\n"; void f(int a){ cout << "B\n"; virtual int g() {cout << 1 << endl; ; class Bar: public Foo { void f() {cout << "C\n"; virtual int g() {cout << 2 << endl; ; int main() { Foo f; Bar b; f.f(); // A b.f(); // C Foo(b).f(); // A f.f(1); // OK... B b.f(1); // NOK f.g(); // 1 b.g(); // 2 Overloading Virtual Not Overloading... versteckt alle Implementationen von f aus Foo.

13 Overloading vs Virtuelle Funktionen class Foo { void f() {cout << "A\n"; void f(int a){ cout << "B\n"; ; class Bar: public Foo { using Foo::f; void f() {cout << "C\n"; ; Wie kann man f trotzdem verwenden? Variante 1: Use using class Foo { void f() {cout << "A\n"; void f(int a){ cout << "B\n"; ; Variante I1: Eigenes overloading class Bar: public Foo { void f(int a) {... void f() {cout << "C\n"; ;

14 Blatt 10, Aufgabe 1&2 Aufgabe 1 private, public, protected... Google hilft :-) Aufgabe 2 Ausgehend von der vektor Klasse aus Serie 9... vektor::vektor(const vektor& v) vektor vektor::operator+ (const vektor &s) vektor& vektor::operator+= (const vektor &v) vektor a; vektor b(a); vektor c(a+b); c += a; Nützlich wäre auch noch ein normaler Zuweisungsoperator, ist aber nicht in der Aufgabenstellung gefragt.

15 Blatt 10, Aufgabe 3 class tpolygon { protected: int width, height; void set_values (int a, int b) { width=a; height=b; ; class trectangle: public tpolygon { int area ()! { return (width * height); ; class ttriangle: public tpolygon { int area ()! { return (width * height / 2); ; int main () { trectangle rect; ttriangle trgl; rect.set_values (4,5); trgl.set_values (4,5); cout << rect.area() << endl; cout << trgl.area() << endl; return 0; a) und b) relativ simpel. c) Überladen sie set_values in tquadrat erneut, oder verwenden sie using. Letzteres bietet allerdings keinen Schutz gegen unsachgemässe Bedienung.