EVMINX4 Week 3 Algoritmen en Datastructuren (ALDAT)

Slides:



Advertisements
Verwante presentaties
Negatieve getallen Klas 1 | Hoofdstuk 4
Advertisements

Inleiding programmeren in C++ Life Science & Technology 26 januari Universiteit Leiden.
Objectgeoriënteerd Programmeren in C++
Universiteit Leiden Inleiding programmeren in C++ Life Science & Technology 16 februari

Algoritmen en Datastructuren (ALDAT)
Hoog Leer noten lezen! Deel 1 Laag A - B - C - D - E - F - G
Gestructureerd programmeren in C
Instructie Programmeren Task 8 5JJ70. PAGE 2 Task 8: Double Linked List Het doel van deze opdracht is: Het opbouwen van een tweetal klassen, die samen.
Inleiding programmeren in C++ Life Science & Technology 19 januari Universiteit Leiden.
PROS2 Les 11 Programmeren en Software Engineering 2.
Corba Overzicht. Corba referenties Belangrijkste: CORBA: Integrating Diverse Applications Within Distributed Heterogeneous Environments (Steve Vinoski)
GESPRG Les 14 Gestructureerd programmeren in C. 174 Details! The devil is in the details.
1 Tentamen 21 januari 2008 uitleg Algemene kennisvragen a)“Wat verstaan we onder de complexiteit van een algoritme?” –Cruciaal: wat gebeurt er met.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
De koektrommel of de grabbelton
Frank Stalpers en Ad Baars
Inleidend probleem Data structuur (hiërarchie van classes)
Numerieke Natuurkunde
Visual Basic .NET voor studenten
Algoritmen en Datastructuren (ALDAT) EVMINX4 Week 6.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Dagdeel 2.
MICPRG Les 11 Microcontroller Programmeren in C. 112 Datastructuren in C Werkgeheugen (PC en microcontroller): Statische datastructuren (vaste grootte):
Opg.1a: substring } String substring(int a) { int t; for (t=a; t
Inleiding programmeren in C++ Life Science & Technology 2 februari Universiteit Leiden.
Inleiding programmeren in C++ Life Science & Technology 9 februari Universiteit Leiden.
Java en BlueJ Een goed idee?.
1 Datastructuren Introductie tot de programmeeropgaven in C++ Jan van Rijn
Hogeschool HZ Zeeland 19 augustus 2003augustus 2003 Data Structuren & Algoritmen Week 3.
P. 1 Vakgroep Informatietechnologie Structuur Deel II C++ Classes Namespaces Type casting Reference types Constructors en Destructors Memory Management.
Looking at Code Size and Performance Kevin Muys.  Hoe efficiënt is C++ vergeleken met C  Hoe beïnvloed C++ het benodigde geheugen  Oplossingen voor.
Opgave 2a nMet een InputStream lees je bytes uit een binare file nMet een Reader lees je characters uit een tekstfile.
Klas 2 m en herhaling voor klas 3 m
PHP & MYSQL LES 02 PHP & FORMULIEREN. PHP & MYSQL 01 PHP BASICS 02 PHP & FORMULIEREN 03 PHP & DATABASES 04 CMS: BEST PRACTICE.
Programma Structuur Diagrammen (PSD’s)
Overerving Inheritance Overerving l Inleiding l Type-extensie l Compatibiliteit van een basistype met zijn extensie l Statisch en dynamisch type l Run.
Tircms03-p les 6 Templates. Functietemplates void verwissel(int &x, int &y); { int w=x;x=y;y=w;} Dezelfde functie voor meerdere types heet een functietemplate.
Tircms03-p les 7 Standaardfuncties. In header opnemen bijv: using namespace std // C++ // oude C.
Variabelen Part deux.. Variabelen week 3 0. Herhaling 1. De NullPointerException (p101) 2. Primitieven 3. Scope en levensduur van variabelen 4. Meerdere.
Computertechniek 2 – ARM assembler Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1  programma draaien vanuit ROM.
tircms02-p les 1 Operating Systems practicum
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 3 redirection,
Hoofdstuk 10.3 Tekst-editor: MDI-interface Dialogen Files lezen Abstracte klassen.
Tircms03-p les 1 C++ voor C-kenners Voor Technische Informatica.
Instructie Programmeren Task 7
1 PI1 week 9 Complexiteit Sorteren Zoeken. 2 Complexiteit van algoritmen Hoeveel werk kost het uitvoeren van een algoritme (efficiëntie)? –tel het aantal.
Woensdag 23 maart 2011 Door: J. Tieman. Vorige les Wat hebben we gedaan?
Java Objectgeoriënteerd Programmeren in Java met BlueJ
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 8: Gebruikersinterface © 2014, Gertjan Laan, versie 2.
Agenda  Lesuur minuten  Wat kun je met programmeren?  Wat is code en hoe werkt het?  Code schrijven: de basis  Lesuur minuten  Zelf.
Variabelen. Wat zijn variabelen? In een programmeertaal zijn er “dingen” nodig die ervoor zorgen dat het programma informatie voor korte of langere tijd.
GUI & classes Een Gui in een class steken en het object gebruiken.
Memc.  Je kent het antwoord terwijl je je programma maakt en dit is niet veel: voorzie X objecten.  Je kent het antwoord terwijl je je programma maakt.
Bij algoritmen horen datastructuren David N. Jansen 2 december 2015.
Milo van der Zee
Pointers, arrays & dynamische geheugen
Gameprogrammeren: Lists en interfaces
Object georiënteerd programmeren
De programmeertaal C++
Tinpro015b-les 1 C++ voor C-kenners Voor Technische Informatica.
Tinpro015b-les5 Invoer en Uitvoer.
Tinpro015b-les6 Templates.
Tinpro015b-les4 Klassen.
‘Inleiding objectgeoriënteerd programmeren met PHP’ ‘Inleiding’
Hoofdstuk 10 Handig rekenen 2. Hoofdstuk 10 Handig rekenen 2.
Software Development fundamentals
Software Development fundamentals
Software Development fundamentals
Transcript van de presentatie:

EVMINX4 Week 3 Algoritmen en Datastructuren (ALDAT)

37 Standaard C++ Library Standaard algoritmen en datastructuren in C++ (voorheen STL = Standard Template Library) Zie dictaat hoofdstuk 6 (en TICPPV2 hoofdstuk 6 en 7).

38 STL Containers (datastructuren) Iterators (om door een container te wandelen) Algoritmen (generiek) Het gebruik van iterators maakt generiek programmeren (generic programming) mogelijk. Een generiek algoritme kan op verschillende datatypes (containers) toegepast worden. Generic programming is dus niet OOP. Met behulp van iterators kun je een algoritme op de objecten in een container uitvoeren. De algoritmen zijn zo efficient mogelijk (geen inheritance en virtuele functies gebruikt). Je kunt eigen algoritmen, containers en iteratoren toevoegen.

39 STL componenten C = container A = algoritme i = iterator Een algoritme kan ook uit 1 container lezen en in dezelfde container schrijven

40 Iterator voorbeeld Met behulp van een iterator kun je door een string lopen op dezelfde manier als dat je met een pointer door een char[ ] kunt lopen. char naam1[ ]="Henk"; for (const char* p(naam1); *p!='\0'; ++p) cout<<*p<<" "; cout<<endl; string naam2("Harry"); for (string::const_iterator i(naam2.begin()); i!=naam2.end(); ++i) cout<<*i<<" "; cout<<endl;

41 Containers Sequentiële containers (linear) [ ] vector list deque (double ended queue, eigenlijk een devector) bitset (slaan wij over) adapters (in combinatie met vector, list of deque) stack queue priority_queue

42 Containers (vervolg) Associatieve containers (elementen op volgorde van sleutelwaarde opgeslagen) set Verzameling van sleutels (keys). Sleutel moet orgineel zijn. multiset Verzameling van sleutels (keys). Sleutel kan meerdere malen voorkomen. map Verzameling van paren (sleutel, waarde) (key, value). Sleutel moet orgineel zijn. multimap Verzameling van paren (sleutel, waarde) (key, value). Sleutel kan meerdere malen voorkomen.

43 Containers De containers regelen hun eigen geheugenbeheer. De containers maken kopietjes van de elementen die erin gestopt worden. Als je dat niet wilt dan moet je een container met pointers gebruiken. Alle objecten in een container zijn van het zelfde type. (Dat kan wel een polymorf pointertype zijn!)

44 Sequentiële containers

45 Sequentiële containers vector random access operator[ ], at(...) gooit exception out_of_range toevoegen of verwijderen push_back(...)pop_back()O(1) insert(...)erase(...)O(N) deque random access zoals vector toevoegen of verwijderen push_back(...)pop_back()O(1) push_front(...)pop_front()O(1) insert(...)erase(...)O(N) list geen random access toevoegen of verwijderen push_back(...)pop_back()O(1) push_front(...)pop_front()O(1) insert(...)erase(...)O(1)

46 vector voorbeeld #include using namespace std; int main() { vector v; void print(const vector & vec); // zelf gedefinieerde functie print int i; cin>>i; while (i!=0) { v.push_back(i); cin>>i; } print(v); if (v.size()>=4) for (vector ::iterator iter(v.begin()+2); iter!=v.begin()+4; ++iter) *iter*=2; print(v); // …

47 vector voorbeeld // print met behulp van een index: void print(const vector & vec) { cout<<"De inhoud van de vector is:"<<endl; for (vector ::size_type index(0); index!=vec.size(); ++index) { cout<<vec[index]<<" "; } cout<<endl; } // print met behulp van een iterator: void print(const vector & vec) { cout<<"De inhoud van de vector is:"<<endl; for (vector ::const_iterator iter(vec.begin()); iter!=vec.end(); ++iter) { cout<<*iter<<" "; } cout<<endl; } Is het niet beter om hier vec.at(index) te gebruiken? Welke versie is beter?

48 Generiek voorbeeld // print met behulp van een index: template class C> void print(const C & c) { cout<<"De inhoud van de container is:"<<endl; for (typename C ::size_type i(0); i!=c.size(); ++i) { cout<<c[i]<<" "; } cout<<endl; } // print met behulp van een iterator: template class C> void print(const C & c) { cout<<"De inhoud van de container is:"<<endl; for (typename C ::const_iterator iter(c.begin()); iter!=c.end(); ++iter) { cout<<*iter<<" "; } cout<<endl; } Welke versie is beter? Kan dat niet eenvoudiger?

49 Generiek voorbeeld //… // print met behulp van twee iteratoren: template void print(T begin, T end) { cout<<"De inhoud van de container is:"<<endl; for (T iter(begin); iter!=end; ++iter) { cout<<*iter<<" "; } cout<<endl; } int main() { vector v; list l; for (int i(1); i<=10; ++i) { v.push_back(i); l.push_back(1.0/i); } print(v.begin(), v.end()); print(l.begin(), l.end()); Welke versie is beter?

50 list voorbeeld #include using namespace std; class Hond { public: virtual void blaf() const =0;... }; class Tekkel: public Hond {... }; class SintBernard: public Hond {... }; int main() { list kennel; kennel.push_back(new Tekkel); kennel.push_back(new SintBernard); kennel.push_back(new Tekkel); for ( list ::const_iterator i= kennel.begin(); i!=kennel.end(); ++i ) { (*i)->blaf(); } cin.get(); return 0; }

51 Adapters Container adapters passen de interface van een vector, deque of list aan. stack queue priority_queue stack > s1; // stack implemented with vector stack > s2; // stack implemented with deque stack > s3; // stack implemented with list stack s4; // using deque by default Je kunt nu alleen tijdens compile time kiezen welke stack je wilt en niet tijdens run-time. Zie dagdeel 2.

52 Adapters stack push(...), pop(), top(), empty() queue kan niet met vector. push(...), pop(), front(), empty() Let op: push voegt achteraan toe en pop verwijderd vooraan. priority_queue kan niet met list. push(...), pop(), top(), empty() Let op: top geeft het grootste element terug en pop verwijderd dit element. wordt geïmplementeerd als binary heap.

53 Stacktest #include using namespace std; int main() { stack s(32); char c; cout<<"Type een tekst, sluit af met."<<endl; cin.get(c); while (c!='.') { s.push(c); cin.get(c); } while (!s.empty()) { cout<<s.top(); s.pop(); } cin.get(); cin.get(); return 0; }

54 Associatieve containers set (verzameling) multiset (bag) map (1:N relatie) multimap (M:N relatie) Mogelijkheden: zoeken op Key doorlopen op volgorde van Key Implementatie: hash table binary search tree (in std gebruikt) Bevat elementen van het template type pair Bevat elementen van het type const Key

55 Associatieve containers

56 set (verzameling) Toevoegen met insert Een element wordt automatisch op de “goede” plaats ingevoegd. Returntype is een pair. De bool geeft aan of het invoegen gelukt is en de iterator geeft de plek aan waar ingevoegd is. Verwijderen met erase Een te verwijderen element wordt automatisch opgezocht. Zoeken met find Geeft een iterator terug naar de plaats waar het element staat en geeft end() terug als element niet gevonden is. Zoeken met count Geeft het aantal keer dat een element voorkomt (0 of 1).

57 multiset (bag) Toevoegen met insert Een element wordt automatisch op de “goede” plaats ingevoegd. Returntype is een iterator. Deze iterator geeft de plek aan waar ingevoegd is. Verwijderen met erase Een te verwijderen element wordt automatisch opgezocht. Alle gevonden elementen worden verwijderd. Zoeken met find Geeft een iterator terug naar de plaats waar het eerste gevonden element staat en geeft end() terug als element niet gevonden is. Zoeken met count Geeft het aantal keer dat een element voorkomt (  0).

58 set voorbeeld #include using namespace std; void print(const set & s) { cout<<"De set bevat: "; for (set ::const_iterator i(s.begin()); i!=s.end(); ++i) cout<<*i<<" "; cout<<endl; } int main() { set docenten; docenten.insert("John"); docenten.insert(“Theo"); docenten.insert("Harry"); print(docenten); // … Wat is de uitvoer? Wat verandert er als we de set vervangen door een multiset?

59 set voorbeeld #include using namespace std; int main() { set docenten; // … // achteraf testen of insert gelukt is. pair ::iterator, bool> result(docenten.insert("Harry")); if (result.second==false) cout<<"1 Harry is genoeg."<<endl; // vooraf testen of insert mogelijk is. if (docenten.count(“Harry")==1) cout<<"1 Harry is genoeg."<<endl;

60 map (1:N relatie) Elementen zijn: pair interface gelijk aan set insert erase find count extra operator[ ] met operator[ ] kun je een key als index gebruiken. Als de key al in de map zit wordt een reference naar de bijbehorende value teruggegeven. Als de key niet aanwezig in de map dan wordt deze key toegevoegd met de default value (default constructor).

61 multimap (M:N relatie) Elementen zijn: pair interface gelijk aan set insert erase find count geen operator[ ]

62 map voorbeeld #include using namespace std; int main() { string w; map freq; // word count cout<<"Geef filenaam: "; cin>>w; ifstream fin(w.c_str()); while (fin>>w) { ++freq[w]; } for (map ::const_iterator i(freq.begin()); i!=freq.end(); ++i) { cout first second<<endl; }