Advanced C ++ Programming Datastructuren 2018

Vergelijkbare documenten
Datastructuren Werkcollege Intro

Introductie in C++ Jan van Rijn. September 2013

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

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

Inleiding C++ Coding Conventions

Datastructuren: stapels, rijen en binaire bomen

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

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

int getaantalpassagiers{): void setaantalpassagiers(int aantalpassagiers);

Datastructuren: stapels, rijen en binaire bomen

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

Programmeertechnieken Week 4, 5

/20. richtlijnen. Lees deze richtlijnen! Log in op de pc met. login: paswoord: examen i examen001. Log in op. x.toledo.ucll.be

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

Gevorderd Programmeren

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

C++ programmeermethoden Bachelor Kunstmatige Intelligentie

Inleiding Een terugblik op C... 3

Programmeertechnieken Week 6

3 e jaars GameTech student C++ voor hobby, eerste programmeertaal Assistent bij een heleboel vakken

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

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

Programmeren in C ++ les 4

Programmeren in C++ (deel 1)

Vakgroep CW KAHO Sint-Lieven

Ontwerp van Informatiesystemen

Overerving & Polymorfisme

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

IDE gebruik en introductie Java. Programmeertechnieken, Tim Cocx

Grafisch programmeren met GTK

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 7 november 2014, uur

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

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

Abstracte klassen & Interfaces

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

Modelleren en Programmeren

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

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Objectgeoriënteerd Programmeren in C++

Datastructuren Programmeeropdracht 3: Expressies. 1 Expressies. Deadline. Dinsdag 8 december 23:59.

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

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Kleine cursus PHP5. Auteur: Raymond Moesker

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

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Programmeren in C# Overerving

Programmeermethoden. Controle-structuren. Walter Kosters. week 3: september kosterswa/pm/

continue in een for, while of do lus herhaalt de lus vroegtijdig. De volgende herhaling wordt onmiddellijk begonnen.

IMP Uitwerking week 13

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Programmeertechnieken Week 7

Inleiding programmeren

Datastructuren en algoritmen

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/

9 Meer over datatypen

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

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

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, uur

Object-oriented programmeren met BlueJ en Visual Studio

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

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Online c++ leren programmeren:

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

VI. Klassen en objecten

et Zend Framework bestaat volledig uit objectgeoriënteerde

VOORBLAD SCHRIFTELIJKE TOETSEN

Objectgeoriënteerd Programmeren in C++

Noties Informatica. In java fungeren objecten als een model voor de elementen waarin een probleem kan worden opgesplitst

Inleiding Programmeren 2

Inleiding Programmeren 2

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Modulewijzer Tirdat01

Modelleren en Programmeren

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Transcriptie:

Advanced C ++ Programming Datastructuren 2018 Jonathan K. Vis j.k.vis@lumc.nl Jonathan K. Vis Advanced C++ Programming 1 / 26

Vorige week Vragen? Tentamen, programmeeropgaven en eindcijfer; Partiële resultaten van voorgaande jaren; Programmeeropgave 1: Deadline: 17 oktober (strict!); Voorbeeld. Jonathan K. Vis Advanced C++ Programming 2 / 26

Waarom? In grote lijnen volgen we alle best practices uit: 1. Programmeermethoden; 2. Algoritmiek; 3. Programmeertechnieken. Maar nu met een focus op: Datastructuren; Programmeren voor andere programmeurs; Libraries. Jonathan K. Vis Advanced C++ Programming 3 / 26

1 Object Oriented Programming 2 Inheritance 3 Polymorphism 4 Standard Template Library 5 Templates 6 const Correctness 7 Code Style 8 Comments 9 make Build System 10 Testing Jonathan K. Vis Advanced C++ Programming 4 / 26

Object Oriented Programming Organiseren van data en methoden: 1. interne data representatie: attributen (membervariabelen); 2. interface (voor interactie): procedures (memberfuncties); defineren het gedrag, maar de implementatie is verborgen. Constructors en destructors; Access levels: public, private, protected, static; Getters en setters; Operator overloading. Jonathan K. Vis Advanced C++ Programming 5 / 26

Definitie in.h #ifndef lijst_h #define lijst_h int const MAX = 500; class Lijst public: Lijst(void); void voegtoe(int const nieuw); private: int data[max]; int laatste; }; // Lijst #endif Jonathan K. Vis Advanced C++ Programming 6 / 26

