Dienstag Informatik 1 Tag 2

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

der Universität Oldenburg
Objektorientierte Programmierung
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
Java: Dynamische Datentypen
Java: Grundlagen der Objektorientierung
Konstruktoren.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Programmieren mit JAVA
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
14StrukturKlasse1 Von der Struktur zur Klasse von C zu C++ Von Jens Hoffmann
Arrays,Strings&Pointer in C/C++
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Einführung in die Programmierung
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmiersprache C 4
Informatik 1 Letzte Übung.
Dynamische Datentypen
Donnerstag Informatik II, 2. Teil
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Willkommen! Informatik I/II PVK. 2 Über mich Name: Benjamin Knecht Vertiefungsrichtung: Computer & Netzwerke Hilfsassistent für Technische Informatik.
Freitag Informatik II, 3. Teil Repetition und Prüfungstipps
Mittwoch Informatik II, 1. Teil
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Java-Kurs Übung Besprechung der Hausaufgabe
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Tutorium Software-Engineering SS14 Florian Manghofer.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
Implementieren von Klassen
 Präsentation transkript:

Dienstag Informatik 1 Tag 2 Informatik I/II PVK Dienstag Informatik 1 Tag 2

Ablauf heute Rekursion Structs Verkettete Listen Klassen Ein-/Ausgabe (strings, streams) Vererbung Informatik I/II PVK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public, private and proctected 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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ü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

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

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

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

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

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

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

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

Prüfungsaufgabe 4 Objektorientierung Oftmals sehr unterschiedliche Klassenkonstrukte Meistens eine Teilaufgabe zu Operatorenüberladung und Vererbung Informatik I/II PVK

Fragen zu Pointer Super Tutorial: http://www.cplusplus.com/doc/tutorial/pointers/ Informatik I/II PVK