Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Ähnliche Dokumente
Programmierkurs. 'SoSe' Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Programmierkurs. 'SoSe' Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Programmieren in Java

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Grundelemente objektorientierter Sprachen (1)

Angewandte Mathematik in OOP WS 2011/12. Abschluss-Test

Grundelemente objektorientierter Sprachen (1)

Die Anwesenheitspflicht beim Seminar gilt für diejenigen Teilnehmer, die einen Schein erwerben wollen. Für die Nachmittagsübungen gilt keine

10.4 Konstante Objekte

Programmieren in Java

Grundelemente objektorientierter Sprachen (1)

Programmierung und Angewandte Mathematik

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Objektorientierte Programmierung (OOP) mit Matlab - Ein Crashkurs

7. Übung Informatik II - Objektorientierte Programmierung

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Objektorientierte Programmierung (OOP)

Objektorientierte Programmierung OOP

Vererbung und Polymorphie

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Objektorientierung (OO)

Programmierpraktikum 3D Computer Grafik

Prof. W. Henrich Seite 1

Programmierkurs Java

Programmierkurs C/C++

Programmierkurs C++ Polymorphismus

11.3 Virtuelle Methoden

C++ - Objektorientierte Programmierung Polymorphie

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Vererbung und Polymorphie

4. Objektorientierte Programmierung mit C++

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmierkurs C++ Abstrakte Klassen und Methoden

Programmierung Nachklausurtutorium

Objektorientierte Programmierung mit C++ SS 2007

Objektorientierte Programmierung III

Vorlesungsprüfung Programmiersprache 1

9. Vererbung und Polymorphie. Informatik Vererbung und Polymorphie 1

Info-2, Klausurvorbereitung, SS 2016

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Vererbung. Florian Adamsky, B. Sc. (PhD cand.) Softwareentwicklung im WS 2014/15.

Klassen. Kapitel Klassendeklaration

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Einführung in die Programmierung mit C++

Informatik I (D-MAVT)

Praxis der Programmierung

Prinzipien der objektorientierten Programmierung (OOP)

Wissenschaftliches Rechnen

12 Abstrakte Klassen, finale Klassen und Interfaces

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

3D Programmierpraktikum: Einführung in C++ - Teil 2

Praktische Informatik 1

Objektorientierte Programmierung

Repetitorium Informatik (Java)

Vorkurs C++ Programmierung

Projekt 3 Variablen und Operatoren

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Informatik 1 MaVt FS Übung 10

OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

PROCESSING EINE ZUSAMMENFASSUNG. Created by Michael Kirsch & Beat Rossmy

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Praxis der Programmierung

C++ - Objektorientierte Programmierung Vererbung

Der Ball kann angezeigt werden: anzeigen( ) {... } Der Ball kann z.b. seine Größe verändern: groesseaendern(int veraenderung) {... } usw.