Implementatie in.cc/.cpp #include "lijst.h" Lijst::Lijst(void) laatste = 0; } // Lijst::Lijst void Lijst::voegtoe(int const nieuw) if (laatste < MAX - 1) laatste += 1; data[laatste] = nieuw; } // if } // Lijst::voegtoe Jonathan K. Vis Advanced C++ Programming 7 / 26

Meer over headers en namespace s Libraries hebben soms overlappende elementen (dezelfde naam); Denk ook aan programmeeropgave 1; Gebruik een namespace om conflicten te voorkomen; using namespace std; zeker niet in headers; Header guards (voor hergebruik); extern en static. namespace karel std::string const naam = "Karel"; } std::cout << "Hello World: " << karel::naam << std::endl; Jonathan K. Vis Advanced C++ Programming 8 / 26

Inheritance of overerving Hergebruik van functionaliteit; Eenheid en structuur (relaties) tussen klasses; Subklasses nemen memberfuncties en -variabelen over van de superklasse (m.u.v. private); Subklasses kunnen members overschrijven; Extra access level: protected: niet van buiten, wèl vanuit een subklasse; friend; geeft toegang tot specifieke private members; Multiple inheritance. Jonathan K. Vis Advanced C++ Programming 9 / 26

class rechthoek public: rechthoek(int l, int b); void setlengte(int l); void setbreedte(int b); int getlengte(); int getbreedte(); protected: int lengte, breedte; }; // rechthoek class gekleurderechthoek : public rechthoek public: gekleurderechthoek(int l, int b, int k); private: int kleur; }; // gekleurderechthoek Jonathan K. Vis Advanced C++ Programming 10 / 26

Polymorphism class Polygon protected: int width, height; public: void set_values (int a, int b) width = a; height = b; } }; // Polygon class Rectangle: public Polygon public: int area() return width * height; } }; // Rectangle class Triangle: public Polygon public: int area() return width * height / 2; } }; // Triangle Jonathan K. Vis Advanced C++ Programming 11 / 26

Polymorphism int main(int, char* []) Rectangle rect; Triangle trgl; Polygon* ppoly1 = &rect; Polygon* ppoly2 = &trgl; ppoly1->set_values(4, 5); ppoly2->set_values(4, 5); std::cout << rect.area() << std::endl; std::cout << trgl.area() << std::endl; } // main virtual-functies geven nog meer controle. Jonathan K. Vis Advanced C++ Programming 12 / 26

Standard Template Library Een verzameling van bibliotheken (https://en.cppreference.com) verdeelt in: Algoritmes; Containers; Functies; Iterators. De interne werking is bijna altijd onbelangrijk. std::vector<int> ar = 1, 2, 3, 4, 5 }; std::vector<int>::iterator it; for (it = ar.begin(); it!= ar.end(); it++) std::cout << *it << std::endl; } // for Jonathan K. Vis Advanced C++ Programming 13 / 26

Input en Output Gebruik ostream/istream; Superklasse van cout, ofstream,... Gebruik eventueel operator overloading voor: <<. void Lijst::drukaf(std::ostream &stream) stream << data << std::endl; } // Lijst::drukaf std::ostream & Lijst::operator<<(std::ostream &stream, Lijst const &lijst) lijst.drukaf(stream) return stream; } // Lijst::operator<< Jonathan K. Vis Advanced C++ Programming 14 / 26

Templates Templates worden gebruikt om generieke functies (en klassen) te defineren; Één implementatie voor (vele) verschillende data typen; Implementatie door de compiler; Veelal handig voor rekenkundige operaties voor int, float, complex, breuk,... of voor container klassen: lijst, verzameling,... In heel veel andere gevallen is het nut beperkt. Jonathan K. Vis Advanced C++ Programming 15 / 26

#include <iostream> template <typename T> T max(t const &a, T const &b) return a > b? a : b; } // max int main(int, char* []) int a = 4, b = 5; float c = 4.3, d = 4.4; std::cout << max<int>(a, b) << std::endl << max<float>(c, d) << std::endl << max<int>(c, d) << std::endl; } // main Jonathan K. Vis Advanced C++ Programming 16 / 26

