40
Informatik I/II PVK Dienstag Informatik 1 Tag 2

Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

Embed Size (px)

Citation preview

Page 1: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

Informatik I/II PVK

DienstagInformatik 1 Tag 2

Page 2: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

Informatik I/II PVK 2

Ablauf heute

Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings, streams) Vererbung

Page 3: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

}

Page 4: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 5: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 6: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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.

Page 7: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

}

Page 8: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 9: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 10: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 11: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 12: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 13: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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;

Page 14: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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.)

Page 15: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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)

Page 16: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 17: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 18: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 19: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 20: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 21: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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?

Page 22: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 23: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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.

Page 24: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 25: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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;

Page 26: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 27: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 28: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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/

Page 29: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 30: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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/

Page 31: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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.

Page 32: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 33: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 34: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 35: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 36: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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();

Page 37: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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

Page 38: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

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;

Page 39: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

Informatik I/II PVK 39

Prüfungsaufgabe 4

Objektorientierung Oftmals sehr unterschiedliche

Klassenkonstrukte Meistens eine Teilaufgabe zu

Operatorenüberladung und Vererbung

Page 40: Informatik I/II PVK Dienstag Informatik 1 Tag 2. Informatik I/II PVK2 Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings,

Informatik I/II PVK 40

Fragen zu Pointer

Super Tutorial: http://www.cplusplus.com/doc/tutorial/pointers/