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

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

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

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

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen

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

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 6 10 november kosterswa/pm/

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 5 9 november kosterswa/pm/

Programmeermethoden. Arrays. Walter Kosters. week 7: oktober kosterswa/pm/

Object-geOriënteerd Programmeren & Life

De Leidsche Flesch Studievereniging voor Natuurkunde, Sterrenkunde, Wiskunde en Informatica sinds DLF Pointerworkshop

Tweede college algoritmiek. 12 februari Grafen en bomen

Programmeermethoden. Files & functies. Walter Kosters. week 4: september kosterswa/pm/

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Algoritmiek. 15 februari Grafen en bomen

Programmeermethoden. Files & functies. Walter Kosters. week 4: september kosterswa/pm/

Lineaire data structuren. Doorlopen van een lijst

Programmeermethoden. Object-geOriënteerd Programmeren & Life. week 6: oktober kosterswa/pm/

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

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

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

Programmeermethoden. Arrays (vervolg) Walter Kosters. week 8: 29 oktober 2 november kosterswa/pm/

Programmeermethoden. Types. Walter Kosters. week 2: september kosterswa/pm/

Programmeermethoden. Types. Walter Kosters. week 2: september kosterswa/pm/

C``ifPCwhileLinuxdiffintFirefoxboolpublicprivateWindows. fileg``unixvisualosfedoralscharpsopenclosegetputarray

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Modelleren en Programmeren

De sheets zijn gebaseerd op met name hoofdstuk. D. Bell en M. Parr, Java voor studenten, Prentice Hall,

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Een gelinkte lijst in C#

Tentamen Programmeren in C (EE1400)

Verslag Opdracht 4: Magische Vierkanten


Online c++ leren programmeren:


Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Programmeermethoden NA. Week 6: Lijsten

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

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Vakgroep CW KAHO Sint-Lieven

VOORBLAD SCHRIFTELIJKE TOETSEN

10 Meer over functies

Introductie in C++ Jan van Rijn. September 2013

Modelleren en Programmeren

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

[8] De ene 1 is de andere niet

Ingebouwde klassen & methodes

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

Programmeermethoden NA

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

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

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

IMP Uitwerking week 13

Programmeren (1) Examen NAAM:

Voorbeeld: Simulatie van bewegende deeltjes

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

Eerste college algoritmiek. 5 februari Introductie

Modelleren en Programmeren

Tentamen Programmeren in C (EE1400)

Modelleren en Programmeren

Tentamen Programmeren in C (EE1400)

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

Dynamisch geheugen beheer

Veel succes! 1. Gegeven is de volgende klasse:

Derde college algoritmiek. 22 februari Complexiteit Toestand-actie-ruimte

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

Algoritmiek. 2 februari Introductie

ALGORITMIEK: antwoorden werkcollege 5

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Een korte samenvatting van enkele FORTRAN opdrachten

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Programmeren in C++ Efficiënte zoekfunctie in een boek

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

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Programmeren in Java les 3

Programmeren in C# Samenvatting van C#

Dynamisch Programmeren. Het Rugzakprobleem

VOORBLAD SCHRIFTELIJKE TOETSEN

Vierde college algoritmiek. 23/24 februari Complexiteit en Brute Force

Programmeermethoden NA. Week 5: Functies (vervolg)

Programmeermethoden. Talen: Python,... Walter Kosters. week 14: december kosterswa/pm/

C``ifPCwhileLinuxdiffintFirefoxboolpublicprivateWindows. fileg``unixvisualosfedoralscharpsopenclosegetputarray

Zevende college algoritmiek. 24 maart Verdeel en Heers

Programmeermethoden. Talen: Java, Qt, Python,... Walter Kosters. week 14: december

Programmeermethoden NA. Week 3: Controlestructuren

1. Geef type en zo mogelijk de waarde van de volgende uitdrukkingen. Hierbij zijn p, q, r ensvariabelen van typebool, enkvan typeint.

Tweede deeltentamen Imperatief programmeren versie 1 Vrijdag 20 oktober 2017, uur

PROS1E1 Gestructureerd programmeren in C Dd/Kf/Bd

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

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

Modelleren en Programmeren

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

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

Zevende college Algoritmiek. 6 april Verdeel en Heers

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

Transcriptie:

Programmeermethoden Pointers Walter Kosters week 10: 13 17 november 2017 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1

Pointers Introductie Een pointer is in feite gewoon een geheugenadres. Het geheugen kun je je voorstellen als een lineaire lijst met bytes. Als p een pointer is naar een geheel getal i (gedefinieerd via int * p = &i;), is p het adres van i, en is i ook als *p te benaderen: i = 196; komt nu op hetzelfde neer als *p = 196;. Met behulp van pointers kun je het geheugen dynamisch beheren, dat wil zeggen tijdens het runnen van het programma. 2

