informatik i/ii pvk dienstag informatik 1 tag 2. informatik i/ii pvk2 ablauf heute rekursion structs...
Post on 06-Apr-2015
110 Views
Preview:
TRANSCRIPT
Informatik I/II PVK
DienstagInformatik 1 Tag 2
Informatik I/II PVK 2
Ablauf heute
Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings, streams) Vererbung
Informatik I/II PVK 3
Rekursion
Eine Funktion kann sich selbst aufrufen Auf diese Art wird ein Problem in ein oder mehrere
kleinere Probleme der gleichen Art aufgeteilt, bis das zu lösende Teilproblem trivial ist.
Bsp.: Fibonachi-Berechnung Erzeuge die Folge: 1, 1, 2, 3, 5, 8, 13, 25, 38, ... int fib(int n) {
if (n == 1 || n == 0) return 1;
return fib(n-1) + fib(n-2);
}
Informatik I/II PVK 4
Rekursion 2
Eine Rekursion benötigt immer eine Abbruchbedingung
Ansonsten spannt sich der Baum immer weiter auf Die Rekursion wird als Alternative zur Iteration
angesehen Jeder neue Funktionsaufruf benötigt neue Variablen
auf dem Stack Bei zu grosser Rekursionstiefe kann es zu einem
Stack Overflow kommen Rekursion wird noch genauer in Informatik II behandelt
Informatik I/II PVK 5
Prüfungsfrage 2
Rekursion als Lösungweg finden Finde kleineres Problem, welches sich wieder als
ursprüngliches Problem formulieren lässt Finde Abbruchbedingungen (d.h. Triviale Lösungen) Implementiere Funktion
Informatik I/II PVK 6
Prüfungsfrage 2
Auf Basis des Pascalschen Dreiecks lässt sich auch eine Rekursionsformel für den Binomialkoeffizienten angeben:
Programmieren Sie nun die Funktion int binomRek(int n, int k) als rekursive Funktion, welche erneut den Binomialkoeffizienten berechnet.
Informatik I/II PVK 7
Lösung des vorherigen Slide
int binomRek(int n, int k)
{
if (n == k || k == 0) return 1;
else return binomRek(n-1, k) + binomRek(n-1, k-1);
}
Informatik I/II PVK 8
Structs
Ein Struct ist ein Datentyp der mehrere Werte verschiedener Typen (auch Pointer) speichern kann.
struct circle {
char label[20];
float radius;
int posX, posY;
};
Structs sind die Vorläufer von Klassen
circle c; // Deklaration c = {„c1“, 3.24, 1, 4}; // Initialisierung
Informatik I/II PVK 9
Structs 2
Wir können auf einzelne Mitglieder des structs mit . zugreifen:
c.label = „small circle“; Selbstverständlich können wir auch Arrays und Pointers
von structs anfertigen:
circle allCircles[5]; circle* c_ptr = &c;
Structs können einfach kopiert werden:
circle p = c; double area(circle c);
Informatik I/II PVK 10
Union
Eine Union gibt uns die Wahl welche Variable wir speichern wollen. Wir können aber nur eine von den aufgelisteten wählen.
union one {
int i;
float f;
double d;
} var_1; Im Speicher braucht eine Union so viel Platz wie der
grösste Typ aus der Liste
Informatik I/II PVK 11
Enumeration
Enumerations erlauben es uns schöne Auflistungen mit Namen zu machen
enum Color {red, white, black}; Hinter den Namen stehen aber nur Integer (red == 0, white
== 1, etc.) Zuweisung findet nur über die definierten Namen statt:
Color c = red; (nicht etwa 0) Es ist auch explizite Nummerierung möglich:
enum bits {one = 1, two = 2, four = 4};
Informatik I/II PVK 12
Verkettete Liste
Wir haben eine Menge von Elementen, welche bestimmte Relationen oder eine Reihenfolge haben.
Alle Elemente haben irgendwelche Daten Die Relationen sind über Pointer gelöst
string name: Kevin string name: Ben
Person* geschwister[20] Person* geschwister[20]
Person* mutter Person* mutter
string name: Nina
Person* geschwister[20]
Person* mutter
Informatik I/II PVK 13
Verkettete Liste 2
struct Person {
string name;
Person* geschwister[20];
Person* mutter;
} Person* m = new Person; m->name = „Nina“; Person* k = new Person; k->name = „Kevin“; k->mutter = m;
Informatik I/II PVK 14
Prüfungsaufgabe 3
Liste oder Baum gegeben mit Elementen mit gewissen Relationen
Definieren eines structs Aufbauen des Baums (create) Implementieren von einer oder mehreren
Funktionenen (Suche, Löschen, Insert etc.)
Informatik I/II PVK 15
Klassen
Klassen besitzen viele Eigenschaften von structs Klassen und structs erlauben uns unsere eigenen
Datentypen zu definieren Mit Klassen versteckt man die Daten und kontrolliert deren
Zugriff und das Interface mit anderen Strukturen Man erzeugt so eine Abstrahierung der Daten Klassen haben Membervariablen und Methoden
(Memberfunktionen) Eine Klasse wird implementiert indem zuerst die
Klassendeklaration bestimmt wird (.h Datei) und dann die Methoden bestimmt werden (.cpp Datei)
Informatik I/II PVK 16
Klassendeklaration
class Car { // class Deklaration
private:
char model[30];
int wheels;
double speed;
Person* driver;
...
public:
void accelerate(double a);
void brake();
}; // Achtung Semikolon am Schluss
Informatik I/II PVK 17
public, private and proctected
public: Sichtbar und Zugriff von aussen erlaubt Person* getDriver();
private: Unsichtbar und Zugriff nicht erlaubt
protected: Unsichtbar und Zugriff nur von abgeleiteten Klassen
erlaubt
Informatik I/II PVK 18
Headerfiles
Die Klassendeklaration befindet sich immer in Headerfiles. Durch Einfügen von einem Headerfile (#include „MyClass.h“) wird das Interface der Klasse bekannt.
Um später Probleme mit mehrfacher Deklaration einer Klasse zu vermeiden (man darf die Klasse nur einmal deklarieren), sollten alle Headerfiles sog. Headerguards haben.
#ifndef _MyClass.h_
#define _MyClass.h_
class MyClass { … };
#endif
Informatik I/II PVK 19
Konstruktoren
Ein Konstruktor ist eine spezielle Funktion, welche bei der Initialisierung eines Objekts verwendet wird
Der Name eines Konstruktors entspricht dem der Klasse und hat keinen Rückgabewert
Car(Color c); Car::Car(Color c) { … }
Es dürfen mehrere Konstruktoren mit unterschiedlichen Parametern existieren
Car(int seats, int wheels);
Informatik I/II PVK 20
Konstruktor 2
Explizit: Car myCar = Car(4, 4); Implizit: Car myCar(red); Dynamisch: Car* myCar = new Car(5,4); Der Defaultkonstruktor nimmt keine Argumente an Auch möglich: Car myCar = red;
Dies kann mit explicit ausgeschalten werden und: umgekehrt nicht mit Konstruktoren machbar
Copy-Konstruktor:
Car myCar = yourCar; Car build(Tools t, Metal m);
Informatik I/II PVK 21
Destruktor
Der Destruktor eines Objekts wird aufgerufen wenn sein Gültigkeitsbereich ausläuft oder es mit delete gelöscht wurde.
~Car(); Car::~Car() { … }
Frage: Muss Person* driver gelöscht werden?
Informatik I/II PVK 22
Objekte
Ein Objekt ist eine Variable einer Klasse
Car myCar; Zugriff auf private Variablen (oder Methoden) ist von aussen
nicht möglich
myCar.wheels = 5; // geht nicht Zugriff auf public Variablen (oder Methoden) ist erlaubt
myCar.accelerate(5.2); // kein Problem
Informatik I/II PVK 23
Methoden
Methoden sind Memberfunktionen und müssen somit im Klassenscope definiert werden.
Car::accelerate(double a) { this->speed += a; } this ist ein Pointer auf das aktuelle Objekt. Man erhält so
Zugriff auf eigene Variablen (private auch)
Da Methode in Klassenscope definiert ist, darf es Methoden mit gleichem Namen (und Argument und Rückgabewert) in unterschiedlichen Klassen geben.
Informatik I/II PVK 24
static
Vielleicht wollen wir eine Variable die für alle Objekte gilt. Diese Variable ist nicht unbedingt konstant aber sie gilt für
alle Objekte gleichermassen. static double Car::accidentProb = 0.7;
Oder wir brauchen eine Funktion für die wir kein Objekt brauchen
static void Car::changeColor(Car& auto, Color c);
Car::changeColor(Car& auto, Color c) { … } Car::changeColor(myCar, black);
Informatik I/II PVK 25
const
Konstante Variable: const int maxSize = 5; Für Pointer:
const int* pt = &maxSize; *pt += 1; // invalid Die Variable lässt sich über den Pointer nicht ändern,
der Pointer selbst lässt sich aber ändern pt = &minSize;
Informatik I/II PVK 26
const 2
Für Pointer:
int age = 23; int* const pt = &age; *pt = 10; // valid pt = &gender; // invalid
Das ist genau wie bei Arrays!!
Informatik I/II PVK 27
const 3
int doStuff(const Person& daddy, Car& c)
{
daddy.repairCar(c);
} Wir wollen daddy nicht verändern mit diesem Aufruf
void Person::repairCar(Car& c) const; Die Funktion repairCar verändert nichts an der Person Mehr dazu auf:
http://www.orxonox.net/wiki/PerformanceTips#constandconst
Informatik I/II PVK 28
String Klasse
Die String Klasse erleichtert uns das Arbeiten mit Zeichenketten.
So implementiert diese Klasse die Addition von zwei Strings → Konkatenation oder die Zuweisung (das Kopieren) von Strings
Die String Klasse liefert uns auch Länge des Strings und vielerlei Methoden um Strings zu manipulieren (Bsp.: insert, copy, substr etc.)
Mehr findet ihr auf: http://www.cplusplus.com/reference/string/string/
Informatik I/II PVK 29
streams Ein- und Ausgabe sind in C++ über sog. Streams realisiert
Für cout braucht man <iostream>
Für Ein-/Ausgabe von/in Datei brauchen wir <fstream> (Filestream)
In Unix ist fast alles ein „file“ open() // Öffnen eines Files
close() // Schliessen eines Files
eof() // End of File
>> // Formatiertes Lesen von Files
<< // Formatiertes Schreiben von Files
read() // schnelles, unformatiertes Lesen von Binärdaten
write() // schnelles, unformatiertes Schreiben von Binärdaten
Informatik I/II PVK 30
streams 2
Einbindung des Headers #include <fstream> Definition eines File-Pointers: ofstream fout; Öffnen der Datei: fout.open("myDat"); Datei lesen/schreiben: fout << "Hello World!"; Schliessen der Datei: fout.close();
Mehr von fstream: http://www.cplusplus.com/reference/iostream/fstream/
Informatik I/II PVK 31
Überladung von Operatoren Wir wollen zwei Objekte einer Klasse „addieren“ können.
Wir müssen deshalb den Operator + überladen (d.h. für unsere Klasse neu definieren)
Snowball operator+(const Snowball& s) const; Snowball Snowball::operator+(const Snowball& s) const { }
Operatoren können auch auf zwei Objekte unterschiedlicher Klassen angewendet werden
Circle operator*(double a); circ2 = circ1 * 4.5;
Präzendenz und Syntax des Originaloperators müssen eingehalten werden, ansonsten kann man mit Operatorenüberladung aber so gut wie alles anstellen.
Informatik I/II PVK 32
friend
circ2 = 4.5 * circ1; Umgekehrte Reihenfolge müssen wir auch überladen.
Problem: double hat keinen Zugriff auf unsere Klasse
friend Circle operator*(double a, Circle c); Circle operator*(double a, Circle c) { }
friend erlaubt einer anderen Klasse Zugriff auf versteckte Variablen und Funktionen
friend class OtherClass; friend Funktionen sind nicht vererbbar
Informatik I/II PVK 33
Vererbung
Falls wir Klassen mit Gemeinsamkeiten haben, können wir diese Gemeinsamkeiten in einer Basisklasse vereinen von denen die Klassen dann erben.
Es gibt drei Arten von Vererbung: public, private und protected
Vererbung erzeugt eine is a Relation zwischen zwei Klassen
GeoObj
Rect Circle
Informatik I/II PVK 34
Ableiten
class Circle : public GeoObj { … }; Wenn man eine Instanz von Circle erstellt wird zuerst der
Basiskonstruktor von GeoObj aufgerufen Alle privaten Member bleiben privat, alle public Member
werden Teil des public Interface der Klasse class Circle : private GeoObj { … };
Alle Member von GeoObj werden private und können nicht weitervererbt werden
class Circle : protected GeoObj { … }; public und protected Member werden protected
Informatik I/II PVK 35
Konstruktoren bei Ableitung
Wir können den Konstruktor der Basisklasse mit dem Konstruktor der Abgeleiteten Klasse aufrufen:
Circle::Circle(const char* label, Color c, double radius) : GeoObj(label, c) { … }
So kann man auf die privaten Membervariablen der Basisklasse zugreifen
Informatik I/II PVK 36
virtual
Array mit Basisklasse GeoObj* objects[10]; Circle* c = new Circle(„Kreis1“, red, 3.5); objects[0] = c; std::cout << objects[0]->area();
Wird die area Methode von GeoObj oder von Circle aufgerufen?
Im Normalfall die von GeoObj, falls wir das aber nicht wollen, so müssen wir die area Methode mit virtual deklarieren.
virtual double area();
Informatik I/II PVK 37
virtual 2
Ist eine Methode mit virtual deklariert, so wird zur Laufzeit entschieden wohin gesprungen wird → ineffizient
Das wird auch dynamic binding genannt Wegen Ineffizienz sollten nur Methoden die von der
abgeleiteten Klasse neu definiert werden mit virtual deklariert werden
Eine Klasse ist virtuell wenn mindestens eine Methode der Klasse virtuell ist.
Konstruktoren sind nie virtuell, Destruktoren sollten virtuell sein
Informatik I/II PVK 38
Abstrakte Klassen
Von einer abstrakten Klasse lassen sich keine Objekte erzeugen
Macht Sinn, wenn Basisklasse nicht vollständig ist Eine Klasse ist abstrakt falls sie eine rein virtuelle
Methode deklariert virtual double area() = 0;
Informatik I/II PVK 39
Prüfungsaufgabe 4
Objektorientierung Oftmals sehr unterschiedliche
Klassenkonstrukte Meistens eine Teilaufgabe zu
Operatorenüberladung und Vererbung
Informatik I/II PVK 40
Fragen zu Pointer
Super Tutorial: http://www.cplusplus.com/doc/tutorial/pointers/
top related