template <typename T> class Lijst public: void voegtoe(t const &nieuw); private: T data[500]; int laatste; }; // Lijst template <typename T> void Lijst<T>::voegtoe(T const& nieuw) data[laatste++] = nieuw; } // Lijst::voegtoe int main(int, char* []) Lijst<int> lijst; lijst.voegtoe(4); } // main Jonathan K. Vis Advanced C++ Programming 17 / 26

Meer Templates Template specialization; Variadic templates; Template aliases (from C ++ 11): template <typename T> using str_map = std::unordered_map<t, std::string>; Header file. Jonathan K. Vis Advanced C++ Programming 18 / 26

Template Metaprogramming template <int N> struct Factorial static const int value = N * Factorial<N - 1>::value; }; template <> struct Factorial<0> static const int value = 1; }; int main(int, char* []) std::cout << Factorial<6>::value << std::endl; } // main Jonathan K. Vis Advanced C++ Programming 19 / 26

const Correctness Laat de programmeur (en de compiler) weten dat een functie geen aanpassingen doet aan een klasse (bijv. getters); Geef aan dat parameters niet veranderen in de functie; Vaak is het doorgeven van klasses (of grote data typen) efficienter als call-by-reference, denk ook aan templates; const werkt van rechts naar links; Uitzonderingen? const_cast<>. bool Lijst::voegtoe(int const &waarde); bool Lijst::haaluit(int const &plaats, int &waarde); bool Lijst::isin(int const &waarde) const; Jonathan K. Vis Advanced C++ Programming 20 / 26

Code Style Veel is goed, zo lang het maar consequent is; Elegante code; Leesbaarheid (begrijpbaarheid); Inspringen (spaties of tabs) (https://stackoverflow.blog/2017/ 06/15/developers-use-spaces-make-money-use-tabs/); Namen: variabelen, klasses, constanten,... Lees eens een echte code style; Gebruik een redelijke editor, IDE. Jonathan K. Vis Advanced C++ Programming 21 / 26

Comments Altijd commentaar bovenaan iedere file: /** * klassenaam: beschrijving van klasse/programma * @author naam (studentnummer) * @author naam (studentnummer) * @file filenaam * @date datum laatste wijziging **/ En commentaar bij iedere (member)functiedeclaratie (header file): class dinges public: // commentaar hier! void doeiets(); }; // dinges // Niet hier! void dinges::doeiets() } Jonathan K. Vis Advanced C++ Programming 22 / 26

/** * @function functienaam * @abstract beschrijving wat de functie doet * @param parameternaam beschrijving rol parameter * @return beschrijving van het resultaat * @pre exacte beschrijving preconditie * @post exacte beschrijving postconditie wat is er veranderd na het uitvoeren van de functie? **/ Precondities: wat moet er gelden voor een functie kan worden aangeroepen (testbaar!): De datastructuur is niet leeg; Er zijn minimaal n elementen; De operator < is gedefinieerd voor type T. Postconfities: wat geldt er bij het afsluiten van de functie; Bijzondere gevallen, en wat te doen bij errors? Jonathan K. Vis Advanced C++ Programming 23 / 26

make Build System Code layout: include/ *.h src/ *.cc tests/ test_*.cc LICENSE Makefile README.md Jonathan K. Vis Advanced C++ Programming 24 / 26

INC_DIR = include SRC_DIR = src SOURCES = $(shell find $(SRC_DIR)/ -name *.cc ) OBJECTS = $(SOURCES:.cc=.o) DEPS = $(OBJECTS:.o=.d) TARGET = programma CC = g++ CFLAGS = -march=native CPPFLAGS = $(addprefix -I, $(INC_DIR)) -Wall -Wextra -pedantic.phony: all clean debug release release: CFLAGS += -O3 -DNDEBUG release: all debug: CFLAGS += -O0 -DDEBUG -ggdb3 debug: all all: $(TARGET) clean: rm -f $(OBJECTS) $(DEPS) $(TARGET) $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ -include $(DEPS) %.o: %.cc $(CC) $(CFLAGS) $(CPPFLAGS) -MMD -o $@ -c $< Jonathan K. Vis Advanced C++ Programming 25 / 26

Testing Test driven development; Memory leaks: valgrind; Unit tests; Use assert: #include <cassert> int main(int, char* []) assert(2 + 2 == 4); assert(2 + 2 == 5); } // main Jonathan K. Vis Advanced C++ Programming 26 / 26