Aufbau von Klassen. class punkt {...

Polymorphismus 179. Function.h. #include <string>

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Einführung in die Programmierung 1

4. Objektorientierte Programmierung mit C++

pue08 December 9, 2016

Einführung in die Programmierung

Verwendung von Klassen in C++

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Konzepte der Programmiersprachen

Polymorphismus 44. Function.hpp. #include <string>

Rückblick: Benutzerdefinierte Datentypen Definition der Klasse Vektor als Container für 2-dimensionale Vektoren

Grundlagen der Informatik 0

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

11 Objektorientierte Programmierung, Teil 2

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Praktische Informatik 1

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Kapitel 11: Vererbung Ziele von Klassen Einführung in die Informatik für struct Naturwissenschaftler und Ingenieure

Abschnitt 6: Klassen, Objekte und Methoden in Java

Computeranwendung und Programmierung (CuP)

Einführung in die Programmierung Wintersemester 2018/19

Wie schreibe ich ein Powerbook

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

Vokabeln. 4.1 Benutzer definierte Datentypen. Kapitel 4. Prof. Dr. Gerhard Berendt C++ oop? SS 2002 Arbeitsblatt 4

Algorithmen und Datenstrukturen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Programmieren in C++ Templates

pue13 January 28, 2017

Probeklausur: Programmierung WS04/05

Einführung in die Programmierung

Klausur "ADP" SS 2016

Transkript:

Programmierkurs SoSe 2013 Markus Geveler Inst. f. Applied Mathematics, TU Dortmund markus.geveler@math.tu-dortmund.de

Lesson 4 Was machen wir heute hier? Functions was ist das? in C++ RoboTut framework Vorbereitungen für Übungsblatt 2 Objektorientierte Programmierung Einführung in C++

Erster Kontakt mit functions Wir hatten bereits die main() - function kennegelernt int main() { } syntaktisch: int TYPE main identifier ( ParamSEQ ) COMPOUNDSTATEMENT

Erster Kontakt mit functions Was sind eigentlich functions? f(x,y) = 2x + 4y ist eine reellwertige Funktion über Einem 2-dimensionalen Parameterraum n in C++ sind functions eine Möglichkeit auszuführenden Code zu kapseln auch obiges Polynom kann man in einer C++ function implementieren wir oben (informell) den Wertebereich und den Für f haben wir oben einen Werte- und Parameterbereich festgelegt genau so geht man auch in einer höheren Programmiersprache vor

Erster Kontakt mit functions Functions in ihrer einfachsten Form deklarieren und definieren: int TYPE main identifier ( ParamSEQ ) COMPOUNDSTATEMENT TYPE gibt den Rückgabetyp (return-type) an ParamSEQ ist eine Liste von Variablendeklarationen, die den Parameterbereich der function angeben das CMPSTMT enthält dann den Code, der angibt wie die Parameter in die Rückgabe transformiert werden

Erster Kontakt mit functions Functions in ihrer einfachsten Form deklarieren und definieren: float f(float x, float y) { return 2 * x + 4 * y; } der return-type soll float sein die ParamSEQ besteht aus den beiden float Parametern x und y 'return' gibt an, was in die Rückgabe geschrieben werden soll

Erster Kontakt mit functions function-call: wie man functions benutzt float y = f(2.5f, 6.0f); float z( f(3.5f, 4.7f) ); y = f(z, 4.5f); mitdenken! im ersten Beispiel: ein call von f ist die rechte Seite einer Zuweisung: warum geht das? im zweiten Beispiel: ein call von f innerhalb einer Variableninitialisierung mittels built-in Konstruktor: warum geht das? im dritten Beispiel: auch Variablen hönnen an function-calls übergeben werden: wieso? warum kann ein solcher call nicht auf der linken Seite einer Zuweisung stehen? man sieht: die Grammatik-Regeln bleiben dieselben, lediglich die Ausdrücke werden komplizierter

Erster Kontakt mit functions functions: noch ein Beispiel: void say_hello() { cout << "Hello World!" << endl; } was ist hier anders?

Erster Kontakt mit functions functions sind operators! Wir erinnern uns: unsere operators in den Syntaxbäumen hatten auch Signaturen! Beispiel: int operator+(int, int) merken!

functions Implementieren und speichern Sie wieder je ein Programm zu den folgenden Aufgabenstellungen. Implementieren Sie jeweils eine function und testen Sie sie in main(). PÜ schreiben Sie eine function für den Absolutbetrag einer reellen Zahl x schreiben Sie eine function, die für eine reelle Zahl x und eine natürliche Zahl n die n-te Potenz von x als reelle Zahl zurückliefert

RoboTut Einführung und Installationsanweisungen http://www.mathematik.tu-dortmund.de/sites/pk-ss13/robotut Tutorial

RoboTut Folgen Sie den Installationsanweisungen auf der Homepage: PÜ Installieren Sie das RoboTut experimentieren Sie damit: compilieren Sie die Aufgaben und führen Sie eine aus

Neues Thema C++ ist objektorientiert was heisst das eigentlich?

Objektorientierte Programmierun Beispiel: Simulation einer Bäckerei alle Vorgänge (Bezahlen, Backen, Saubermachen,...) alle Entitäten (Bäcker, Kassierer, Kunde,...) wir betrachten hier keinen vollständigen Entwurf (man wäre überrascht, wie komplex eine Bäckerei ist!) OO: Eine Sichtweise auf komplexe Systeme, bei der ein System durch das Zusammenspiel kooperierender Objekte beschrieben wird Beispiele für Objekte: ein bestimmter Kunde, Bäcker Hartmut, ein bestimmtes Kürbiskernbrötchen der Begriff Objekt ist unscharf! Wir könnten auch festlegen, dass die Registrierkasse und der Backofen Objekte sein sollen (inwiefern unterscheidet sich diese Herangehensweise von unserem ersten Entwurf?) die Sinnhaftigkeit eines OO-Entwurfes ist keinesfalls unmittelbar klar! Es erfordert Erfahrung und Kenntnis der Zielsprache.

Objektorientierte Programmierun Beispiel: Simulation einer Bäckerei wir nehmen an, wir haben uns für den Ansatz entschieden, bei dem die Personen Objekte sind im einfachsten Fall: Beschränkung auf einen Bäcker (Hartmut, 32 Jahre alt), einen Kunden (Schorsch, 50 Jahre alt) OOD: Vom Objekt zur Klasse offensichtlich haben unsere beiden Objekte einiges gemeinsam beide haben einen Namen und ein Alter beide haben einen Beruf bzw. eine Rolle

Objektorientierte Programmierun Objekte, Klassen und Instanzen die Klasse Person Festlegung: jede Person hat einen Namen (Zeichenkette), ein Alter (natürliche Zahl), eine Rolle (Zeichenkette). Diese nennen wir Attribute (member variables) Attribute der Klasse Person unser Bäcker ist eine Instanz der Klasse Person, genau wie unser Kunde eine Instanz der Klasse Person ist die beiden Objekte entstehen also durch Instantiierung der Klasse Person

Objektorientierte Programmierun Objekte, Klassen und Instanzen die Klasse Person

Objektorientierte Programmierun Klassen wir haben alle Eigenschaften der Akteure (die Attribute) in unserem Programm in einer Klasse gekapselt unser Programm weiss, wenn ein Objekt eine Instanz von Person ist, so muss es z.b. ein Attribut Name haben wir haben festgelgt, von welchem Typ unsere member sein müssen die konkreten Objekte Unterscheiden sich nur noch beim Bezeichner (Bäcker1 und Kunde1) sowie bei den Attributwerten wir können Person als Schablone für beliebig viele Objekte (Instanzen) der Klasse (des Typs!) nehmen Klassen sind benutzerdefinierte Typen (und mehr)

Objektorientierte Programmierun Methoden (member functions) unsere Objekte sollen nun auch etwas machen können: ein Bäcker soll backen können und ein Kunde kaufen was ist das Problem mit unserem bisherigen ein-klassen-entwurf? können oder sollten wir Person beide Methoden geben? Alternativen?

Objektorientierte Programmierun Methoden (member functions) wir ersetzen unsere Klasse Person durch zwei Klassen: Bäcker und Kunde

Objektorientierte Programmierun Vorteile dieses Entwurfs Ziel erreicht: Methoden sind nur den jeweiligen Objekten zugänglich das Attribut Rolle ist nicht mehr nötig, weil wir über den Objekttyp wissen, welche Rolle (im Bild: 'Funktion') es hat Nachteile dieses Entwurfs die beiden Klassen stehen in keiner Beziehung zueinander, Obwohl Sie irgendwie beide Personen sind! beide Klassen haben dieselben Attribute! Redundanz beide Klassen haben dieselben Attribute!!Redundanz

Objektorientierte Programmierun Vererbung offensichtlich sind immernoch Bäcker und Kunden Personen wir führen unsere Klasse Person wieder ein wir legen fest, dass Bäcker nur eine spezielle Form von Personen sind! (ebenso für Kunden) wir legen fest, dass alle Bäcker dieselben Attribute und Methoden haben sollen, wie Personen, aber zusätzlich backen können sollen wir legen fest, dass alle Kunden.. analog dieses Prinzip wird Vererbung genannt beide Klassen haben dieselben Attribute!!Redundanz

Objektorientierte Programmierun Vererbung beide Klassen haben dieselben Attribute!!Redundanz

Objektorientierte Programmierun Vererbung Ergebnis in unserem Beispiel nur Bäcker können backen, nur Kunden können kaufen beide sind aber Personen, die Beziehung zwischen ihnen ist also hergestellt nur für Person wurden die Attribute festgelegt, die anderen Klassen erben sie trotzdem hat jedes Objekt vom Typ Bäcker einen Namen man sagt: die Klasse Bäcker erbt von der Klasse Person Bäcker ist eine Unterklasse von Person, Person ist eine Oberklasse von Bäcker die Klasse Bäcker erweitert die Klasse Person Bäcker1 ist vom Typ Bäcker also ist Bäcker1 auch vom Typ Person Bäcker, Kunde und Person bilden eine Vererbungshierarchie beide Klassen haben dieselben Attribute!! Redundanz

Objektorientierte Programmierun Vererbung Polymorphie nochmal: Bäcker1 ist vom Typ Bäcker also ist Bäcker1 auch vom Typ Person! es ist möglich, Person auch zu instantiieren! Ist das Objekt dann ein Bäcker oder ein Kunde? es ist auch möglich anonym auf eine Person zuzugreifen, die ein Bäcker ist! Nehmen wir an, wir haben ein solches Objekt vom Typ Bäcker 'Person4'. Wir könnten dann je nach Kontext es als Person behandeln, oder als das was es wirklich ist. Dieses Konzept wird Polymorphie genannt. Dazu später mehr! beide Klassen haben dieselben Attribute!! Redundanz

Objektorientierte Programmierun Mehrfachvererbung Klassen in C++ können mehrfach erben, d.h., sie können mehr als eine Oberklasse haben Beispiele für Mehrfachvererbung in unserer OO-Bäckerei: Zuckerbäcker sind Bäcker, die auch Konditoren sind. Die Klasse Konditor könnte etwa beschreiben, welche oder wie viele Torten der Bäcker backen kann. Konditoren machen auch alleine Sinn, weil es auch Konditoren gibt, die keine Bäcker sind. andere Ideen? beide Klassen haben dieselben Attribute!! Redundanz

Objektorientierte Programmierun Jetzt in C++! Als erstes: Klassen deklarieren und definieren! struct identifier { }; identifier DeclSTMTSEQ beide Klassen haben dieselben Attribute!! Redundanz struct IntIntPair { int left; int right; };

Objektorientierte Programmierun Klassendefinition in der Header-Datei: struct IntIntPair { int left; int right; }; Instantiierung in der main() -function (Code-Datei): IntIntPair my_pair;

Klassen deklarieren und definiere Deklarieren sie Klassen in header Dateien (z.b. person.hpp). Inkludieren Sie sie dann stets mittels ' #include person.hpp ' in ihrer Code-Datei (producer_consumer-test.cpp). PÜ Definieren Sie eine Klasse Person mit den Member-variablen für Alter (age) und Name (name) Instantiieren Sie mehrere Objekte dieser Klasse

Objektorientierte Programmierun Wie greift man jetzt auf die member zu? struct IntIntPair { int left; int right; }; IntIntPair my_pair; my_pair.left = 12; my_pair.right = 2323; der '.' operator heisst member-access operator

member access Erweitern Sie den Test ihrer Klasse Person. PÜ weisen Sie einer Instanz ihrer Klasse Person den member-variablen gültige Werte zu und testen Sie durch Ausgabe, ob diese danach auch dort gespeichert sind! beantworten Sie die Frage: Welchen Typs sind Ausdrücke der Form 'EXPR.id'?

CTORs Wir kennen schon den Standard-CTOR: int a; std::string s; es gibt aus sprachtheoretischer Sicht keinen Unterschied zwischen Instanziierung von built-in types und Klassen int i; Consumer c; IntIntPair p; Konstruktoren auch built-in CTORs kennen wir schon int i(22);

CTORs Wie kann man eigene CTORs für Klassen schreiben? IntIntPair pair( 22, 23 ); jetzt Konstruktoren für Klassen Konstruktoren (CTORs) sind spezielle member-functions von Klassen sie definieren das Verhalten von Objekten bei der Erstellung sie definieren, wie Objekte erstellt werden können eine Klasse besitzt stets den sogenannten Standardkonstruktor den haben wir auch schon benutzt

CTORs Standardkonstruktor ist eine member-function, die jede Klasse hat impliziter Aufruf bei der Instanziierung verliert Gültigkeit wenn ein eigener Konstruktor definiert wird Eigene CTORs deklarieren und definieren CTORs werden im wesentlichen deniert wie functions, jedoch ohne Rückgabetyp (klar, der Rückgabetyp ist die Klasse) CTORs tragen als Namen stets den der Klasse struct IntIntPair { int left; int right; }; IntIntPair(int l, int r) : left(l), right(r) { }

Eigener CTOR Erweitern Sie ihre Klasse Person und ändern Sie den Test entsprechend. PÜ definieren Sie einen CTOR, der beide member- Variablen mit Werten initialisiert erweitern Sie ihren CTOR so, dass bei Konstruktion der Satz Person xxx wurde erzeugt! ausgegeben wird, wobei xxx für den Namen der Person steht.

CTORs Mehrere CTORs Was passiert bei: IntIntPair pair( 22, 23 ); der Compiler 'erkennt', dass ein Objekt vom Typ IntIntPair angelegt werden soll der Compiler 'erkennt' die Signatur anhand der Literale in der Parameterliste der Compiler sucht den entsprechenden Konstruktor in der Definition von IntIntPair - dieses Verfahren wird 'pattern-matching' genannt merke: eine Klasse kann grundsätlich mehrere Konstruktoren Haben, deren Signaturen sich jedoch unterscheiden müssen merke: dies gilt für alle member-functions einer Klasse dieser Mechanismus wird Überladen (overloading) genannt

CTOR overload Erweitern Sie ihre Klasse Person und ändern Sie den Test entsprechend. PÜ Überladen Sie den CTOR so, dass man Personen auch nur mit ihrem Namen initialisieren kann und dabei ihr Alter auf 0 gesetzt wird