Pointers Bibliotheek Stel je wilt jaargangen Donald Duck opbergen in een bibliotheek, in verschillende kasten, en maar één cataloguskaartje gebruiken. Oplossing: plak de plek van de eerstvolgende jaargang achterin de vorige. Dus achterin 2007 zit een sticker met jaargang 2008 staat op plek..., achterin 2016 staat dit is de laatste. En de eerste is 1952. 3

Pointers Voorbeeld 1 int * p; int * q; twee pointers naar int(eger) p? q? p = new int; maak nieuwe int en stop diens adres in p p q?? 4

Pointers Voorbeeld 2 p q?? *p = 42; stop 42 in die int p q? 42 q = p; laat q diezelfde int aanwijzen p q 42 5

Pointers Voorbeeld 3 p q 42 *q = 37; verander de int via q p q 37 p = NULL; laat p naar niets wijzen p NULL q 37 6

Pointers Voorbeeld 4 p NULL q 37 p = q; zet p weer terug p q 37 delete q; blaas (via q) de int op p? q? 37 7

Pointers Implementatie Bij het deleten wordt de geheugenruimte weer vrijgegeven. Bij delete q; wordt niet q vrijgegeven, maar datgene waar q naar wijst! Voorlopig bevat *q nog wel de oude waarde (37) maar op enig moment niet meer... Goed: delete q; q = NULL;, want nu weet je zeker dat q naar niets wijst. NULL is trouwens gewoon 0. Sinds 2011 moet je in plaats van NULL eigenlijk nullptr gebruiken: g++ -std=c++11 -Wall... Als je een pointer afloopt ( dereferencen ) moet je zeker weten dat hij niet NULL is! 8

Pointers Fout Fout is zoiets als q = new int; q = p; Je maakt nu namelijk eerst een nieuwe int, laat q daarnaar wijzen, en verandert q dan. Het adres van die eerste int is nu voor altijd zoek, en die int verspilt ruimte! Slecht is: p = NULL; delete p; Een NULL-pointer kun je niet deleten als je het toch doet, gebeurt er niks. 9

Pointers Notaties int i; // een integer int* p; // een pointer naar een integer p = &i; // p wijst i aan: p is nu het adres van i i = 12; // verandert i *p = *p + 8; // oftewel *p += 8;, verandert i opnieuw int *q = &i; // q wijst ook i aan; geen new s, // en zeker geen delete s! Let op: int* p, q; betekent dat p een pointer naar een integer is, en q een integer; bij int* p; int* q; en ook bij int *p, *q; heb je twee pointers naar een integer. En wat betekent *p++? Is dat (*p)++ of *(p++)? 10

Pointers Met klassen En met klassen erbij: class wagon { public: int hoogte;... };//wagon wagon *p; // p is pointer naar (= adres van) een wagon Nu kun je de hoogte van de door p aangewezen wagon *p (de member-variabele hoogte) benaderen via (*p).hoogte, maar ook via (nieuwe notatie) p->hoogte. 11

Pointers Enkelverbonden pointerlijst 1 We maken nu een enkelverbonden pointerlijst bestaande uit vakjes: class vakje { public: char info; vakje* volgende; };//vakje Vaak wordt hiervoor in plaats van class het iets eenvoudigere struct gebruikt. info volgende Zo n vakje ziet er uit als: x 12

Pointers Enkelverbonden pointerlijst 2 We willen bijvoorbeeld maken: ingang p a s Doel: opslaan van serie karakters, waar we de lengte van te voren niet van weten. c Lijstje afdrukken: vakje* hulp = ingang; while ( hulp!= NULL ) { cout << hulp->info << endl; hulp = hulp->volgende; }//while a l NULL 13

Pointers Enkelverbonden pointerlijst 3 Hoe bouwen we zo n lijst vanaf niets op? vakje* ingang; ingang = new vakje; ingang->info = l ; ingang->volgende = NULL; Dit levert op: ingang l NULL 14

Pointers Enkelverbonden pointerlijst 4 Hoe duwen we er nog een vakje voor? vakje* p; p = new vakje; p->info = c ; p->volgende = ingang; ingang = p; Dit levert op: ingang p c l NULL Let op: nu niet delete p; zeggen! 15

Pointers Enkelverbonden pointerlijst 5 Hoe stoppen we er een vakje tussen? vakje* p; p = new vakje; p->info = a ; p->volgende = ingang->volgende; ingang->volgende = p; Dit levert op: ingang p c a l NULL Etcetera... 16

Pointers Enkelverbonden pointerlijst 6 Maar het kan uiteraard beter met een functie: class vakje { public: char info; vakje* volgende; };//vakje void zetervoor (char letter, vakje* & ingang) { vakje* p; // let op de & p = new vakje; p->info = letter; p->volgende = ingang; ingang = p; // en nu NIET delete p;! }//zetervoor ingang = NULL; // met vakje* ingang; zetervoor ( l,ingang); zetervoor ( a,ingang); zetervoor ( c,ingang); zetervoor ( s,ingang); zetervoor ( a,ingang); zetervoor ( p,ingang); 17

