Inhoud. Les 13 Les 16 Les 19 Les 2 Les 5 Les 8 Les 11 Les 14 Les 17 Les 20 Les 3. Les 1. Les 7. Les 4. Les 10. Les 12 Les 15. Les 6.

Maat: px
Weergave met pagina beginnen:

Download "Inhoud. Les 13 Les 16 Les 19 Les 2 Les 5 Les 8 Les 11 Les 14 Les 17 Les 20 Les 3. Les 1. Les 7. Les 4. Les 10. Les 12 Les 15. Les 6."

Transcriptie

1 Inhoud Les 1 Les 4 Les 7 Les 10 Les 13 Les 16 Les 19 Les 2 Les 5 Les 8 Les 11 Les 14 Les 17 Les 20 Les 3 Les 6 Les 9 Les 12 Les 15 Les 18 Les 21 0

2 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 1

3 Werkvormen OGOPRG OGOPRG-co1 + OGOPRG-pr1 = 112 SBU. 21 uur theorie. 14 uur practicum. 77 uur zelfstudie = 9,5 uur/week zelfstudie! Toetsing: Schriftelijke toets OGOPRG-co1 in week 8 en 10 van dit kwartaal. OGOPRG-pr1 practicumopgaven worden afgetekend op het practicum. Alle opgaven moeten voldoende zijn. 2

4 Inhoud Objectgeoriënteerd Programmeren in C++. responsibility driven design (ontwerpen uitgaande van verantwoordelijkheden). information hiding (het afschermen van informatie door middel van het scheiden van interface en implementatie). abstraction (het afschermen van complexiteit door middel van het scheiden van interface en implementatie). inheritance (het mogelijk maken van een nieuwe vorm van hergebruik,... is een... in plaats van... heeft een...). polymorphism (veelvormigheid mogelijk gemaakt door dynamic binding). Objectgeoriënteerd Ontwerpen met UML. klasse- en objectdiagrammen. use-case-diagram. sequence- en collaborationdiagrammen. toestands- en activiteitendiagrammen. 3

5 Plaats in curriculum Bouwt verder op GESPRG en MICPRG. Voorbereiding voor RTSYST (Real-Time Systemen) in ECK Voorbereiding voor minor Embedded Systems 4

6 Leermiddelen Blackboard OGOPRG (en ook Sheets, handouts. Studiewijzer. Practicumopdrachten. Dictaat: Objectgeoriënteerd Programmeren in C++. Boek: Warmer & Kleppe, Praktisch UML, 5 de editie ISBN Ontwikkelomgeving: Microsoft Visual Studio Express 2013 for Windows Desktop. Visual Paradigm for UML

7 Een stapje verder......met programmeren en ontwerpen. Van gestructureerd naar objectgeoriënteerd. C++ is een uitbreiding op C: alles wat in C kan, kan ook in C++. veel wat in C kan, kan in C++ beter (struct, array, c-string enz). GESPRG en MICPRG zijn het fundament voor OGOPRG. Zie dictaat blz. 1. 6

8 Dat is een lang verhaal... Gestructureerde programmeertalen: ±1945 assembler, ±1957 FORTRAN, ±1960 Algol60, ±1972 C (1989 std ANSI C) Software crisis: Software niet op tijd geleverd. Software duurder dan afgesproken. Software niet foutloos. Idee voor de oplossing: Herbruikbare software componenten maken. Deze componenten gebruiken bij maken van grote uitbreidbare en onderhoudbare software systemen. Objectgeoriënteerde programmeertalen: ±1967 Simula, ±1976 Smalltalk, ±1983 C++ (1998 std C++), ±1995 Java (Sun), ±2000 C# (Microsoft). 7

9 ... maar ook een kort verhaal 8

10 ... maar ook een kort verhaal 9

11 Inleiding C++ Bjarne Stroustrup: C++ is designed to: be a better C. support data abstraction. support object-oriented programming. support generic programming. Huiswerk: Dictaat Hs. 1 en practicumopdracht 1. 10

12 Practicumopdracht 1a #include <iostream> #include <string> using namespace std; int main() { cout << "Geef je adres: "; string mailadres; cin >> mailadres; string::size_type indexat = if (indexat!= string::npos) { cout << "Gebruiker: " << mailadres.substr(0, indexat) << endl; cout << "Machine: " << mailadres.substr(indexat + 1) << endl; else { cout << mailadres << " is geen geldig adres!" << endl; cout << "Druk op de return-toets." << endl; cin.get(); cin.get(); return 0; 11

13 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 2

14 Vraag Welke software hoeft nooit uitgebreid of veranderd te worden? Software die niemand gebruikt. 13

15 Nieuw! Objectgeoriënteerd Programmeren is een nieuwe manier van denken over hoe we code en informatie in een computerprogramma kunnen structureren. Programmeer paradigma s: imperative (C, Pascal). functional (LISP, Haskell). logic (Prolog). object oriented (C++, Java, C#). generic (ADA, C++, Java, C#). 14

16 Objectgeoriënteerd Denken De manier van probleem oplossen die gebruikt wordt bij de objectgeoriënteerde programmeertalen en ontwerpmethoden lijkt vaak op de manier van probleem oplossen die mensen in het dagelijks leven ook gebruiken. 15

17 Voorbeeld Ik wil mijn oma een bosje bloemen sturen. object message + arguments receiver's responsibility method (information hiding) 16

18 Sturen van een bosje bloemen 1: Bezorg bloemen 4: Betaal 2: Bezorg bloemen 6: Betaal 3: Bezorg bloemen 5: Stort 7: Betaal 17

19 UML sequentiediagram 18

20 Vraag Wat is het verschil tussen een message en een functie? Een message heeft een bepaalde receiver. De method die bij de message hoort is afhankelijk van de receiver. De receiver van een message kan ook tijdens run-time worden bepaald. Dynamic binding between the message (function name) and method (code). 19

21 Class en object Sonja (bloemiste): class instance (object) hierarchy inheritance (base and derived) 20

22 Verband tussen classes Aggregation = heeft een (of meer) Inheritance = is een (speciaal soort) UML klassendiagram. 21

23 Method binding Zoek in class van het receiver object. Als daar geen method is zoek dan in de base class van de class van het receiver object. Als daar geen method is zoek dan in de base class van de base class van de class van het receiver object. Enzovoort. Een method uit de base class kan overriden worden door een method in een derived class. 22

24 Doel van object oriëntatie Construeren van herbruikbare software componenten. Gebruiken van deze componenten bij het construeren van grote aanpasbare en uitbreidbare systemen. Huiswerk: Bestudeer hoofdstuk 2 t/m 2.1 van het dictaat. 24

25 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 3

26 Herbruikbare component: Breuk Waarom wil je programma s maken die rekenen met breuken in plaats van met floating point getallen (double)? Waarom wil je een component Breuk maken? Hoe doe je dat in C? Wat zijn de nadelen van de C oplossing? Hoe kan het beter in C++? Wat zijn de voordelen van de C++ oplossing? Kan het nog mooier? Dictaat H2.2 t/m 2.28 (4 lessen). 26

27 Breuk in C Gebruik struct voor dataopslag. Gebruik functies voor bewerkingen. typedef struct { /* een breuk bestaat uit: */ int boven; /* een teller en */ int onder; /* een noemer */ Breuk; Struct type declaratie Breuk normaliseer(breuk b); Breuk som(breuk b1, Breuk b2); Prototypes of Functie declaraties Breuk som(breuk b1, Breuk b2) { Functie definitie Breuk s; s.boven = b1.boven * b2.onder + b1.onder * b2.boven; s.onder = b1.onder * b2.onder; s = normaliseer(s); return s; 27

28 Gebruik Breuk b1, b2, b3; b1.boven = 5; b1.onder = 12; b2.boven = 4; b2.onder = 9; b3 = som(b1, b2) Nadelen Breuk in C b1.onder = 0 is een ramp die wacht om te gebeuren. Programmeur die het beter denkt te weten kan zelf breuken gaan optellen: b3.teller = b1.teller + b2.teller; b3.noemer = b1.noemer + b2.noemer; Kan overal in het programma staan! OOPS! Verschillende programmeurs kunnen in verschillende delen van het programma de Breuk component uitbreiden: B.v. functies: maal, times, en multiply. 28

29 Eigenschappen van C Breuk Onderhoudbaarheid. Fout in component is niet gemakkelijk te vinden. Iedereen kan data van component verzieken. Iedereen kan algoritme implementeren zonder implementatie van de component te gebruiken. Als er iets niet goed gaat met component (b.v. vermenigvuldigen van breuken) moeten we het hele programma doorzoeken. Aanpasbaarheid en uitbreidbaarheid. Iedereen kan component aanpassen en uitbreiden. Herbruikbaarheid. Slecht! Te Goed! Slecht! Onduidelijk welke functies bij component horen en welke functies bij deze applicatie horen (en toevallig deze component gebruiken). 29

30 Breuk in C++ Gebruik class voor dataopslag en bewerkingen. class Breuk { public: void leesin(); void drukaf() const; void plus(breuk b); private: int boven; int onder; void normaliseer(); ; Class declaratie Public memberfuncties = interface Private data members Private memberfunctie Memberfunctie definitie void Breuk::plus(Breuk b) { boven = boven * b.onder + onder * b.boven; onder *= b.onder; normaliseer(); 30

31 Gebruik Breuk a, b; a.leesin(); b.leesin(); a.plus(b); a.drukaf(); Voordelen Breuk in C++ b1.onder = 0 geeft compilerfout. Programmeur die het beter denkt te weten kan zelf geen breuken gaan optellen (zonder Breuk::plus te wijzigen). Component Breuk kan slechts op 1 plaats in het programma uitgebreid worden. 31

32 Eigenschappen van C++ Breuk Onderhoudbaarheid. Fout in component is gemakkelijk te vinden. Als er iets niet goed gaat met component hoef je alleen de implementatie van de component te doorzoeken. Fout moet in memberfuncties van de component zitten. Je kunt niet (eenvoudig) om de interface van de class heenwerken. (Je kan zelf geen plus maken als je niet bij boven en onder kunt komen.) Aanpasbaarheid en uitbreidbaarheid. Component kan maar op 1 plaats uitgebreid worden. Private delen kunnen aangepast worden zonder dat de interface verandert. Dus zonder dat de code die de component gebruikt dit merkt! Zie practicum opgave 2c. Herbruikbaarheid. Duidelijk welke functies bij component horen. Goed! Goed! Redelijk. Huiswerk: Bestudeer paragraaf 2.2 van het dictaat. 32

33 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 4

34 Kenmerken van objecten In de vorige lessen hebben we de volgende objecten leren kennen: Sonja en Klazien (Groningse bloemiste) (van de class Bloemiste) en a en b (van de class Breuk). Kenmerken: Geheugen (state). Elk object heeft zijn eigen geheugen. Gedrag (behavior). Alle objecten van dezelfde class hebben hetzelfde gedrag. Identiteit (identity). Elk object heeft een eigen identiteit (b.v. een naam). 34

35 Class Breuk (versie 1) class Breuk { public: Breuk(); Breuk(int t); Breuk(int t, int n); int teller() const; int noemer() const; void plus(breuk b); void abs(); private: int boven; int onder; void normaliseer(); ; Data members Memberfuncties: Constructors Vraag-functies. Doe-functies. int main() { Breuk a, b(-2), c(21, -9); //... 35

36 Class Breuk (versie 1) int main() { Breuk a, b(-2), c(21, -9); cout << a.teller() << "/" << a.noemer() << endl; cout << b.teller() << "/" << b.noemer() << endl; cout << c.teller() << "/" << c.noemer() << endl; c.abs(); cout << c.teller() << "/" << c.noemer() << endl; cin.get(); return 0; 36

37 Implementatie constructors Breuk::Breuk(): boven(0), onder(1) { Breuk::Breuk(int t): boven(t), onder(1) { Initialization list Breuk::Breuk(int t, int n): boven(t), onder(n) { normaliseer(); int main() { Breuk h("half"); return 0; Werkt dit? Wat moet je doen om dit wel te laten werken? 37

38 Constructor Compiler roept de constructor automatisch aan. Reserveer geheugen op de stack voor c en roep constructor c.breuk(21, -9) aan { Breuk c(21, -9); //... //... //... Roep destructor c.~breuk() aan en geef geheugen van c weer vrij 38

39 Constructor en type conversie Compiler roept de constructor automatisch aan als dat nodig is voor type conversie. De C++ compiler denkt met je mee! Als je dat niet wilt moet je explicit voor de constructor zetten. Reserveer geheugen op de stack en roep constructor Breuk(5) aan { Breuk c(21, -9); //... c.plus(5); //... c.plus(breuk(5)); Roep destructor aan en geef geheugen van Breuk(5) weer vrij 39

40 Class Breuk class Breuk { public: void leesin(); void drukaf() const; int teller() const; int noemer() const; void plus(breuk b); void abs(); private: int boven; int onder; void normaliseer(); ; int main() { Breuk a, b; a.drukaf(); a.leesin(); b = a; b.drukaf(); Breuk c(a); c.drukaf(); return 0; Werkt dit? 40

41 Gratis bij elke class! constructor zonder argument (default constructor). Deze constructor roept de default constructor aan van alle data members. assignment operator (operator=). Deze assignment operator roept de assignment operator aan van alle data members. copy constructor. Deze constructor roept de copy constructor aan van alle data members. destructor. Deze destructor roept de destructor aan van alle data members. Je kunt al deze functies ook zelf definiëren! 41

42 const Breuk / const memberfuncties Je kunt een constante Breuk definiëren. const Breuk kwart(1, 4); cout << kwart.teller() << '/' << kwart.noemer() << endl; // mag dit? kwart.plus(5); // mag dit? Hoe weet de compiler dat? 42

43 Class Breuk (versie 1) class Breuk { public: Breuk(); Breuk(int t); Breuk(int t, int n); int teller() const; int noemer() const; void plus(breuk b); void abs(); private: int boven; int onder; void normaliseer(); ; Vraag-functies: Return type Geen argumenten const Doe-functies: Geen return type (void) Meestal argumenten Breuk b(3, 4); const Breuk kwart(1, 4); cout << b.teller() << endl; b.plus(kwart); cout << kwart.teller() << endl; kwart.plus(b); 43

44 Huiswerk! Bestudeer dictaat 2.3 t/m class Rechthoek { public: //... (geen constructors) private: Breuk lengte; Breuk breedte; ; int main() { Rechthoek r1; //... Rechthoek r2(r1); //... Compileert dit programma bij gebruik van versie 1 van Breuk? Wat is de lengte en breedte van r1 en r2? 44

45 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 5

46 Class Breuk Breuk a, b; a.leesin(); b.leesin(); a.plus(b); a.drukaf(); Stel hergebruik Breuk component is succes! Helpfiles FAQ Kan het beter? Breuk a, b; cin >> a >> b; a += b; cout << a; Gebruik Breuk is vergelijkbaar met int! Veel werk! Moeite waard? 46

47 Operator overloading a.operator+=(b); a += b; De C++ compiler denkt met je mee! 47

48 Breuk in C++ class Breuk { public: void leesin(); void drukaf() const; void operator+=(breuk b); private: int boven; int onder; void normaliseer(); ; Operator overloading is simpel!? void Breuk::operator+=(Breuk b) { boven = boven * b.onder + onder * b.boven; onder *= b.onder; normaliseer(); 48

49 Breuk is een succes? Mag a += b += c; met int? Dit is een constructie die je allicht niet wilt gebruiken, maar die wel mogelijk is! Wat betekent dat voor onze Breuk klasse? binary += : no operator found which takes a right-hand operand of type void Oplossing? b += c; a += b; Kan dat niet beter? 49

50 Fix Breuk::operator+= class Breuk { public: void leesin(); void drukaf() const; Breuk operator+=(breuk b); private: int boven; int onder; void normaliseer(); ; Pas op! Deze code is niet correct. Zie volgende sheet. Breuk Breuk::operator+=(Breuk b) { boven = boven * b.onder + onder * b.boven; onder *= b.onder; normaliseer(); return?????; *this; 50

51 Breuk is geen succes! a += b += c; werkt nu. Maarrr Werkt dit ook: (a += b) += c;? Oplossing? reference 51

52 Reference In C++ zijn er 3 soorten variabelen: Gewone variabelen. Pointers. References. Een reference is een andere naam voor een variabele die al bestaat. int i; int& j = i; //initialisatie is verplicht! Is dit goed voor de i = 3; cout << j << endl; onderhoudbaarheid? // een reference is een "pseudoniem" 52

53 Gebruik reference Je kunt een reference gebruiken als: Globale variabele. Lokale variabele. Parameter. Return type. 53

54 Call by value void swap(int p, int q) { int t = p; p = q; q = t; //... int i = 3; int j = 4; swap(i, j); //... Deze code werkt niet goed! Weet je nog waarom? Oplossing? 54

55 Call by reference in C void swap(int* p, int* q) { int t = *p; *p = *q; *q = t; p wijst naar i q wijst naar j //... int i = 3; int j = 4; swap(&i, &j); //... 55

56 Call by reference in C++ void swap(int& p, int& q) { int t = p; p = q; q = t; //... int i = 3; int j = 4; swap(i, j); //... p is andere naam voor i q is andere naam voor j Onder de motorkap wordt een reference geïmplementeerd met een pointer. 56

57 Reference return Je kunt een reference ook teruggeven vanuit een functie. int& max(int& a, int& b) { if (a > b) return a; else return b; int main() { int x = 2, y = 7, z; max(x, y) = 0; z = max(x, y); //... Een functie die een reference teruggeeft kan ook links van een = teken gebruikt worden (is een lvalue). 57

58 Fix Breuk::operator+= class Breuk { public: void leesin(); void drukaf() const; Breuk& operator+=(breuk b); private: int boven; int onder; void normaliseer(); ; Met behulp van een reference kunnen we ook onnodige kopietjes voorkomen. Breuk& Breuk::operator+=(Breuk b) { boven = boven * b.onder + onder * b.boven; onder *= b.onder; normaliseer(); return *this; 58

59 Fix Breuk::operator+= class Breuk { public: void leesin(); void drukaf() const; Breuk& operator+=(const Breuk& b); private: int boven; int onder; void normaliseer(); ; Waarom const? Breuk& Breuk::operator+=(const Breuk& b) { boven = boven * b.onder + onder * b.boven; onder *= b.onder; normaliseer(); return *this; 59

60 Huiswerk! Bestudeer dictaat 2.11 t/m Een reference lijkt op een pointer. Wat zijn de verschillen? Noem 3 situaties waar een copy constructor nodig is. Waarom zijn de parameters van max (zie boven) geen int of const int&? 60

61 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 6

62 Operator+ overloading { Breuk a, b, c; Gratis! Zelf maken c.operator=(a.operator+(b)); c = a + b; Wat moet operator+ eigenlijk doen? Wat moet het parametertype zijn? Breuk const Breuk& Wat moet het returntype zijn? Breuk Breuk& const Breuk Goed Beter! Voorkomt onnodig kopietje. Goed Fout! Je hebt geen variabele die al bestaat. Beter! Geeft een fout bij: a + b = c; 62

63 Breuk::operator+ class Breuk { public: //... Breuk& operator+=(const Breuk& rechts); const Breuk operator+(const Breuk& rechts) const; private: int boven; int onder; void normaliseer(); ; Waarom const? const Breuk Breuk::operator+(const Breuk& rechts) const { Breuk hulpje(*this); hulpje += rechts; return hulpje; 63

64 Breuk::operator+ De volgende implementaties zijn niet juist! const Breuk Breuk::operator+(const Breuk& rechts) { Breuk hulpje(*this); // Hint: hulpje += rechts; const Breuk kwart(1, 4); return hulpje; Breuk b(2, 3), c; c = kwart + b; const Breuk& Breuk::operator+(const Breuk& rechts) const { Breuk hulpje(*this); hulpje += rechts; return hulpje; const Breuk& Breuk::operator+(const Breuk& rechts) const { *this += rechts; return *this; const vergeten! Return andere naam voor een dode variabele! Receiver mag niet veranderen! 64

65 Breuk::operator+ probleem! { Breuk a, b; b.operator=(a.operator+(5)); Breuk(5) b = a + 5; b.operator=(5.operator+(a)); b = 5 + a; Microsoft error: binary '+' : no global operator found which takes type 'Breuk'. GNU gcc error: No match for 'operator+' in '5 + a'. Oplossing? 65

66 Globale operator+ overloading Je kunt de globale operator+ overloaden. class Breuk { public: //... Breuk& operator+=(const Breuk& rechts); const Breuk operator+(const Breuk& rechts) const; private: //... ; const Breuk operator+(int links, const Breuk& rechts); const Breuk operator+(int links, const Breuk& rechts) { Breuk hulpje(links); hulpje += rechts; return hulpje; 66

67 Fix: Breuk::operator+ { Breuk a, b; b.operator=(a.operator+(5)); Breuk(5) b = a + 5; b.operator=(operator+(5, a)); b = 5 + a; Kan dit niet eenvoudiger? 67

68 Globale operator+ overloading Alternatief: class Breuk { public: //... Breuk& operator+=(const Breuk& rechts); private: //... ; const Breuk operator+(const Breuk& links, const Breuk& rechts); const Breuk operator+(const Breuk& links, const Breuk& rechts) { Breuk hulpje(links); hulpje += rechts; return hulpje; 68

69 Fix: Breuk::operator+ { Breuk a, b; b = a + 5; Breuk(5) b.operator=(operator+(a, 5)); Breuk(5) b.operator=(operator+(5, a)); b = 5 + a; 69

70 Operator== overloading { Breuk a, b; if (operator==(a, b)) if (a == b) /*... */; Wat moet operator== eigenlijk doen? Waarom is de globale operator== gebruikt en niet Breuk::operator==? Wat moeten de parametertypes zijn? Breuk const Breuk& Wat moet het returntype zijn? bool Goed Goed Beter! Voorkomt onnodig kopietje. 70

71 Operator== overloading Je kunt de globale operator== overloaden. class Breuk { public: //... int teller() const; int noemer() const; private: //... ; bool operator==(const Breuk& l, const Breuk& r); bool operator==(const Breuk& l, const Breuk& r) { return l.teller() == r.teller() && l.noemer() == r.noemer(); 71

72 Breuk::operator== Waarom is de volgende implementatie niet juist! class Breuk { public: //... private: int boven; int onder; //... ; Error: boven en onder zijn private! bool operator==(const Breuk& l, const Breuk& r); bool operator==(const Breuk& l, const Breuk& r) { return l.boven == r.boven && l.onder == r.onder; Wat te doen als er geen teller() en noemer() memberfuncties zijn? 72

73 Breuk::operator== Friend! class Breuk { public: //... private: int boven; int onder; //... friend bool operator==(const Breuk& l, const Breuk& r); ; bool operator==(const Breuk& l, const Breuk& r) { return l.boven == r.boven && l.onder == r.onder; 73

74 Friend Vriendschap in C++ gaat wel erg ver... A friend is someone who may touch your private parts. Geldt bij het gebruik van friend nog steeds het principe van information hiding? 74

75 Huiswerk! Bestudeer dictaat 2.21 t/m Let op! 2.24 en 2.25 zijn niet behandeld (mag je overslaan). Maak een operator*= voor Breuk. Maak een operator* voor Breuk. Maak een operator!= voor Breuk. Maak een operator< voor Breuk. Maak een operator<= voor Breuk. Maak een operator> voor Breuk. Maak een operator>= voor Breuk. Denk aan OO afschuiven! 75

76 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 7

77 Operator<< overloading We willen breuken op dezelfde manier afdrukken als integers. { Breuk b(12, -9); ostream aanpassen? Bestaat al! Zelf maken Bestaat al! cout.operator<<("b = ").operator<<(b). operator<<(endl); cout << "b = " << b << endl; //... Object van de class ostream 77

78 Operator<< overloading We willen breuken op dezelfde manier afdrukken als integers. { Breuk b(12, -9); Globale operator<< overloaden Zelf maken Bestaat al! Bestaat al! operator<<(cout.operator<<("b = "), b).operator<<(endl); cout << "b = " << b << endl; //... Object van de class ostream 78

79 Operator<< overloading { Breuk a; operator<<(cout, a). operator<<(endl); cout << a << endl; Wat moet het eerste parametertype zijn? ostream ostream& De uitvoer moet niet naar een kopietje van het beeldschermgeheugen. Goed Wat moet het tweede parametertype zijn? Breuk const Breuk& Wat moet het returntype zijn? ostream ostream& Goed Beter! Voorkomt onnodig kopietje. De endl moet niet naar een kopietje van het beeldschermgeheugen. Goed 79

80 Operator<< class Breuk { public: //... private: int boven; int onder; //... friend ostream& operator<<(ostream& left, const Breuk& right); ; ostream& operator<<(ostream& left, const Breuk& right) { left << right.boven << '/' << right.onder; return left; 80

81 Gemak van overerving Er zijn verschillende classes afgeleid van ostream. ostringstream Om te schrijven naar een string variabele. ofstream Om te schrijven naar een file. De overloaded operator<< kan ook met objecten van deze afgeleide classes worden gebruikt. ostream ostringstream ofstream 81

82 Gemak van overerving class Breuk { //... friend ostream& operator<<(ostream& left, const Breuk& right); ; //... int main() { Breuk b(12,-9); ofstream out("uitvoer.txt"); if (out) out << "b = " << b << endl; else Gaat goed! Want ofstream is een ostream. cerr << "File uitvoer.txt kan niet geopend worden!" << endl; cin.get(); return 0; 82

83 Operator>> overloading We willen breuken op dezelfde manier inlezen als integers. { int i, j; Breuk b; istream aanpassen? Bestaat al! Zelf maken Bestaat al! cin.operator>>(i).operator>>(b). operator>>(j); cin >> i >> b >> j; //... Object van de class istream 83

84 Operator>> overloading We willen breuken op dezelfde manier inlezen als integers. { int i, j; Breuk b; Globale operator>> overloaden Zelf maken Bestaat al! Bestaat al! operator>>(cin.operator>>(i), b). operator>>(j); cin >> i >> b >> j; //... Object van de class istream 84

85 Operator>> overloading { Breuk a; int i; operator>>(cin, a). operator>>(i); cin >> a >> i; Wat moet het eerste parametertype zijn? istream istream& De invoer moet niet worden gelezen uit een kopietje van het toetsenbordbuffer. Goed Wat moet het tweede parametertype zijn? Breuk De invoer moet niet naar een kopietje van a. Breuk& Goed Wat moet het returntype zijn? istream istream& i moet niet worden gelezen uit een kopietje van het toetsenbordbuffer. Goed 85

86 Operator>> istream& operator>>(istream& left, Breuk& right) { int teller; if (left >> teller) if (left.peek() == '/') { left.get(); int noemer; if (left >> noemer) right = Breuk(teller, noemer); else right = Breuk(teller); else right = Breuk(teller); else right = Breuk(); return left; Deze operator>> hoeft geen friend te zijn van de class Breuk 86

87 Huiswerk! Bestudeer dictaat

88 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 8

89 Seperate compilation #ifndef _Memcell_ #define _Memcell_ class MemoryCell { public: int Read() const; void Write(int x); private: int StoredValue; ; #endif Memcell.h Memcell.cpp #include "Memcell.h" int MemoryCell::Read() const { return StoredValue; void MemoryCell::Write(int x) { StoredValue = x; Memappl.cpp #include <iostream> using namespace std; #include "Memcell.h" int main() { MemoryCell M; M.Write(5); cout << "Cell contents are " << M.Read() << endl; 89

90 Seperate compilation Memcell.h class MemoryCell { //... ; Memcell.cpp #include "Memcell.h" //... int MemoryCell::Read() { Memappl.cpp #include "Memcell.h" //... MemoryCell M; Memcell.obj Memappl.obj pre-compiler compiler linker Memcell.exe 90

91 Project Microsoft Visual C

92 Hergebruik void swap(int& p, int& q) { int t = p; p = q; q = t; //... int i = 3; int j = 4; swap(i, j); //... Copy Paste is slecht voor de onderhoudbaarheid! Wat te doen als we twee variabelen van het type double willen verwisselen? Wat te doen als we twee objecten van de class Breuk willen verwisselen? 92

93 Generieke functie Gebruik een template functie. template <typename T> void swap(t& p, T& q) { T t = p; p = q; q = t; //... int i = 3; int j = 4; swap(i, j); //... Breuk b(1, 2); Breuk c(3, 4); swap(b, c); Een template is een mal waarmee verschillende functies gemaakt kunnen worden void swap(int& p, int& q) { int t = p; p = q; q = t; void swap(breuk& p, Breuk& q) { Breuk t = p; p = q; q = t; 93

94 Class Dozijn In de class Dozijn kun je 12 integers opslaan. class Dozijn { public: void zetin(int index, int waarde); int leesuit(int index) const; private: int data[12]; ; //... Dozijn d; d.zetin(3, 13); //... cout << "De plaats nummer 3 in d bevat de waarde: " << d.leesuit(3) << endl; 94

95 Class Dozijn void Dozijn::zetIn(int index, int waarde) { if (index >= 0 && index < 12) data[index] = waarde; int Dozijn::leesUit(int index) const { if (index >= 0 && index < 12) return data[index]; return 0; /* ik weet niets beters */ ostream& operator<<(ostream& o, const Dozijn& d) { o << d.leesuit(0); for (int i = 1; i < 12; ++i) o << ", " << d.leesuit(i); return o; 95

96 Class Dozijn int main() { Dozijn d1; for (int j = 0; j < 12; ++j) d1.zetin(j, j * j); // vul d1 met kwadraten cout << "d1 = " << d1 << endl; cin.get(); return 0; Copy Paste is slecht voor de onderhoudbaarheid! d1 = 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121 Wat te doen als we 12 variabelen van het type double willen opslaan? Wat te doen als we 12 objecten van de class Breuk willen opslaan? 96

97 Generieke class Gebruik een template class. template<typename T> class Dozijn { public: void zetin(int index, const T& waarde); const T& leesuit(int index) const; private: T data[12]; ; //... Dozijn<int> di; Een template is een mal waarmee verschillende classes gemaakt kunnen worden class Dozijn { public: void zetin(int index, const int& waarde); const int& leesuit(int index) const; private: int data[12]; ; 97

98 Generieke class Dozijn template<typename T> void Dozijn<T>::zetIn(int index, const T& waarde) { if (index >= 0 && index < 12) data[index] = waarde; template<typename T> const T& Dozijn<T>::leesUit(int index) const { if (index < 0) index = 0; if (index > 11) index = 11; return data[index]; template<typename T> ostream& operator<<(ostream& o, const Dozijn<T>& d) { o << d.leesuit(0); for (int i = 1; i < 12; ++i) o << ", " << d.leesuit(i); return o; 98

99 Generieke class Dozijn int main() { Dozijn<int> d1; for (int j = 0; j < 12; ++j) d1.zetin(j, j * j); // vul d1 met kwadraten cout << "d1 = " << d1 << endl; Dozijn<string> d2; d2.zetin(0, "Drenthe"); d2.zetin(1, "Flevoland"); //... d2.zetin(10, "Zeeland"); d2.zetin(11, "Zuid-Holland"); cout << "d2 = " << d2 << endl; cin.get(); return 0; d1 = 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121 d2 = Drenthe, Flevoland, Friesland, Gelderland, Groningen, Limburg, Noord-Brabant, Noord-Holland, Overijssel, Utrecht, Zeeland, Zuid-Holland 99 Wat doen we als we meer/minder dan 12 elementen willen opslaan?

100 Generieke class Gebruik een tweede template parameter. template<typename T, int N> class Rij { public: void zetin(int index, const T& waarde); const T& leesuit(int index) const; int aantalplaatsen() const; private: T data[n]; ; //... Rij<char, 26> alfabet; Een template is een mal waarmee verschillende classes gemaakt kunnen worden class Rij { public: void zetin(int index, const char& waarde); const char& leesuit(int index) const; int aantalplaatsen() const; private: char data[26]; ; 100

101 Generieke class Rij template<typename T, int N> void Rij<T, N>::zetIn(int index, const T& waarde) { if (index >= 0 && index < N) data[index] = waarde; template<typename T, int N> const T& Rij<T, N>::leesUit(int index) const { if (index < 0) index = 0; if (index > N - 1) index = N - 1; return data[index]; template<typename T, int N> int Rij<T, N>::aantalPlaatsen() const { return N; template<typename T, int N> ostream& operator<<(ostream& o, const Rij<T, N>& r) { o << r.leesuit(0); for (int i = 1; i < N; ++i) o << ", " << r.leesuit(i); return o; 101

102 Generieke class Rij int main() { Rij<int, 10> kwad; for (int i = 0; i < kwad.aantalplaatsen(); ++i) kwad.zetin(i, i * i); cout << "kwad = " << kwad << endl; Rij<char, 26> alfabet; for (int i = 0; i < alfabet.aantalplaatsen(); ++i) alfabet.zetin(i, 'A' + i); cout << "alfabet = " << alfabet << endl; cout << "de derde letter van alfabet is " << alfabet.leesuit(2) << endl; cout << "de honderste letter van alfabet is " << alfabet.leesuit(99) << endl; kwad = 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 cin.get(); alfabet = A, B, C, D, E, F, G, H, I, J, K, L, M, return 0; N, O, P, Q, R, S, T, U, V, W, X, Y, Z de derde letter van alfabet is C 102 de honderste letter van alfabet is Z

103 Template class std::array C++11 std::array<t, N> in C++ vervangt de C array. Het aantal elementen N ligt vast na het compileren. Elementen kunnen worden opgevraagd met operator[]. Je kunt een std::array gewoon vergelijken, toekennen en kopiëren. Je kunt een std::array element voor element doorlopen met een range-based for. std::array heeft memberfuncties: size() geeft het aantal elementen (type: std::array<t, N>::size_type). at(n) geeft reference naar element n. Geeft een fout (exception) als element n niet bestaat. 103

104 Template class std::array C++11 #include <iostream> #include <array> using namespace std; int main() { // definieer array van 15 integers array<int, 15> a; // vul met kwadraten for (array<int, 15>::size_type i = 0; i < a.size(); ++i) { a[i] = i * i; // druk af for (array<int, 15>::size_type i = 0; i < a.size(); ++i) { cout << a[i] << " "; cout << endl; //

105 Template class std::array C++11 #include <iostream> #include <array> using namespace std; int main() { // definieer array van 15 integers array<int, 15> a; // vul met kwadraten int i = 0; for (int& e: a) { e = i * i; ++i; // druk af for (int e: a) { cout << e << " "; cout << endl; //

106 Template class std::vector std::vector<t> in C++ is een dynamische array. De std::vector kan groeien en krimpen. Elementen kunnen worden opgevraagd met operator[]. Je kunt een std::vector gewoon vergelijken, toekennen en kopiëren. Je kunt een std::vector element voor element doorlopen met een range-based for. std::vector heeft memberfuncties: size() geeft het aantal elementen (type: std::vector<t>::size_type). at(n) geeft reference naar element n. Geeft een fout (exception) als element n niet bestaat. push_back(e) voeg element e aan de vector toe. 107

107 Template class std::vector #include <iostream> #include <vector> using namespace std; int main() { // definieer vector van integers vector<int> v; // vul met kwadraten for (int i = 0; i < 15; ++i) { v.push_back(i * i); // druk af for (vector<int>::size_type i = 0; i < v.size(); ++i) { cout << v[i] << " "; cout << endl; //

108 Template class std::vector C++11 #include <iostream> #include <vector> using namespace std; int main() { // definieer vector van integers vector<int> v; // vul met kwadraten for (int i = 0; i < 15; ++i) { v.push_back(i * i); // druk af for (int e: v) { cout << e << " "; cout << endl; //

109 Huiswerk! Bestudeer dictaat Bestudeer dictaat (heel) hoofdstuk

110 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 9

111 Hergebruik van classes Aggregatie (Aggregation)... heeft een (of meer)... Overerving (Inheritance)... is een (speciaal soort)

112 Aggregatie Aggregatie (Aggregation)... heeft een (of meer)... class Rechthoek { public: //... private: Breuk lengte; Breuk breedte; ; Een Rechthoek heeft een lengte en een breedte van het type Breuk. 114

113 Overerving Overerving (Inheritance)... is een (speciaal soort)... class Winkelier { //... ; class Bloemiste: public Winkelier { //... ; Een Bloemiste is een (speciaal soort) Winkelier. 115

114 ADT aanpak enum Soort {sintbernard, tekkel; class Hond { private: Soort s; //... public: Krant haalkrant(); void blaf(); //... ; Krant Hond::haalKrant() { //... blaf(); return krant; Niet goed uitbreidbaar! void Hond::blaf() { switch (s) { case sintbernard: cout << "WOEF WOEF"; break; case tekkel: cout << "kef kef"; break; 116

115 OO aanpak class Hond { private: //... public: Krant haalkrant(); virtual void blaf(); //... ; Message kan overridden worden. Een Tekkel is een Hond. Een SintBernard is een Hond. Krant Hond::haalKrant() { //... blaf(); return krant; void Hond::blaf() { cout << "blaf blaf"; 117

116 OO aanpak class SintBernard: public Hond { private: Whisky vat; public: virtual void blaf(); ; void SintBernard::blaf() { cout << "WOEF WOEF"; class Tekkel: public Hond { public: virtual void blaf(); ; void Tekkel::blaf() { cout << "kef kef"; 118

117 Polymorfisme void doejewerk(hond& h) { Krant k = h.haalkrant(); //... int main() { SintBernard Boris; Tekkel Harry; if (!weekend) doejewerk(harry); else if (zaterdag) doejewerk(boris); cin.get(); return 0; h is een polymorfe parameter. doejewerk is een polymorfe functie. Harry is van de class Tekkel maar een Tekkel is een Hond. Boris is van de class SintBernard maar een SintBernard is een Hond. 119

118 Uitbreidbaarheid Door de OO aanpak kan heel eenvoudig een nieuwe soort hond worden toegevoegd. Voeg zelf de classes DuitseHerder en MechelseHerder toe. Welke code moet nu gewijzigd worden? Welke code moet nu opnieuw gecompileerd worden? 120

119 Huiswerk! Bestudeer dictaat hoofdstuk 4 t/m 4.2. Voeg zelf zelf de classes DuitseHerder en MechelseHerder toe. Gegeven is dat beide rassen Herdershonden zijn die een schapenkudde kunnen drijven en hoeden. Elk ras heeft een eigen blaf. Beantwoord de vragen op de vorige sheet. 121

120 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 10

121 Uitwerking Huiswerk Voeg DuitseHerder en MechelseHerder toe. Welke code moet gewijzigd worden? Welke code moet gecompileerd worden? 123

122 Tiroler Herder Toon van Driel 124

123 Tiroler Herder Toon van Driel 125

124 Inline memberfuncties class Hond { public: virtual void blaf() { cout << "blaf blaf"; ; class SintBernard: public Hond { public: virtual void blaf() { cout << "WOEF"; private: Whisky vat; ; Definitie van de memberfuncties staat in de class declaratie. Nadeel: Component kan niet zonder source geleverd worden. Voordeel: Minder typen. 126

125 Boodschap sturen via pointer class Hond { public: virtual void blaf() { cout << "blaf blaf" << endl; ; int main() { Hond fikkie; fikkie.blaf(); Hond* phond(&fikkie); *phond.blaf(); (*phond).blaf(); phond->blaf(); Error: left of '.blaf' must have class/struct Ok Handige afkorting 127

126 Slicing problem polymorfisme werkt alleen bij * en &. class Hond { public: virtual void blaf() { cout << "blaf" << endl; Waarom geen: ; class SintBernard: public Hond { public: virtual void blaf() { cout << "WOEF" <<endl; private: Whisky vat; ;? SintBernard& SintBernard* Niet Polymorf! Waar blijft de whisky? int main() { SintBernard boris; Hond& rhond = boris; rhond.blaf(); Hond* phond = &boris; phond->blaf(); Hond hond = boris; hond.blaf(); 128

127 Abstract Base Class class Hond { private: //... Puur virtueel public: Krant haalkrant(); virtual void blaf() = 0; //... ; Krant Hond::haalKrant() { //... blaf(); return krant; Er kunnen geen objecten (variabelen) van een ABC gedefinieerd worden. Een class die overerft van Hond en blaf() override is geen ABC meer. Een class die overerft van Hond en blaf() niet override is een ABC. Oplossing voor het Slicing Problem 129

128 Slicing problem polymorfisme werkt alleen bij * en &. class Hond { public: virtual void blaf() = 0; ; Hond is een ABC class SintBernard: public Hond { public: virtual void blaf() { cout << "WOEF" << endl; Error: 'Hond' : private: cannot Whisky instantiate vat; abstract class ; due to following members: 'void Hond::blaf(void)' : is abstract int main() { SintBernard boris; Hond& rhond = boris; rhond.blaf(); Hond* phond = &boris; phond->blaf(); Hond hond = boris; 130

129 Slicing Problem Maak alle base classes abstract. Compiler voorkomt slicing! Kan niet altijd: Hergebruik class van een andere programmeur (evt. zonder source code). Je moet nu zelf slicing voorkomen! 131

130 Huiswerk! Bestudeer dictaat paragraaf 4.3 t/m 4.5 en : Memberfunctie overriding. Vanuit de in de derived class overridden memberfunctie kun je de originele functie in de base class aanroepen. 4.4: Abstract base class. 4.5: Constructors bij inheritance. Vanuit de constructor van de derived wordt automatisch de constructor van de base class aangeroepen. Je kunt ook zelf vanuit de constructor van de derived class een constructor in de base class aanroepen. 4.12: Slicing problem. Nodig bij practicumopdracht 3a 132

131 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 11

132 Overloading van memberfuncties class Class { public: void f() const { cout << "Ik ben f()" << endl; void f(int i) const { // overload f() cout << "Ik ben f(int)" << endl; ; int main() { Class object; object.f(); object.f(3); //... Uitvoer: Ik ben f() Ik ben f(int) 134

133 Overloading en overerving class Base { public: void f() const { ; cout << "Ik ben f()" << endl; class Derived: public Base { public: void f(int i) const { // Verberg f() cout << "Ik ben f(int)" << endl; ; Conclusie: Overloading en overerving gaan niet goed samen! Error: 'Derived::f' : function does not take 0 arguments Uitvoer: Ik ben f() Ik ben f(int) Ik ben f() Hiding-rule int main() { Base b; Derived d; b.f(); d.f(3); d.f(); d.base::f(); 135

134 Reden voor de hiding-rule // Code van Bas class Base { public: // geen f(...) ; // Code van Dewi class Derived: public Base { public: void f(double d) const { cout << "Ik ben f(double)" << endl; ; int main() { Derived d; d.f(3); //... Uitvoer: Ik ben f(double) 136

135 Reden voor de hiding-rule // Aangepaste code van Bas class Base { public: //... void f(int i) const { cout << "Ik ben f(int)" << endl; ; // Code van Dewi niet gewijzigd Conclusie: De hiding-rule verhoogt de onderhoudbaarheid! int main() { Derived d; d.f(3); // Base::f(int) is hidden. Gelukkig maar! //... Uitvoer: Ik ben f(double) 137

136 Explicit overriding C++11 Sinds C++11 kun je expliciet aangeven dat je een memberfunctie wilt overridden. Dit voorkomt dat je een memberfunctie per ongeluk overload. Dit doe je door het woord override achter de memberfunctie te plaatsen. De compiler geeft nu een foutmelding als er geen overriding wordt gebruikt. 138

137 Explicit overriding C++11 OOPS: virtual vergeten! class Base { public: void f(int i) const { cout << "Base::f(int) called." << endl; virtual void g(int i) const { cout << "Base::g(int) called." << endl; ; class Derived: public Base { public: OOPS: void const f(int vergeten! i) const override { cout << "Derived::f(int) called." << endl; virtual void g(int i) override { cout << "Derived::g(int) called." << endl; ; Error: 'Derived::f' : method with override specifier 'override' did not Error: override 'Derived::g' any base class : method methods with override specifier 'override' did not override any base class methods 139

138 Final overriding C++11 Je hebt blaf() in Herdershond overridden maar je wilt niet dat blaf() in classes die afgeleid zijn van Herdershond opnieuw overridden wordt. 140

139 Final overriding C++11 class Herdershond: public Hond { public: virtual void blaf() final; //... ; class DuitseHerder: public Herdershond { public: virtual void blaf(); //... ; Error: 'Herdershond::blaf()': declared as 'final' cannot be overridden by 'DuitseHerder::blaf' 141

140 Afscherming private: alleen bereikbaar in member functies van de class zelf protected: alleen bereikbaar in member functies van de class en in member functies van "nakomelingen" van de class public: altijd bereikbaar via object Zie dictaat paragraaf

141 Huiswerk! Bestudeer dictaat paragraaf 4.6 t/m 4.10, 4.12 en : protected members. 4.7: Voorbeeld: ADC kaarten. 4.8: Overloading en overriding van memberfuncties. 4.9: Expliciet overridden van memberfuncties. 4.10: Final overridden van memberfuncties Voorbeeld: Opslaan van polymorfe objecten in een vector Voorbeeld: Impedantie calculator. Nodig bij practicumopdracht 3c 144

142 Huiswerk! Maak het proeftentamen. Zie blackboard Of 145

143 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 12

144 Huiswerk! Bestudeer boek: Warmer & Kleppe, Praktisch UML, 5 de editie. H1 en H2 H4 t/m

145 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 13

146 Software Engineering Fases Wat wil de klant? Analyse (find the requirements). Hoe kun je het maken? Design (structured or OO). Waarmee kun je het maken? Implement (write the code). Werkt het? Test (verify and validate). Verification: Have we built the system right? Does the system satisfy its specification? Validation: have we built the right system? Does the specification satisfy the customer's expectation? 149

147 Software Engineering Waterval methode Traditionele methode. Geschikt voor projecten met weinig risico. Past goed bij gestructureerde aanpak. Spiraal methode (Evolutionaire methode.) Moderne methode. Geschikt voor projecten met veel risico (onzekerheid). Past goed bij OO aanpak. 150

148 Waterval = sequentieel Analyse Design Implement Test 151

149 Tijdsdruk... Versnellen door in elkaar schuiven van waterval model geeft problemen! 152

150 Spiraal = cyclisch Test Analyse Typische duur van één cyclus: 3 weken! Implement Design 153

151 Modelleren Werkelijkheid model 154

152 Wat modelleren we? Analyse Maak een model van de te automatiseren werkelijkheid of van het op te lossen probleem. Ontwerp Domeinkennis structuur. Functionele eisen gedrag. Maak een model van de oplossing. Implementatie Maak een model van het programma. Bij OOA+OOD+OOP werken we steeds aan hetzelfde model (seamless development) 155

153 Unified Modeling Language UML inleiding. Hoofdstuk 1 en 2. UML Klasse- en objectdiagram (1). Paragraaf 4.1 t/m 4.3, 4.4.2, 4.4.8, en UML Use-case-diagram. Paragraaf 8.1 t/m 8.6. UML Sequentie- en communicatiediagram. Paragraaf 10.1 t/m UML Toestands- en Activiteitsdiagram. Paragraaf 12.1 t/m 12.3 en H15.1 t/m UML Klassediagram (2) Paragraaf 4.4.4, en

154 Visual Paradigm for UML Tekenen van UML diagrammen. Omzetten UML naar C++ (of Java, C#, Python enz). Omzetten C++ (of Java, C#, Python) naar UML. Beschikbaar in lokaal D1.049 (en ook thuis). 157

155 Visual Paradigm for UML SE 158

156 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 14

157 Klassendiagram Attributes = data members Operations = member functions = messages Tijdens het ontwikkelen van het model voeg je steeds meer details toe. Deze details kun je ook weer verbergen, zie: Rechtermuisknop -> Presentation Options -> Operation/Attribute Display Options. 160

158 Objectdiagram Object is een instantie van een Class Attributes = data members In Visual Paradigm for UML kunnen attributes met waarden verborgen worden. 161

159 Fases Analysis Design Tijdens het ontwikkelen van het model voeg je steeds meer details toe. Deze details kun je ook weer verbergen, zie: Rechtermuisknop -> Presentation Options -> Operation/Attribute Display Options. 162

160 Code generatie Van je model kan C++ code worden gegenereerd: Andersom is ook mogelijk: Van C++ code een model genereren. 163

161 Implementation = Code generatie Rekening.h #ifndef Rekening_h #define Rekening_h class Rekening { public: bool open(); void stort(double bedrag); bool neemop(double bedrag); private: double saldo; ; Rekening.cpp Code moet nog worden ingevuld! #endif #include "Rekening.h" bool Rekening::open() { void Rekening::stort(double bedrag) { bool Rekening::neemOp(double bedrag) { 164

162 Implementation = Code generatie 165

163 Associatie Labels: Altijd invullen! Multipliciteit: Officiëel altijd in te vullen, maar in praktijk wordt deze weggelaten (aangenomen multipliciteit: 1) Rol: eventueel invullen. Leesrichting: gebruiken om onnatuurlijke 166 leesrichting aan te geven.

164 Overerving (... is een... ) Directeur.h #ifndef Directeur_h #define Directeur_h #include "Persoon.h" class Directeur: public Persoon { ; #endif 167

165 Aggregatie (... heeft een...) Fiets heeft: 2 Wielen 1 Frame 168

166 Associatie Overerving Aggregatie Compositie Beginnende UML modelleerders gebruiken vaak ten onrechte compositie! Een compositie is een speciaal soort aggregatie. Aggregatie heeft een relatie. vaag gedefinieerd Compositie bevat een relatie. deel behoort maar bij 1 geheel levensduur deel <= levensduur geheel 169

167 Compositie (... bevat een...) Welke aggregaties zijn composities? Mens --- Nier Mens --- Hersenen PC --- Hard Disk PC --- CPU CPU --- Transistor Radio --- Transistor Let op! Het goede antwoord is afhankelijk van de applicatie. 170

168 Compositie (... bevat een...) #ifndef Fiets_h #define Fiets_h #include "Frame.h" class Fiets { public: Frame Unnamed_Frame_; ; #endif 171

169 Compositie (... bevat een...) 172

170 Compositie (... bevat een...) #ifndef Fiets_h #define Fiets_h #include "Frame.h" class Fiets { private: Frame hetframe; ; #endif 173

171 Compositie (... bevat een...) #ifndef Frame_h #define Frame_h #include "Fiets.h" class Frame { public: Fiets* Unnamed_Fiets_; ; #endif 174

172 Compositie (... bevat een...) 175

173 Compositie (... bevat een...) #ifndef Fiets_h #define Fiets_h #include "Frame.h" class Fiets { private: Frame hetframe; ; #ifndef Frame_h #define Frame_h #endif class Frame { ; #endif 176

174 Commentaar 177

175 Huiswerk! Bestudeer boek: Warmer & Kleppe, Praktisch UML, 5 de editie. H1 en H2 H4 t/m 4.3, en Bedenk hoe je een aggregatie (geen compositie) kunt implementeren. Zie dictaat: paragraaf

176 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 15

177 Voorbeeld We willen van Hond graag een Abstract Base Class maken! Waarom? 180

178 Pure virtual member function 181

179 Pure virtual member function Pure virtual memberfunctie wordt in UML cursief weergegeven. 182

180 Abstract Base Class 183

181 Abstract Base Class ABC wordt in UML cursief weergegeven. 184

182 Aggregatie implementatie Hoe kunnen we een 0..1 aggregatie implementeren in class SintBernard? WhiskeyVat data member? WhiskeyVat& data member? WhiskeyVat* data member? Andere naam voor een WhiskeyVat Niet 0..1 maar 1. dat al bestaat. Onzin! 185

183 Aggregatie implementatie #ifndef SintBernard_h #define SintBernard_h class WhiskeyVat; class SintBernard { public: WhiskeyVat* heeft_om_zijn_nek; void blaf(); ; #endif 186

184 Aggregatie implementatie #ifndef WhiskeyVat_h #define WhiskeyVat_h class SintBernard; class WhiskeyVat { public: SintBernard* heeft_om_zijn_nek; ; #endif 187

185 Aggregatie implementatie 188

186 Aggregatie implementatie 189

187 Aggregatie implementatie #ifndef SintBernard_h #define SintBernard_h class WhiskeyVat; class SintBernard { public: void blaf(); private: WhiskeyVat* vat; ; #endif 190

188 Aggregatie implementatie Hoe kunnen we een 0..5 aggregatie implementeren in class Kennel? array met Hond* -ers array<hond*, 5> vector<hond*> Beter! Maar niet beschikbaar in Visual Paradigm Goed! Wel beschikbaar in Visual Paradigm, ook bruikbaar voor 0..* 191

189 Aggregatie implementatie #include <vector> using namespace std; #ifndef Kennel_h #define Kennel_h Liever niet! class Hond; class Kennel { private: std::vector<hond*> inwoners; ; #endif 192

190 Opdracht Schrijf een testprogramma voor de hiervoor gemaakte class Kennel. Zet een SintBernard genaamd boris in de Kennel genaamd k. Zet een Tekkel genaamd harry in de Kennel k. Zet een SintBernard genaamd felix in de Kennel k. Laat alle honden in de Kennel k blaffen. Haal harry uit de Kennel k. Laat alle honden in de Kennel k blaffen. Bedenk eerst welke messages je naar een Kennel moet kunnen sturen. 193

191 Uitwerking #include <vector> #ifndef Kennel_h #define Kennel_h class Hond; Waarom Hond& als parameter? class Kennel { private: std::vector<hond*> inwoners; public: void zetin(hond& h); void haaluit(hond& h); void blafallemaal(); ; #endif 194

192 Uitwerking Schrijf altijd eerst het testprogramma! #include <iostream> using namespace std; Test Driven Development #include "Hond.h" #include "SintBernard.h" #include "Tekkel.h" #include "Kennel.h" Gewenste uitvoer: int main() { SintBernard boris; Kennel k; k.zetin(boris); Tekkel harry; k.zetin(harry); SintBernard felix; k.zetin(felix); cout << "Alle honden in de kennel blaffen:" << endl; k.blafallemaal(); k.haaluit(harry); cout << "Alle honden in de kennel blaffen:" << endl; k.blafallemaal(); cin.get(); return 0; 195

193 Kennel implementatie #include <algorithm> #include <iostream> using namespace std; #include "Kennel.h" #include "Hond.h" void Kennel::zetIn(Hond& h) { if (inwoners.size() < 5) inwoners.push_back(&h); else cout << "Kennel is al vol!" << endl; void Kennel::haalUit(Hond& h) { inwoners.erase(find(inwoners.begin(), inwoners.end(), &h)); void Kennel::blafAllemaal() { for (auto hp: inwoners) hp->blaf(); 196

194 Huiswerk! Bestudeer boek: Warmer & Kleppe, Praktisch UML, 5 de editie en Bestudeer dictaat: paragraaf

195 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 16

196 UML diagrammen Statische structuur van programma. UML Klassediagram. Dynamisch gedrag van programma. UML Objectdiagram. UML Use-case-diagram. UML Sequentiediagram. UML Communicatiediagram. UML Toestandsdiagram. UML Activiteitsdiagram. Use-case-diagram beschrijft het gedrag van het programma gezien vanuit de gebruikers van het programma. 199

197 UML Use-case-diagram Wordt gebruikt voor vastleggen van de functionele eisen. Actor Use-case Systeemgrens 200

198 Use-case beschrijving Naam Actor Aannamen Rekening openen Baliemedewerker Baliemedewerker heeft beschikking over de NAW-gegevens van de Klant. De Klant kan zich legitimeren. Beschrijving 1. De baliemedewerker maakt aan het systeem bekend dat een nieuwe rekening aangemaakt moet worden en voert de NAW-gegevens van de Klant in. 2. Als de klant een bedrijf is wordt het KvK nummer ingevoerd. 3. Het systeem controleert of de Klant al rekeningen heeft en of de Klant rood staat op een van deze rekening. In dat geval treedt een uitzondering [rood staan] op. 4. Het systeem maakt het nummer van de nieuwe rekening bekend aan de baliemedewerker. Uitzonderingen Resultaat [rood staan] De baliemedewerker kan naar de use-case Geld storten overgaan om de Klant de gelegenheid te geven het tekort aan te vullen. Als het tekort is aangevuld wordt de use-case vervolgd bij stap 3. De Klant heeft minstens 1 rekening. 201

199 Use-case beschrijving 202

200 UML diagrammen Statische structuur van programma. UML Klassediagram. Dynamisch gedrag van programma. UML Use-case-diagram. UML Sequentiediagram. UML Communicatiediagram. UML Toestandsdiagram. UML Activiteitsdiagram. Sequentiediagram laat zien in welke volgorde objecten elkaar berichten sturen. Communicatiediagram laat zien welke objecten elkaar berichten sturen. 203

201 Tijd Sequentiediagram Boek (p.119): Actor Object Boodschap wekker stuurt boodschap zoem naar :Gebruiker Actor kan boodschap sturen naar object. Object kan boodschap sturen naar actor, andere objecten en naar zichzelf. 204

202 Sequentiediagram Verbeterde versie: 205

203 Sequentiediagram Of eigenlijk nog beter: 206

204 Communicatiediagram Bevat dezelfde informatie als een sequentiediagram. 207

205 Conditionele boodschappen 208

206 Conditionele boodschappen 209

207 Iteratie van boodschappen 210

208 Iteratie van boodschappen void Kennel::blafAllemaal() { for (auto hp: inwoners) hp->blaf(); Visual Paradigm kan geen Sequence Diagram tekenen vanuit C++ code. Visual Paradigm kan geen code (ook geen Java) genereren vanuit een Sequence Diagram 211

209 Boodschap aan jezelf 212

210 Constructor 213

211 Voorbeeld (vervolg...) 214

212 Opgave Maak een sequentiediagram waarin een testprogramma de volgende acties uitvoert: Zet een SintBernard genaamd boris in de Kennel genaamd k. Zet een Tekkel genaamd harry in de Kennel k. Laat alle honden in de Kennel k blaffen. 215

213 Uitwerking 216

214 Huiswerk! Bestudeer boek: Warmer & Kleppe, Praktisch UML, 5 de editie. Hoofdstuk 8 (behalve en 8.7.6). Hoofdstuk 10 (behalve 10.7). Opgaven bij H8, H10 (zie BB). Maak opgaven van voorgaande sheets: Sequentiediagram. 217

215 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 17

216 UML diagrammen Statische structuur van programma. UML Klassediagram. Dynamisch gedrag van programma. UML Use-case-diagram. UML Sequentiediagram. UML Communicatiediagram. UML Toestandsdiagram. UML Activiteitsdiagram. Toestandsdiagram laat de toestanden en toestandsovergangen van een klasse zien. 219

217 Toestandsdiagram Aanmaken van een toestandsdiagram van een klasse in Visual Paradigm: 220

218 Toestandsdiagram Toestand van een WhiskeyVat Worden we hier veel wijzer van? 221

219 Toestandsdiagram 222

220 Toestandsdiagram #include "WhiskyVat_sm.h" class WhiskyVat { private: WhiskyVatContext _fsm; public: WhiskyVat(): _fsm(*this) { WhiskyVatContext& getcontext() { return _fsm; void maakvol() { _fsm.maakvol(); void maakleeg() { _fsm.maakleeg(); ; 223

221 Toestandsdiagram #include "WhiskyVat.h" void state_leeg(whiskyvat *awhiskyvat) { printf("please select transition:\n"); printf("1. maakvol\n"); printf("0. quit\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: awhiskyvat->maakvol(); break; case 0: exit(0); void state_vol(whiskyvat *awhiskyvat) { /* idem */ 224

222 Toestandsdiagram int main(int argc, char **argv) { WhiskyVat lwhiskyvat; while (true) { printf("current state: %s\n", lwhiskyvat.getcontext().getstate().getname()); if (&lwhiskyvat.getcontext().getstate() == &WhiskyVatFSM::Leeg) { state_leeg(&lwhiskyvat); else if (&lwhiskyvat.getcontext().getstate() == &WhiskyVatFSM::Vol) { state_vol(&lwhiskyvat); 225

223 Toestandsdiagram Current state: WhiskyVatFSM::Leeg Please select transition: 1. maakvol 0. quit 1 Current state: WhiskyVatFSM::Vol Please select transition: 1. maakleeg 0. quit 1 Current state: WhiskyVatFSM::Leeg Please select transition: 1. maakvol 0. quit 0 226

224 UML diagrammen Statische structuur van programma. UML Klassediagram. Dynamisch gedrag van programma. UML Use-case-diagram. UML Sequentiediagram. UML Communicatiediagram. UML Toestandsdiagram. UML Activiteitsdiagram. Een Activiteitsdiagram laat een stroom van activiteiten zien. 229

225 Activiteitsdiagram Start Activiteit Swimlane Guard Beslispunt Splitsing Einde Synchronisatie Samenkomst 230

226 Huiswerk! Bestudeer boek: Warmer & Kleppe, Praktisch UML, 5 de editie. Hoofdstuk 12. Hoofdstuk 15. H12 en H15 (zie BB). Maak opgaven van voorgaande sheets: Toestandsdiagram. 231

227 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 18

228 Globaal en lokaal geheugen int global; void f(int parameter) { int local1; //... void main() { int local2; //... f(local2); De compiler bepaalt wanneer variabelen worden aangemaakt en opgeruimd. 233

229 Dynamisch geheugen Je kunt ook zelf beslissen wanneer een variabele (object) wordt aangemaakt en opgeruimd. Tekkel* hp = new Tekkel; hp->blaf(); delete hp; Reserveer geheugenruimte (bij Operating System) Geef geheugenruimte vrij (aan Operating System) 234

230 Dynamische array Het geheugen wordt aangevraagd als het programma runt grootte hoeft niet bij compileren bekend te zijn. Statisch: const size_t s = 5; Tekkel a[s]; for (auto t: a) t.blaf(); Dynamisch: size_t s; cout << "Hoeveel Tekkels wil je? "; cin >> s; Tekkel* c = new Tekkel[s]; for (size_t i = 0; i < s; ++i) c[i].blaf(); delete[] c; size_t s; cout << "Hoeveel Tekkels wil je? "; cin >> s; Tekkel a[s]; for (auto t: a) t.blaf(); Range-based for werkt hier niet. Error: expected constant expression 235

231 Dynamisch geheugen Krachtig: Je bepaalt zelf wanneer geheugen wordt aangemaakt of vrijgegeven. Gevaarlijk: Memory corruption. delete te veel of delete van verkeerde pointer. Memory leak. delete vergeten. Undefined behaviour. gebruik van een deleted variabele. Gebruik zoveel mogelijk standaard componenten zoals std::vector 236

232 Dynamische std::vector Het geheugen wordt aangevraagd als het programma runt grootte hoeft niet bij compileren bekend te zijn. Dynamisch: #include <vector> using namespace std; vector<tekkel>::size_type s; cout << "Hoeveel Tekkels wil je? "; cin >> s; vector<tekkel> v(s); for (Tekkel t: v) t.blaf(); 237

233 Constructor Wordt door de compiler aangeroepen als een variabele gemaakt wordt. class Breuk { public: Breuk(); Breuk(int t); Breuk(int t, int n); int teller() const; int noemer() const; void plus(breuk b); private: int boven; int onder; void normaliseer(); ; void main() { Breuk a, b(-2), c(21,-9); //

234 Destructor Wordt door de compiler aangeroepen als een variabele verwijderd wordt. class Breuk { public: Breuk(); Breuk(int t); Breuk(int t, int n); ~Breuk(); int teller() const; int noemer() const; void plus(breuk b); private: int boven; int onder; void normaliseer(); ; Breuk::~Breuk() { cout << "De breuk met teller " << boven << " en noemer " << onder << " is overleden." << endl; void main() { Breuk a, b(-2), c(21,-9); //

235 Constructor en destructor Compiler roept de constructor en destructor automatisch aan. Reserveer geheugen op de stack voor a en roep constructor a.breuk(21,-9) aan { Breuk a(21,-9); //... //... //... Roep destructor a.~breuk() aan en geef geheugen van a weer vrij 240

236 Constructor en destructor Compiler roept de constructor en destructor automatisch aan. Reserveer geheugen op de heap en roep constructor Breuk(21,-9) aan { Breuk* bp = new Breuk(21,-9); //... delete bp; //... Roep destructor ~Breuk() aan en geef geheugen weer vrij 241

237 Gratis bij elke class! constructor zonder argument (default constructor). Deze constructor roept de default constructor aan van alle data members. copy constructor. Deze constructor roept de copy constructor aan van alle data members. assignment operator (operator=). Deze assignment operator roept de assignment operator aan van alle data members. destructor. Deze destructor roept de destructor aan van alle data members. Je kunt al deze functies ook zelf definiëren! 242

238 Default destructor probleem De automatisch door de compiler aangemaakte default destructor is niet virtual. class Hond { ~SB() wordt niet public: aangeroepen! virtual void blaf() = 0; ; class SB: public Hond { private: Whisky vat; public: SB() { vat.maakvol(); virtual ~SB () { vat.maakleeg(); virtual void blaf() override { cout << "Woef woef" << endl; ; int main() { Hond* Boris(new SB); Boris->blaf(); delete Boris; 243

239 Virtual destructor Als een class nu of in de toekomst als basis class gebruikt wordt dan moet de destructor virtual zijn zodat van deze class afgeleide classes via een polymorphic pointer gedelete kunnen worden. class Hond { C++11 public: virtual ~Hond() = default; virtual void blaf() = 0; ; class SintBernard: public Hond { public: virtual ~SintBernard(); ; 244

240 Huiswerk! Voeg in practicum opgave 2b een destructor toe die meldt dat een Tijdsduur is overleden. Verklaar de uitvoer. Verander nu in opgave 2b elke const Tijdsduur& door een Tijdsduur. Verklaar de wijzigingen in de uitvoer. Bestudeer dictaat: Hoofdstuk 5 t/m

241 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 19

242 Aggregatie implementatie class SintBernard: public Hond { public: SintBernard(); virtual ~SintBernard(); virtual void blaf() override; private: WhiskeyVat* vat; ; Geef de implementatie van de constructor en de destructor. 247

243 Implementatie SintBernard::SintBernard(): vat(new WhiskeyVat) { vat->maakvol(); virtual ~ SintBernard::SintBernard() { vat->maakleeg(); delete vat; virtual void SintBernard::blaf() { cout << "WOEF WOEF" << endl; vat :WhiskeyVat :SintBernard Aangemaakt met new 248

244 Copy constructor SintBernard a; SintBernard b(a); Default copy constructor: kopieert alle data members SintBernard::SintBernard(): vat(new WhiskeyVat) { vat->maakvol(); a vat? b vat? Dit is niet goed! We moeten zelf een copy constructor definiëren. 249

245 Copy constructor Gewenst resultaat: a vat b vat 250

246 Copy constructor SintBernard::SintBernard(const SintBernard& r): Hond(r), vat(0) { if (r.vat!= 0) vat = new WhiskeyVat(*(r.vat)); Kun je ook een SintBernard in plaats van een const SintBernard& als parameter gebruiken? Nee! Want dan moet er een kopietje worden gemaakt en dan wordt de copy constructor aangeroepen, maar dan moet er een kopietje worden gemaakt en dan wordt de copy constructor aangeroepen, maar dan moet er een kopietje worden gemaakt en dan wordt de copy constructor aangeroepen maar, dan moet er een kopietje worden gemaakt en dan wordt de copy constructor aangeroepen maar, dan

247 operator= SintBernard a; SintBernard b; b = a; Default assignment operator: assigned alle data members b.vat = a.vat; Dit is niet goed! We moeten zelf een operator= definiëren. a vat b vat 252

248 operator= Gewenst resultaat: a vat b vat 253

249 operator= SintBernard& SintBernard::operator=(SintBernard SintBernard::operator=(const SintBernard& r) { r) { std::swap(vat, SintBernard t(r); r.vat); return std::swap(vat, *this; t.vat); return *this; Kun je ook een SintBernard in plaats van een const SintBernard& als parameter gebruiken? Ja! Er wordt dan een overbodig kopietje gemaakt. Ja!!! Het maken van het kopietje t is dan overbodig! Wat is nut van SintBernard& return type en return *this? a = b = c; 254

250 Wanneer zelf definiëren? Een class moet een zelf gedefinieerde copy constructor, operator= en destructor bevatten als: die class een pointer bevat en als bij het kopiëren van een object van de class niet de pointer, maar de data waar de pointer naar wijst moet worden gekopieerd en als bij een toekenning aan een object van de class niet de pointer, maar de data waar de pointer naar wijst moet worden toegekend en als bij het opruimen van een object van de class niet alleen de pointer, maar ook de data waar de pointer naar wijst moet worden opgeruimd. 255

251 Huiswerk! Bestudeer dictaat: Paragraaf 5.5 t/m

252 Objectgeoriënteerd Programmeren in C++ OGOPRG Les 20

253 Memberfuncties en data members Elk object heeft zijn eigen data members terwijl de memberfuncties door alle objecten van een bepaalde class "gedeeld" worden. class Hond { public: Hond(const string& n); void blaf(); private: string naam; ; Hond::Hond(const string& n): naam(n) { void Hond::blaf() { cout << naam << " zegt: WOEF" << endl; 258

254 Memberfuncties en data members We willen bijhouden hoeveel objecten van de class Hond er op een bepaald moment bestaan. int aantalhonden = 0; //dit is een globale variabele class Hond { public: Hond(const string& n); ~Hond(); void blaf(); private: string naam; ; Hond::Hond(const string n): naam(n) { ++aantalhonden; Hond::~Hond() { --aantalhonden; 259

255 static Een static data member is een onderdeel van de class en wordt door alle objecten van de class gedeeld. class Hond { public: Hond(const string& n); ~Hond(); void blaf(); static int aantal(); private: string naam; static int aantalhonden; ; 260

256 static Een static data member is een onderdeel van de class en wordt door alle objecten van de class gedeeld. int Hond::aantalHonden = 0; Hond::Hond(const string& n): naam(n) { ++aantalhonden; Hond::~Hond() { --aantalhonden; int Hond::aantal() { return aantalhonden; void Hond::blaf() { cout << naam << " zegt: WOEF" << endl; 261

257 static memberfuncties Twee manieren van aanroepen: direct via de classnaam: class_naam::member_functie_naam(parameters) Voorbeeld: cout << Hond::aantal() << endl; via een object van de class: object_naam.member_functie_naam(parameters) Voorbeeld: cout << h1.aantal() << endl; Beperkingen t.o.v. een gewone memberfunctie: Een static memberfunctie heeft geen receiver (ook niet als hij via een object aangeroepen wordt). Een static memberfunctie heeft dus geen this pointer. Een static memberfunctie kan dus geen "gewone" memberfuncties aanroepen en ook geen "gewone" data members gebruiken. 262

258 static Een static data member is een onderdeel van de class en wordt door alle objecten van de class gedeeld. class Hond { public: Hond(const string& n); ~Hond(); void blaf(); static int aantal(); private: string naam; static int aantalhonden; ; UML boek: paragraaf

259 static static in Visual Paradigm: 264

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2

Modeleren. Modelleren. Together UML. Waarvan maken we een model? overzicht les 14 t/m 18. ControlCenter 6.2 Modelleren Werkelijkheid Modelleren Modeleren Waarvan maken we een model?!analyse " Maak een model van de te automatiseren werkelijkheid of van het op te lossen probleem! Domeinkennis = structuur! Functionele

Nadere informatie

Werkvormen 84 SBU. Inhoud. !OOP = Object Oriënted Programming N C++ (niet volledig)

Werkvormen 84 SBU. Inhoud. !OOP = Object Oriënted Programming N C++ (niet volledig) SOPX2E1 PROGMI1 Object Georiënteerd Programmeren in C++ 1 bd.thrijswijk.nl Een stapje verder met programmeren!van gestructureerd programmeren naar object georiënteerd programmeren!c++ is een uitbreiding

Nadere informatie

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces. Hoofdstuk 1: Inleiding Objectoriëntatie: 1. Objecten & klassen: samenwerking van componenten om bepaald doel te bereiken; herbruikbaarheid. 2. Encapsulation: afschermen gedragingen en kenmerken van de

Nadere informatie

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10 CPP 1 van 10 ADSdt 1-2009 TENTAMENVOORBLAD Voor aanvang van het tentamen s.v.p. de tentamengegevens goed doorlezen om eventuele misverstanden te voorkomen!! Naam student : Studentnummer : Groep : Studieonderdeel

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden Datastructuren: stapels, rijen en binaire bomen week 12: 23 27 november 2015 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Inleiding In de informatica worden Abstracte DataTypen (ADT s)

Nadere informatie

Objectgeoriënteerd Programmeren in C++

Objectgeoriënteerd Programmeren in C++ Objectgeoriënteerd Programmeren in C++ Woef, woef! Harry Broeders De Haagse Hogeschool Opleiding Elektrotechniek 27 april 2015 J.Z.M.Broeders@hhs.nl Objectgeoriënteerd Programmeren in C++ van Harry Broeders

Nadere informatie

Inleiding... 3. Een terugblik op C... 3

Inleiding... 3. Een terugblik op C... 3 1 Inhoudsopgave. Inleiding.... 3 Een terugblik op C.... 3 1 Inleiding van C naar C++.... 6 1.1 Commentaar met //.... 6 1.2 Plaats van variabelen definities.... 6 1.3 Constante waarden met const.... 7 1.4

Nadere informatie

Programmeren in C++ (deel 1)

Programmeren in C++ (deel 1) FHT&L MODULE BESCHRIJVING Programmeren in C++ (deel 1) PRO4 Samenstelling: Cees van Tilborg, Thijs Dorssers Datum: september 2011 Versie: 1h Titel: Programmeren in C++ Identificatie Progresscode: PRO4

Nadere informatie

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double. Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort

Nadere informatie

Een typisch programma in C en C++ bestaat uit een aantal onderdelen:

Een typisch programma in C en C++ bestaat uit een aantal onderdelen: Eerste stappen in C. Een typisch programma in C en C++ bestaat uit een aantal onderdelen: /* Alles wat op meerdere lijnen staat zoals hier is commentaar. */ // Dit is commentaar op 1 lijn. Geldig tot einde

Nadere informatie

9 Meer over datatypen

9 Meer over datatypen 9 Meer over datatypen We hebben al gezien dat het gebruik van symbolische constanten de leesbaarheid van een programma kan verbeteren. Door een geschikte naam (identifier) voor een constante te definiëren,

Nadere informatie

Vakgroep CW KAHO Sint-Lieven

Vakgroep CW KAHO Sint-Lieven Vakgroep CW KAHO Sint-Lieven Objecten Programmeren voor de Sport: Een inleiding tot JAVA objecten Wetenschapsweek 20 November 2012 Tony Wauters en Tim Vermeulen tony.wauters@kahosl.be en tim.vermeulen@kahosl.be

Nadere informatie

Modulewijzer Tirdat01

Modulewijzer Tirdat01 Modulewijzer Tirdat01 W. Oele 25 augustus 2008 1 Inhoudsopgave 1 Inleiding en leerdoelen 3 2 Voorkennis 3 2.1 tirprg01 en tirprg02........................ 3 2.2 tirprg03.............................. 4

Nadere informatie

Programmeren in Java 3

Programmeren in Java 3 2 september 2007 voor deeltijdstudenten Kop van Zuid Rotterdam, 3 juni 2007 Even voorstellen Naam: Wessel Oele(31) Docent bij opleiding technische informatica Kamer: I210 (tweede verdieping, links de gang

Nadere informatie

Inleiding C++ Coding Conventions

Inleiding C++ Coding Conventions Inleiding C++ Coding Conventions Opleiding Bachelor of Science in Informatica, van de Faculteit Wetenschappen, Universiteit Antwerpen. Nota s bij de cursus voor academiejaar 2012-2013. Ruben Van den Bossche,

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

C++ C++ als een verbetering van C. Abstracte datatypen met classes. Constructoren en destructoren. Subklassen. binding van functies

C++ C++ als een verbetering van C. Abstracte datatypen met classes. Constructoren en destructoren. Subklassen. binding van functies C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1 Commentaar In C: /* Deze functie berekent de omtrek van een cirkel */ float

Nadere informatie

Programmeren in Java 3

Programmeren in Java 3 26 september 2007 Deze les korte herhaling vorige les Unified Modelling Language notatie van een class afleiding pointers abstracte classes polymorphisme dubieuze(?) constructies interfaces Meer over class

Nadere informatie

Gertjan Laan Aan de slag met C++ Vijfde editie

Gertjan Laan Aan de slag met C++ Vijfde editie Hoofdstuk 1 Paragraaf 1.8 Vragen 1. Wat is de functie van een compiler? Een compiler vertaalt een programma dat geschreven is in een hogere programmeertaal zoals C++ (de broncode) naar een code die begrepen

Nadere informatie

Objectgeoriënteerd Programmeren in C++

Objectgeoriënteerd Programmeren in C++ Objectgeoriënteerd Programmeren in C++ Woef, woef! De Haagse Hogeschool Opleiding Elektrotechniek 27 april 2015 J.Z.M.Broeders@hhs.nl van is in licentie gegeven volgens een Creative Commons Naamsvermelding-NietCommercieel-Gelijk-

Nadere informatie

Tentamen in2705 Software Engineering

Tentamen in2705 Software Engineering Tentamen in2705 Software Engineering Voorbeeld (bijna tweemaal te groot) U mag meenemen naar dit tentamen: Lethbridge, afdrukken PPT slides, afdrukken handouts. 1. De TU wil een nieuw systeem ontwikkelen

Nadere informatie

Object Oriëntatie Foundation (OOF.NL)

Object Oriëntatie Foundation (OOF.NL) Object Oriëntatie Foundation (OOF.NL) EXIN Hét exameninstituut voor ICT ers Janssoenborch - Hoog Catharijne Godebaldkwartier 365 3511 DT Utrecht Postbus 19147 3501 DC Utrecht Nederland T +31 30 234 48

Nadere informatie

Zelftest Inleiding Programmeren

Zelftest Inleiding Programmeren Zelftest Inleiding Programmeren Document: n0824test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST INLEIDING PROGRAMMEREN Deze

Nadere informatie

Online c++ leren programmeren:

Online c++ leren programmeren: Online c++ leren programmeren: Inhoud 1)Waar vind ik een c++ compiler?... 2 2)Hoe start ik een programma in c++?... 2 3)Een eerste c++ programma:... 3 Een eerste programma schrijven:... 3 Mijn eerste programma

Nadere informatie

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET Visual Basic.NET M. den Besten 0.3 VB. NET Inhoud Voorwoord Deel 1 Visual Basic.NET 1.1 Inleiding...13 1.2 De programmeertaal Visual Basic.NET...14 1.3 Microsoft Visual Basic 2010 Express Edition...15

Nadere informatie

Datastructuren en algoritmen

Datastructuren en algoritmen Datastructuren en algoritmen Doelstelling Datastructures + algorithms = programs Boek van Niklaus Wirth: bedenker Pascal en Modula Datastructuur: structuur om informatie op te slaan Algoritme: voorschrift

Nadere informatie

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur 1. deze opgave telt voor 30% van het totaal. Schrijf een compleet programma, dat door de gebruiker vanaf

Nadere informatie

Datastructuren college 10

Datastructuren college 10 we hadden Backtracking verbetering i i Datastructuren college 0 0: : : 0: : : P r r r r r b r b r P r r r b r b r backtracking we hoeven vaak de kandidaat niet helemaal af te maken om hem te kunnen verwerpen

Nadere informatie

Algoritmen en Datastructuren

Algoritmen en Datastructuren Algoritmen en Datastructuren Harry Broeders De Haagse Hogeschool Opleiding Elektrotechniek 27 april 2015 J.Z.M.Broeders@hhs.nl Algoritmen en Datastructuren van Harry Broeders is in licentie gegeven volgens

Nadere informatie

DOMjudge teamhandleiding

DOMjudge teamhandleiding judge DOMjudge teamhandleiding Samenvatting /\ DOM DOM judge Hieronder staat de belangrijkste informatie kort samengevat. Dit is bedoeld om snel aan de slag te kunnen. We raden echter ten zeerste aan dat

Nadere informatie

Verslag Opdracht 4: Magische Vierkanten

Verslag Opdracht 4: Magische Vierkanten Verslag Opdracht 4: Magische Vierkanten Stefan Schrama, Evert Mouw, Universiteit Leiden 2007-08-14 Inhoudsopgave 1 Inleiding 2 2 Uitleg probleem 2 3 Theorie 2 4 Aanpak 2 5 Implementatie 4 6 Experimenten

Nadere informatie

Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Dit

Nadere informatie

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk. HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een

Nadere informatie

Dynamiek met VO-Script

Dynamiek met VO-Script Dynamiek met VO-Script Door Bert Dingemans DLA Ontwerp & Software bert@dla-architect.nl Inleiding Op de SDGN nieuwsgroep voor Visual Objects ontstond laatst een draad van berichten over de nieuwe libraries

Nadere informatie

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse Objective-C Basis 23 april 2005, Eindhoven Patrick Machielse patrick@hieper.nl Algemeen // extensies Objective-C code in bestanden met.m extensie // commentaar moet! /* Alles hiertussen wordt genegeerd

Nadere informatie

Stacks and queues. Hoofdstuk 6

Stacks and queues. Hoofdstuk 6 Hoofdstuk 6 Stacks and queues I N T R O D U C T I E In dit hoofdstuk worden drie datastructuren stack, queue en deque behandeld. Om deze datastructuren te implementeren, worden onder andere arrays en linked

Nadere informatie

Modulewijzer tirprog02/infprg01, programmeren in Java 2

Modulewijzer tirprog02/infprg01, programmeren in Java 2 Modulewijzer tirprog02/infprg01, programmeren in Java 2 W. Oele 17 november 2009 1 Inhoudsopgave 1 Inleiding 3 2 Studiehouding 3 3 Voorkennis 4 4 Inhoud van deze module 5 5 Leermiddelen 5 6 Theorie en

Nadere informatie

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Programmeermethoden. Recursie. week 11: november kosterswa/pm/ Programmeermethoden Recursie week 11: 21 25 november 2016 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Pointers Derde programmeeropgave 1 Het spel Gomoku programmeren we als volgt: week 1: pointerpracticum,

Nadere informatie

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Syntax- (compile), runtime- en logische fouten Binaire operatoren Inhoud Syntax- (compile), runtime- en logische fouten Binaire operatoren Operaties op numerieke datatypen Evaluatie van expressies, bindingssterkte Assignment operaties en short-cut operatoren Controle

Nadere informatie

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. Herhaling Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. De basisbouwsteen is het object; een geïntegreerde eenheid van data en operaties werkend op deze

Nadere informatie

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele Informatica Objectgeörienteerd leren programmeren Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode Objectgeörienteerd

Nadere informatie

Een gelinkte lijst in C#

Een gelinkte lijst in C# Een gelinkte lijst in C# In deze tutorial ga demonstreren hoe je een gelinkte lijst kan opstellen in C#. We gaan een klasse schrijven, die een gelijkaardige functionaliteit heeft als een ArrayList, namelijk

Nadere informatie

Model Driven Software Development: Geen toekomst maar realiteit. 4 juni 2009, WTC, Amsterdam.

Model Driven Software Development: Geen toekomst maar realiteit. 4 juni 2009, WTC, Amsterdam. Model Driven Software Development: Geen toekomst maar realiteit. 4 juni 2009, WTC, Amsterdam. Welke hoort in dit rijtje niet thuis? Weg- en waterbouw Huizen- en kantoorbouw Stedenbouw Auto- en vliegtuigbouw

Nadere informatie

1 uur/week practicum. tentamen (cijfer), practicumbeoordeling (O/V) en projectbeoordeling

1 uur/week practicum. tentamen (cijfer), practicumbeoordeling (O/V) en projectbeoordeling Studiewijzer. onderwijseenheid: Software Ontwikkeling & Programmeren 3 studiebelasting: 168 SBU (84 in kwartaal 1 en 84 in kwartaal 2) semester / kwartaal: H3C&D / 1 en 2 contacturen kwartaal 1: 3 uur/week

Nadere informatie

Modelleren & Programmeren. Jeroen Fokker

Modelleren & Programmeren. Jeroen Fokker Modelleren & Programmeren Jeroen Fokker Wat heb je nodig? Collegediktaat kopen bij A-Eskwadraat (BBG-238) of zelf downloaden en uitprinten www.cs.uu.nl / docs / vakken / KI1V13009 Solis-id met password

Nadere informatie

VI. Klassen en objecten

VI. Klassen en objecten VI. Klassen en objecten Klassen en objecten vormen het fundament van OOP. We zullen dus uitgebreid aandacht besteden aan klassen en objecten. U kunt Java niet begrijpen zonder goed met klassen en objecten

Nadere informatie

ALGORITMIEK: answers exercise class 7

ALGORITMIEK: answers exercise class 7 Problem 1. See slides 2 4 of lecture 8. Problem 2. See slides 4 6 of lecture 8. ALGORITMIEK: answers exercise class 7 Problem 5. a. Als we twee negatieve (< 0) getallen bij elkaar optellen is het antwoord

Nadere informatie

http://www.liacs.nl/home/kosters/java/

http://www.liacs.nl/home/kosters/java/ sheets Programmeren 1 Java college 2, Walter Kosters De sheets zijn gebaseerd op de hoofdstukken 2 tot en met 6 van: D. Bell en M. Parr, Java voor studenten, Prentice Hall, 2002 http://www.liacs.nl/home/kosters/java/

Nadere informatie

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, 14.00-15.30, Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Dit tentamen bestaat uit twee delen. Deel 1 (14.00-14.45, gesloten

Nadere informatie

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet

Nadere informatie

Om de libraries te kunnen gebruiken, moet de programmeur (een deel van) zijn programma in C/C++ schrijven.

Om de libraries te kunnen gebruiken, moet de programmeur (een deel van) zijn programma in C/C++ schrijven. 1 Inleiding tot.net Software werd en wordt meestal geschreven in C of C++. De broncode van een C/C++ programma wordt dan gecompileerd naar machine code, die eventueel nog gelinkt wordt met machine code

Nadere informatie

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010 Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2009-2010 16 juni, 2010 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief

Nadere informatie

IMP Uitwerking week 13

IMP Uitwerking week 13 IMP Uitwerking week 13 Opgave 1 Nee. Anders moet bijvoorbeeld een venster applicatie een subklasse zijn van zowel Frame en WindowListener. Als de applicatie ook een button of een menu heeft, dan moet het

Nadere informatie

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing Introductie In dit document geven we een mogelijke oplossing voor het eerste practicum. Deze oplossing gebruikt verschillende klassen en overerving,

Nadere informatie

Java. Basissyllabus. Egon Pas

Java. Basissyllabus. Egon Pas Java Basissyllabus Egon Pas 2011 BeanPole bvba Gasmeterlaan 92-9000 Gent BTW BE 472.902.516 Tel: + 32 9 224 42 17 Fax: + 32 9 223 62 88 www.beanpole.be info@beanpole.be 1 Programmeren 1.1 Hoe werkt een

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 11 december 2015 Ingebouwde datastructuren Meer boomstructuren Access specifiers Gebruikersinvoer Codestijl Packages SAT-solver Ingebouwde datastructuren Ingebouwde

Nadere informatie

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest.

Een unit test is geen integratie test. Niet het hele systeem, maar onderdelen van een systeem worden getest. WAT IS EEN UNIT TEST? Een unit test is een test om de functionaliteit van stukken code te controleren. Een goede unit test waarborgt een consistente werking van een klein onderdeel (een unit ) van de broncode.

Nadere informatie

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int

Nadere informatie

Programmeren. Cursus Python

Programmeren. Cursus Python Programmeren Cursus Python Cursus Python Omschrijving In deze cursus leren de deelnemers te programmeren in de objectgeoriënteerde programmeertaal Python. Python is een taal die vaak wordt gebruikt voor

Nadere informatie

Tentamen Programmeren in C (EE1400)

Tentamen Programmeren in C (EE1400) TU Delft Tentamen Programmeren in C (EE1400) 5 april 2012, 9.00 12.00 Faculteit EWI - Zet op elk antwoordblad je naam en studienummer. - Beantwoord alle vragen zo nauwkeurig mogelijk. - Wanneer C code

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 6 december 2013 Terugblik Programma en geheugen Opdrachten Variabelen Methoden Objecten Klasse Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in

Nadere informatie

Programmeren (1) Examen NAAM:

Programmeren (1) Examen NAAM: Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien) en geef zowel klad als net af. Bij heel wat vragen moet je zelf Java-code schrijven. Hou dit kort en bondig. Je hoeft

Nadere informatie

Software Processen. Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1. Het software proces

Software Processen. Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1. Het software proces Software Processen Ian Sommerville 2004 Software Engineering, 7th edition. Chapter 4 Slide 1 Het software proces Een gestructureerd set van activiteiten nodig om een software systeem te ontwikkelen Specificatie;

Nadere informatie

Programmeren in Java 2

Programmeren in Java 2 / CMI Programmeren in Java 2 Tinpro01-2 Aantal studieunten: 2 ects Modulebeheerder: Wessel Oele Goedgekeurd door: (namens toetscommissie) Datum: Tinpro01-2 12 november 2015 Inhoudsopgave 1 Algemene omschrijving

Nadere informatie

Real-Time Systems (RTSYST)

Real-Time Systems (RTSYST) Real-Time Systems (RTSYST) Week 3 C++ concurrent programmeren C++ heeft sinds C++11 een standaard library voor concurrent programmeren. Alternatieve libraries: Boost Thread library http://www.boost.org/

Nadere informatie

Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Digitale

Nadere informatie

Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn.

Verder zijn er de nodige websites waarbij voorbeelden van objectgeoriënteerd PHP (of Objec Oriented PHP, OO PHP) te vinden zijn. Objectgeoriënteerd PHP (versie 5) Kennisvereisten: Ervaring met programmeren in PHP met MySQL Je weet wat een class of klasse is Je weet wat een instantie van een klasse (een object) is Je weet wat een

Nadere informatie

Dit document bevat informatie over make bij het eerstejaars college Programmeermethoden, Universiteit Leiden, najaar 2010, zie

Dit document bevat informatie over make bij het eerstejaars college Programmeermethoden, Universiteit Leiden, najaar 2010, zie Dit document bevat informatie over make bij het eerstejaars college Programmeermethoden, Universiteit Leiden, najaar 2010, zie www.liacs.nl/home/kosters/pm/ Met dank aan allen die aan deze tekst hebben

Nadere informatie

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, 11.00-13.00 uur 1. (2 punten per deelvraag) Deze opgave bestaat uit een aantal tekstvragen. Houd het antwoord kort: een

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 13 november 2013 Organisatie Docenten Jeroen Bransen Michael Moortgat Docenten Jeroen Bransen Imperatief programmeren (Java) Tot de kerst (ongeveer) Michael Moortgat

Nadere informatie

Labo 2 Programmeren II

Labo 2 Programmeren II Labo 2 Programmeren II L. Schoofs K. van Assche Gebruik Visual Studio 2005 om een programma te ontwikkelen dat eenvoudige grafieken tekent. Deze opgave heb je vorig academiejaar reeds in Java geïmplementeerd.

Nadere informatie

Inleiding tot Func.oneel Programmeren les 3

Inleiding tot Func.oneel Programmeren les 3 Inleiding tot Func.oneel Programmeren les 3 Kris Luyten, Jo Vermeulen {kris.luyten,jo.vermeulen}@uhasselt.be Exper.secentrum voor Digitale Media Universiteit Hasselt Currying Currying: een func.e met meerdere

Nadere informatie

Omschrijf bij ieder onderdeel van de methode de betekenis ervan. Java kent twee groepen van klassen die een GUI kunnen maken: awt en swing.

Omschrijf bij ieder onderdeel van de methode de betekenis ervan. Java kent twee groepen van klassen die een GUI kunnen maken: awt en swing. irkel (met Jpanel) ij de onderstaande opdracht behoort het bestand Panels: JPanels_1.java (map Panel) in de map irkel. pplicaties in Java hebben altijd een publieke klasse waarin een methode main voorkomt.

Nadere informatie

Technology, Innovation & Society Delft

Technology, Innovation & Society Delft Technology, Innovation & Society Delft VOORBLAD SCHRIFTELIJKE TOETSEN OPLEIDING TOETSCODE GROEP : ELEKTROTECHNIEK : RTSYST-co1 : ECV TOETSDATUM : 12 JUNI 2012 TIJD : 11.00 12.30 uur AANTAL PAGINA S (incl.

Nadere informatie

Project Software Engineering XML parser: Parsen van een xml CD catalogus

Project Software Engineering XML parser: Parsen van een xml CD catalogus Project Software Engineering XML parser: Parsen van een xml CD catalogus Brent van Bladel brent.vanbladel@uantwerpen.be February 16, 2017 XML (Extensible Markup Language) is een taal waarmee we op een

Nadere informatie

Objectgeoriënteerd programmeren in Java 1

Objectgeoriënteerd programmeren in Java 1 Objectgeoriënteerd programmeren in Java 1 CPP Javaprogrammeur Bijeenkomst 3 Leereenheden 7, 8, 9 De Java API Java bevat een grote bibliotheek standaardklassen: de Java API Voorbeelden java.lang basisklassen

Nadere informatie

HOGESCHOOL ROTTERDAM

HOGESCHOOL ROTTERDAM HOGESCHOOL ROTTERDAM IAN02 - Informatie-analyse (objectgeoriënteerde analyse) M O D U L E W I J Z E R I A N 0 2 1 V A N 1 5 Modulecode: IAN02 Modulenaam: Informatieanalyse 2 Belasting (aantal cp): 2 Bestemd

Nadere informatie

inleiding theoretische informatica practicum 1 deadline woensdag 20 februari 2008 om uur

inleiding theoretische informatica practicum 1 deadline woensdag 20 februari 2008 om uur 1 Inleiding inleiding theoretische informatica 2007-2008 practicum 1 deadline woensdag 20 februari 2008 om 14.00 uur Dit practicum is een kennismaking met functioneel programmeren. Twee belangrijke functionele

Nadere informatie

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld Afdeling ST Faculteit EWI TU Delft Bij dit tentamen mag u gebruik maken van: Barnes, Object-Oriented Programming with Java en de Notitie Algoritmiek

Nadere informatie

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is PROEF-Tentamen Inleiding programmeren (IN1608WI), X januari 2010, 9.00-11.00, Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Open boek tentamen: bij het tentamen mag alleen gebruik worden gemaakt

Nadere informatie

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, 17 20 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde

Nadere informatie

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008 judge Teamhandleiding DOMjudge (versie..0mukp) 31 mei 008 /\ DOM DOM judge Inhoudsopgave 1 Inleiding Samenvatting.1 Inlezen en wegschrijven............................... Insturen van oplossingen...............................3

Nadere informatie

extra oefening algoritmiek - antwoorden

extra oefening algoritmiek - antwoorden extra oefening algoritmiek - antwoorden opgave "Formule 1" Maak een programma dat de gebruiker drie getal A, B en C in laat voeren. De gebruiker zorgt ervoor dat er positieve gehele getallen worden ingevoerd.

Nadere informatie

Cursus Algoritmiek - - - najaar 2005

Cursus Algoritmiek - - - najaar 2005 Cursus Algoritmiek - - - najaar 2005 Practicumopdracht 4 : werken met kale gegevensbestanden 1. Achtergrond In de 2 e en de 3 e practicumopdracht heb je al kennis gemaakt met het via het toetsenbord laten

Nadere informatie

Zelftest Programmeren in Java

Zelftest Programmeren in Java Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test

Nadere informatie

SYNTRA-WEST. Cursus OOP. Deel

SYNTRA-WEST. Cursus OOP. Deel SYNTRA-WEST Cursus OOP Deel Syntra-West voorheen VORMINGSINSTITUUT VOOR KMO Syntra-West Doorniksesteenweg 220 8500 Kortrijk Tel. 056/26.02.00 Fax 056/22.81.07 i Inhoudsopgave SYNTRA-WEST... 0 CURSUS OOP...

Nadere informatie

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI Vrijdag 22 januari 2010 Toelichting Dit is een open boek tentamen. Communicatie en het gebruik van hulpmiddelen zijn niet toegestaan.

Nadere informatie

Inleiding programmeren

Inleiding programmeren Inleiding programmeren Docent: José Lagerberg Assistenten: Robin de Vries, Jordy Perlee, Dimitri Belfor, Stephen Swatman, Erik Kooistra, Daan Kruis, Daniel Louwrink Cursusinformatie: https://staff.fnwi.uva.nl/j.m.lagerberg

Nadere informatie

Programmeren in Java

Programmeren in Java 4 september 2015 Even voorstellen Naam: Wessel Oele(39) Email: W.Oele@hr.nl Website: http://med.hro.nl/oelew Kop van Zuid Rotterdam, 3 juni 2007 Overzicht van modules programmeren in Java In totaal 4 modules

Nadere informatie

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014! Inleiding Software Engineering Unit Testing, Contracten, Debugger 13 Februari 2014 Beknopte info over Unit Testing en Contracten kan je vinden op het einde van dit document. Eclipse beschikt over een handige

Nadere informatie

TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica

TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica TWl(0)9O Inleiding Programmeren Tentamen 16 maart 2017, 9:00-12:00 uur Normering: Opgave 1 t/m 3 ieder 6 punten. Score:

Nadere informatie

C++ voor C-kenners. Jeroen Fokker Informatica Instituut Universiteit Utrecht januari 1995

C++ voor C-kenners. Jeroen Fokker Informatica Instituut Universiteit Utrecht januari 1995 C++ voor C-kenners Jeroen Fokker Informatica Instituut Universiteit Utrecht januari 1995 De taal C+ + wordt steeds meer gebruikt als alternatief voor C. De taal is een object-georiënteerde uitbreiding

Nadere informatie

Lineaire data structuren. Doorlopen van een lijst

Lineaire data structuren. Doorlopen van een lijst Lineaire data structuren array: vast aantal data items die aaneensluitend gestockeerd zijn de elementen zijn bereikbaar via een index lijst: een aantal individuele elementen die met elkaar gelinkt zijn

Nadere informatie

colleges recursieve datastructuren college 9 prioriteit van operatoren prioriteit in recursive descent parser

colleges recursieve datastructuren college 9 prioriteit van operatoren prioriteit in recursive descent parser colleges recursieve datastructuren college 9 interpreteren: waarde van bomen bepalen transformeren: vorm van bomen veranderen parseren herkennen van expressie in de tekst herkennen van functies onderwerp

Nadere informatie

Gevorderd Programmeren

Gevorderd Programmeren Gevorderd Programmeren Praktijk nota s Opleiding Bachelor of Science in Informatica, van de Faculteit Wetenschappen, Universiteit Antwerpen. Nota s bij de cursus voor academiejaar 2008-2009. J. Broeckhove

Nadere informatie

Programmeren in C# Samenvatting van C#

Programmeren in C# Samenvatting van C# Programmeren in C# Samenvatting van C# Proceduraal Programmeren Functies (O: void + return, I: referentie of value) Arrays, Lijsten Lussen (for, while, do while) Condities, if-else, switch Variabelen,

Nadere informatie

Overerving & Polymorfisme

Overerving & Polymorfisme Overerving & Polymorfisme Overerving Sommige klassen zijn speciaal geval van andere klasse Docent is een speciaal geval van werknemer, dwz. elke docent is ook werknemer Functionaliteit van docent = functionaliteit

Nadere informatie

APPLICATIEBOUW 2E COLLEGE: ONTWERPEN, GEBRUIKERSINTERFACES, VARIABELEN & EXPRESSIES. Onderdeel van SmartProducts

APPLICATIEBOUW 2E COLLEGE: ONTWERPEN, GEBRUIKERSINTERFACES, VARIABELEN & EXPRESSIES. Onderdeel van SmartProducts APPLICATIEBOUW 2E COLLEGE: ONTWERPEN, GEBRUIKERSINTERFACES, VARIABELEN & EXPRESSIES Onderdeel van SmartProducts INHOUD COLLEGE 2 module4.io.utwente.nl/applicatiebouw Software ontwerpen Gebruikersinterfaces,

Nadere informatie

Software-Ontwikkeling I Academiejaar 2006-2007

Software-Ontwikkeling I Academiejaar 2006-2007 Software-Ontwikkeling I Academiejaar 2006-2007 Project: Bibliotheekbeheer 1 1. Digitale bibliotheek a. Inleiding Bibliotheken houden onder meer hun collecties van uitleenbare artikels bij in digitaal formaat.

Nadere informatie