Pointers Enkelverbonden pointerlijst 7 s Avonds lijst bewaren (zonder pointers): vakje* hulp; while ( ingang!= NULL ) { uitvoer.put (ingang->info); hulp = ingang; ingang = ingang->volgende; delete hulp; }//while s Ochtends lijst weer opbouwen (met pointers): ingang = NULL; char letter = invoer.get ( ); while (! invoer.eof ( ) ) { zetervoor (letter,ingang); letter = invoer.get ( ); }//while Helaas... verkeerd om: nog eens wegschrijven en weer opbouwen, of zeterachter schrijven (laatste onthouden). 18

Pointers Spaghetti class vanalles { public: int info; char naam; vanalles* volgende; vanalles* andere; };//vanalles info naam andere volgende entree 42 t (#) 65 x NULL 10 x 19 b NULL ($) ($) entree->volgende->andere (#) entree->volgende->volgende->info of entree->andere->info 19

Pointers Call by value/reference 1 Bekijk de volgende functie: void demo (char letter, vakje* ingang) { if ( ingang!= NULL ) ingang->info = letter; }//demo We doen ingang = NULL; zetervoor ( A,ingang);: ingang A NULL Daarna demo ( B,ingang); met en zonder & voor de parameter ingang. In beide gevallen krijgen we: ingang B NULL 20

Pointers Call by value/reference 2 Maar nu de volgende functie: void demoanders (vakje* ingang) { ingang = NULL; }//demo Met & zal de pointer p (als hij niet NULL was) bij aanroep demoanders (p); veranderen, zonder & niet. NB Dat wat er al dan niet veranderen kan is de pointer. Dat waar de pointer naar wijst kan altijd veranderen! 21

Pointers Pointers en arrays Pointers en arrays hebben veel met elkaar te maken. Stel dat we hebben int A[10]; en int * p;. Dan kun je het volgende doen: p = A; // p wijst A[0] aan p++; // p wijst A[1] aan p++; // p wijst A[2] aan cout << A[2] << " is gelijk aan " << *p << endl; Dus p loopt het array langs, en p++; gaat naar het volgende array-element, waarbij de grootte van (in dit geval) int, sizeof (int) dus, gebruikt wordt als stapgrootte. 22

Pointers Zoeken in pointerlijst class vakje { public: char info; vakje* volgende; };//vakje // Vindt eerste vakje met letter erin (uit lijst met // ingang), als zo n vakje bestaat; anders NULL vakje* vind (char letter, vakje* ingang) { vakje* hulp = ingang; // NIET eerst hulp = new vakje; while ( hulp!= NULL ) if ( letter == hulp->info ) return hulp; // of met bool gevonden... else hulp = hulp->volgende; return NULL; // en geen delete s! }//vind 23

Pointers Zoeken in pointerlijst recursief // Vindt eerste vakje met letter erin (uit lijst met // ingang), als zo n vakje bestaat; anders NULL // nu recursief vakje* vindrecursief (char letter, vakje* ingang) { if ( ingang == NULL ) return NULL; else if ( ingang->info == letter ) return ingang; else // komt letter voor in rest van de lijst? return vindrecursief (letter, ingang->volgende); }//vindrecursief Let op: de functie retourneert een pointer! 24

Pointers Opgave 58 Wat gebeurt er met en zonder &? void tjatja (int* & r, int* & s) { r = new int; *r = 1; *s = 96; }//tjatja int main ( ) { int* p; int* q; p = new int; *p = 3; q = new int; *q = 4; cout << *p << *q << endl; tjatja (p,q); cout << *p << *q << endl; return 0; }//main Met &: 3 4 1 96 Zonder &: 3 4 3(!) 96 25

Pointers Pointerpracticum 1 In het werkcollege (16/17 november 2017) gebruiken we: class vakje { public: int info; vakje* volgende; int* andere; };//vakje ingang 23 18 34 56 NULL info andere volgende www.liacs.leidenuniv.nl/ kosterswa/pm/pmwc10.php 26

Pointers Pointerpracticum 2 En voor een dubbel-verbonden pointerlijst: class element { class lijst { public: private: element* vorige; element* ingang; int info; element* uitgang; element* volgende; public: };//element void afdrukkenva ( );... lijst L; };//lijst L.ingang L.uitgang NULL 19 63 NULL vorige info volgende 27

Pointers Vierde programmeeropgave De Grote getallen programmeren we als volgt: week 1: pointerpracticum, opgave lezen week 2: drie files (makefile), klassen, inlezen, optellen week 3: Fibonacci, vermenigvuldigen, menu week 4: experiment (gnuplot), verslag 28

Pointers Tot slot lees de vierde programmeeropgave en denk na over de klassen de deadline is op vrijdag 8 december 2017 lees Savitch Hoofdstuk 10 lees dictaat Hoofdstuk 3.12 maak opgaven 57/61 uit het opgavendictaat doe het pointerpracticum: werkcollege 10 www.liacs.leidenuniv.nl/ kosterswa/pm/ 29