Programmeermethoden Talen: Java, Qt, Python,... Walter Kosters week 14: 11 15 december 2017 www.liacs.leidenuniv.nl/ kosterswa/pm/ www.mathworks.com, www.java.com, www.qt.io, www.python.org en www.appinventor.mit.edu 1
Talen Algemeen Naast C ++ (C: Brian Kernighan & Dennis Ritchie, ± 1970; C ++ : Bjarne Stroustrup, ± 1985, nu C ++ 17), wordt ook veel gebruik gemaakt van Java, Python, en MATLAB. En Qt voor interfaces. MATLAB, zelf in C geschreven, is met name goed in allerlei wiskundige operaties: matrices,... ; de taal heeft ook veel grafische mogelijkheden: plotten,... Nadeel: MATLAB is duur. Naast de workspace heb je de command history en de command window. Programma s (scripts) hebben extensie.m. 2
MATLAB Visueel 3
MATLAB De taal MATLAB is een weakly dynamically typed taal. Na >> A = abc ; is A een string, en na >> A = [10 20 30; 7 8 9]; wordt A dan een 2 3 array. Als je de punt-komma aan het eind weglaat, krijg je uitvoer in het commando-venster voor deze regel. Dus: >> A(2,1) ans = 7 4
MATLAB Plotten Stel je wilt de sinus plotten: >> x = 0:pi/100:2*pi; >> y = sin(x); >> plot(x,y) Je kunt namelijk een vector (een 1-dimensionaal array) maken met >> array = 1:2:9 array = 1 3 5 7 9 waarbij initialisatie:stapgrootte:terminator gebruikt wordt. 5
Java Introductie De programmeertaal Java lijkt veel op C ++. Enkele belangrijke verschillen: Java is (nog) meer object-georienteerd Java heeft automatische garbage collection Java heeft (bijna) geen pointers Java is platform-onafhankelijk Java kent applets: WWW-applicaties, met GUI s 6
Java Compileren Hoe compileer je een Java-programma, dat in Iets.java staat? Met javac *.java compileer je al je Java-files naar bytecode, in ons geval naar Iets.class. Deze kan met java Iets op elke computer gedraaid (om precies te zijn: geinterpreteerd) worden met behulp van de Java Virtual Machine (JVM). Dit bovenstaande geldt voor tekst-applicaties. Een applet wordt bekeken met een webbrowser, en je moet dan een aparte HTML-pagina naam.html maken die de bytecode aanroept. Rechtstreeks (zonder browser) kan vaak ook eenvoudig met appletviewer naam.html, zie later. Overigens, Java is iets heel anders dan JavaScript. 7
Java Hello world Maak een file Hello.java met public class Hello { public static void main (String[ ] argv) { System.out.println ("Hello world!"); }//main }//class Hello En dan javac Hello.java en java Hello. Let op: filenaam = naam public klasse (met hoofdletter). Er kunnen meer klasses in een file staan, maar er is er maar één public, en bij diens public static void main begint de executie van het programma. 8
Java Schermuitvoer Met int x = 10, y = 20; System.out.print (x + y); System.out.println (" of toch: " + x + y); krijg je 30 of toch: 1020, gevolgd door een regelovergang, op het beeldscherm te zien, Pas dus op met type-conversies. 9
Java Faculteit 1 En nu een programma Fac.java, met een wat ingewikkelder klasse met twee methodes (member-functies): public class Fac { private static int facul (int n) { if ( n == 0 ) return 1; else return n * facul (n-1); }//facul public static void main (String[ ] argv) { int m = 5; System.out.println (m + "! is " + facul (m)); }//main }//class Fac Let op het woordje static bij de functie-definitie: de functie mag dan aangeroepen worden zonder dat er een object van die klasse is. 10
Java Faculteit 2 En iets aangepast in Fac2.java: public class Fac2 { private int facul (int n) { if ( n == 0 ) return 1; else return n * facul (n-1); }//facul public static void main (String[ ] argv) { int m = 5; Fac2 prog = new Fac2 ( ); System.out.println (m + "! is " + prog.facul (m)); }//main }//class Fac2 Nu maken we met new een object prog van onze klasse Fac2, waarna we van dat object de methode facul (nu niet meer static) aanroepen. Er is geen delete nodig! 11
Java Variabelen Variabelen worden in Java altijd call-by-value doorgegeven. In het bijzonder geldt dit voor int s, double s, char s en boolean s (in C ++ bool s geheten). In geval van klassen wordt er eigenlijk een pointer doorgegeven maar dat weet niemand. Het object waar naar gewezen wordt kan dus wel veranderen! De speciale waarde null wijst naar niks. Er zijn automatische initialisaties. 12
Java Arrays Java kent uiteraard ook arrays. Deze moeten voor gebruik altijd ge-new-ed worden: double A[ ] = new double[25]; // A[0],A[1],...,A[24] int B[ ][ ] = new int[4][3]; // 2-dimensionaal array B Let er op dat de notatie soms net iets van die van C ++ verschilt. Zo mag double [ ] A = new double[25]; ook. In bovenstaand voorbeeld is A.length gelijk aan 25, de lengte van het array. Dus er is geen extra functie-parameter nodig om de array-lengte door te geven. 13
Java Strings Een functie die een string omkeert: public static String keerstringom (String origineel) { char [ ] temp = origineel.tochararray ( ); // converteer originele string naar char-array // er wordt "vanzelf" ge-new-ed! for ( int i = 0; i < temp.length/2; i++ ) { char waarde = temp[i]; temp[i] = temp[temp.length-i-1]; temp[temp.length-i-1] = waarde; }//for return new String (temp); }//keerstringom Deze functie geeft dus eigenlijk een pointer naar een nieuwe string terug. Geen zorgen om delete s! 14
Java Lijsten Hoe gaan pointerlijsten dan in Java je hebt toch geen pointers!? In C ++ : class Vakje { public: int info; Vakje* volgende; };... Vakje* p; p = new Vakje; p->info = 37; In Java: class Vakje { public int info; public Vakje volgende; }... Vakje p; p = new Vakje; p.info = 37; 15
Java Exceptions Als er tijdens het draaien een fout optreedt, wordt er soms een exception gegenereerd. Die kun je opvangen : try {... i = doeiets (i); A[i] = 42;... } catch (IndexOutOfBoundsException ex) { System.out.println ("Foutje... " + ex); }//catch Als zo n exception nergens (ook niet in aanroepende functies) wordt opgevangen, stopt het programma. 16
Java Input Input in Java is iets ingewikkelder georganiseerd: import java.io.*; // net als #include <iostream> in C++ try { String inputstring; int waarde; BufferedReader BR; // net als cin in C++ BR = new BufferedReader ( new InputStreamReader (System.in)); inputstring = BR.readLine ( ); waarde = Integer.parseInt (inputstring); System.out.println (waarde * waarde); BR.close ( ); } catch (Exception ex) { System.out.println (ex); }//catch 17
Java Applet import java.awt.*; import java.applet.*; import java.awt.event.*; public class Muis5 extends Applet //Swing implements MouseListener, MouseMotionListener { public int teller = 0; public void init ( ) { addmouselistener (this); addmousemotionlistener (this); }//init public void paint (Graphics g) { g.setcolor(color.white); g.fillrect(10,10,500,500); }//paint public void mouseclicked (MouseEvent event) { }//mouseclicked public void mousereleased (MouseEvent event) { }//mousereleased public void mousepressed (MouseEvent event) { }//mousepressed public void mouseentered (MouseEvent event) { }//mouseentered public void mouseexited (MouseEvent event) { }//mouseexited public void mousedragged (MouseEvent event) { Graphics g = getgraphics ( ); teller++; switch ( teller % 4 ) { case 0: g.setcolor (Color.red); break; case 1: g.setcolor (Color.green); break; case 2: g.setcolor (Color.black); break; case 3: g.setcolor (Color.blue); break; }//switch g.drawline (event.getx ( ),event.gety ( ), event.getx ( )+10,event.getY ( )+10); }//mousedragged public void mousemoved (MouseEvent event) { }//mousemoved }//Muis www.liacs.leidenuniv.nl/ kosterswa/java/muis.html www.liacs.leidenuniv.nl/ kosterswa/java/sleep.html 18
Java-Qt Event-gestuurd Wat we hier en straks ook in Qt zien is dat de control-flow event-driven (event-gestuurd) is. En dat is anders dan wat we gewend zijn! Een onzichtbare hoofdloop (de event-lus ) loopt eindeloos door. Intussen worden, door events zoals muis-acties af te handelen, de gebruikerswensen vervuld. Dat zijn precies methoden (= memberfuncties) behorend bij bepaalde objecten. 19
Qt Introductie Qt ( cute of ku-tee ; de t komt van toolkit) is een cross-platform ontwikkelomgeving, met een ingebouwde C ++ -bibliotheek. Samenwerken met Java kan ook. Voor niet commercieel gebruik is het gratis. KDE, Google Earth, Skype en VLC zijn erin geschreven. Qt werkt met signals en slots. Als je iets doet, geeft je een signal, dat ergens door een slot wordt opgevangen. 20
Qt Tutorial Hoe leer je Qt? Of Qt Designer? Ga naar een Linux-systeem. Geef in een terminal-window het commando designer & om Qt Designer te starten. 21
Qt Oefening Maak vervolgens een mooie GUI (Grafische User Interface) voor Boter, kaas en eieren. Gebruik daarbij de C ++ -code in boter.cc die hier te vinden is: www.liacs.leidenuniv.nl/ kosterswa/pm/qt.php 22
Qt Handleiding Qt www.liacs.leidenuniv.nl/ kosterswa/pm/qt.php 23
Qt Stappen Het schrijven van zo n programma gaat in drie stappen: 1. bouw een mooie interface; 2. maak een niet-grafisch goed werkend C ++ -programma; 3. plak deze twee in elkaar; gebruik make. Of misschien 1 2? 24
Qt Boter, kaas en eieren 1 class bke { // file boter.h public: char bord[4][4]; // we gebruiken bord[0][.] en bord[.][0] niet char beurt; // wie is aan de beurt: O of X bke ( ); bool gewonnen (char & wie); bool vol ( ); void drukaf ( ); void randomzet ( ); bool magzet (int i, int j); void doezet (int i, int j); char wiemoet ( ); void menszet ( ); };//bke 25
Qt Boter, kaas en eieren 2 Als op knop (i, j) van het speelbord geklikt wordt, moet je een aantal dingen doen: controleren of dit mag (vakje vrij?, spel nog niet afgelopen?); de inhoud (kleur?) van deze knop wijzigen; de zet administreren ; tekst updaten; wellicht een computerzet doen. Probleem is vaak dat alle knoppen bijna dezelfde code hebben, maar dat je lastig informatie kunt doorgeven. Oplossing: maak een extra functie probeerzet (i,j) die als het ware een array is. 26
apps apps En hoe maak je snel een app? Bijvoorbeeld met MIT APP Inventor, zie appinventor.mit.edu/ 27
Python Python Python, ook zeer geschikt voor scripting en prototyping, is ontwikkeld door Guido van Rossum uit Nederland. Er zit veel overlap in met de andere genoemde talen. Voor meer informatie, zie: www.liacs.leidenuniv.nl/ rietveldkfd/courses/prna2017/ Workshop Python speciaal voor studenten Wis- en Natuur/Sterrenkunde nodig voor Diffusie en Praktische Sterrenkunde maandag 29 januari 2018, 10:00 13:00, Snellius 174 28
Python Kenmerken interpreteren, niet compileren: python h.py type van variabele kan eenvoudig wijzigen indentatie NumPy, Matplotlib,... def hello(): print "Hello world!" hello() 29
Python Parameter-overdracht Parameter-overdracht in Python: call-by-object-reference. def vergroot(lijst): lijst += [10,20,30,40] def vernieuw(lijst): lijst = [1000,1001] lijst = [7,8] # een "mutable" object vergroot(lijst) # nu is lijst [7,8,10,20,30,40] vernieuw(lijst) # en nu is lijst nog steeds [7,8,10,20,30,40] 30
Python Sorteren def simpelsort(a): for i in range(len(a)): # Zoek kleinste element in ongesorteerde stuk [i:] kl = i for j, el in enumerate(a[i:]): if el < A[kl]: kl = i + j # Wissel om if i!= kl: A[i], A[kl] = A[kl], A[i] # Test B = [47, 10, 7, 3, 31, 75, 18, 21, 48, 79] simpelsort(b) print B 31
Python Plotten import numpy as np import matplotlib.pyplot as plt # Bepaal de x-coordinaten waarvoor we willen plotten x = np.arange(0, 10, 0.5) # Bereken nu voor elk x-coordinaat de y-waarde # Functie: y = 3x^2 + 5 y = 3 * x * x + 5 # Geef de x- en y-arrays als parameters aan de plot-functie plt.plot(x, y) # Zet de plot op het scherm plt.show() exit(0) 32
Tentamen Opgave 1 Opgave 1 van het tentamen van 9 januari 2006: We hebben een array B met verschillende double s, zoals: 2.0 0.6 3.1 7.2 6.2 6.5. a. Schrijf een C ++ -functie void gk (B,gr,kl,n) die in gr en kl de array-indices van het grootste en kleinste getal van B (met n 2 elementen) oplevert. Er moet precies één for-loop gebruikt worden. (In het voorbeeld: 3 en 1.) b. Schrijf een C ++ -functie int stijgdaal (B,n) die bepaalt hoeveel locale extremen B heeft: array-elementen waarvoor beide directe buren kleiner zijn, of juist beide groter. Eerste en laatste element zijn per definitie ook locale extremen. (Voorbeeld: 5; 3.1 niet.) c. Schrijf een C ++ -functie bool opso (B,n) die bepaalt of B oplopend gesorteerd is. Het array mag alleen met de functies van a en b benaderd worden. (Voorbeeld: false.) d. Schrijf een C ++ -functie int lang (B,n) die bepaalt wat de lengte is van de langste stijgende serie aaneengesloten array-elementen. (Voorbeeld: 3, namelijk 0.6 3.1 7.2.) e. Als c, maar gebruik nu alleen de functie van d. soms ook iets over complexiteit : O(n 2 )... 33
Tentamen Opgave 2 Opgave 2 van het tentamen van 6 januari 2015: a. Bij een functie kun je te maken hebben met call by value en call by reference, en ook met locale en globale variabelen. Verder onderscheiden we ook nog formele en actuele parameters. Leg deze zes begrippen duidelijk uit. b. Gegeven een C ++ -programma met daarin de volgende twee functies: int ludo (int a, int b, int n) { int i = 42; for ( i = 0; i < n; i += 2 ) { b += a; i--; }//for return b; }//ludo int jeanine (int a, int b) { a = ludo (a,b,a); cout << a << "," << b << endl; a = ludo (a,b,a); cout << a << "," << b << endl; return a; }//jeanine Verder zijn de globale variabelen x en y gegeven (van type int). Wat is dan de uitvoer van het volgende stukje programma (leg je antwoord duidelijk uit): x = 2; y = 2; y = jeanine (x,y); cout << x << "," << y << endl; c. Als b, maar nu met een & ( ampersand ) bij de vijf parameters van de functies. d. Geef een eenvoudige uitdrukking voor de return-waarde van een aanroep ludo (a,b,n), uitgedrukt in diens parameters. Het maakt niet uit of er & s bij de parameters staan. e. Als d, maar nu voor jeanine (a,b). Neem aan dat er bij alle vijf parameters een & staat, net als bij c. f. Als in de functie ludo ergens a = jeanine (a,2*n); staat, compileert het programma dan nog? Onderscheid gevallen met en zonder &. 34
Tentamen Opgave 3 Opgave 3 van het tentamen van 2 april 2007: Gegeven is een n bij n (met n een const 2) array kost: int kost[n][n];, gevuld met gehele getallen 0. Een getal kost[i][j] > 0 stelt de kosten voor om rechtstreeks van i naar j te reizen (0 i, j < n en i j), en kost[i][j] = 0 betekent dat er geen directe verbinding is van i naar j. Er geldt kost[i][i] = 0 voor 0 i < n; verder is vanuit iedere plaats minstens één directe reis mogelijk. Als je rechtstreeks van i naar j kunt reizen, kun je ook direct van j naar i; maar misschien verschillen de kosten wel! a. Schrijf een C ++ -functie double gem (kost,i) die bepaalt wat de gemiddelde kosten zijn voor een directe reis vanuit i (0 i < n). Denk eraan te middelen over de niet-nullen. b. Schrijf een functie verschil (kost) die het grootste absolute verschil uitrekent dat je kunt hebben tussen directe reizen van i naar j en j naar i (tussen heen- en terugreizen dus), voor willekeurige i en j. Onderzoek hiertoe alle paren (i, j). c. Schrijf een C ++ -functie hoeveel (kost,i) die bepaalt hoeveel plaatsen je vanuit een zekere i (0 i < n) kunt bereiken, inclusief i zelf, waarbij je zo vaak je wilt mag overstappen. Hint: gebruik een array bool D[n], initieel gevuld met false s (alleen D[i] = true), waar in D[j] moet komen of je j kunt bereiken. 35
Tentamen Opgave 4.1 Opgave 4 van het tentamen van 8 januari 2007: Gegeven is het volgende type: class info { public: info* volgl; info* volgg; char letter; int getal; }; Met behulp hiervan worden rijtjes (lijstjes) met letter-getal combinaties opgebouwd; alle gebruikte letters en getallen verschillen onderling. Het veld volgl bevat een pointer naar het info-object met de eerstvolgende alfabetisch grotere letter (of NULL), het veld volgg een pointer naar het object met het eerstvolgende grotere getal (of NULL). Een voorbeeld (ingang van type info*; deze wijst steeds het object met het kleinste getal aan), waarbij volgg de meest rechtse pointer in ieder object is: ingang F 16 NULL B 42 A 44 D 66 NULL Het object met B en 42 erin heeft hier een pointer volgl naar het object met D en 66, en een (horizontale) pointer volgg naar het object met A en 44. a. Schrijf een C ++ -functie voegtoe (ingang,let,get) die een nieuw object met getal get en letter let erin vooraan de structuur (met ingang van type info* als ingang) toevoegt. Neem aan dat het eerste getal uit de oude lijst groter is dan get. Maak de nieuwe volgl-pointer NULL, en verander (nog) niets aan de andere volgl-pointers. 36
Tentamen Opgave 4.2 Opgave 4 van het tentamen van 8 januari 2007, vervolg: b. Schrijf een C ++ -functie verwijder (ingang) die het eerste object uit de lijst (met ingang van type info* als ingang) verwijdert indien in dat vakje niet de letter D en het getal 66 zitten. Denk aan de lege lijst. Verander niets aan volgl-pointers. c. Schrijf een C ++ -functie verwissel (ingang) die eerste en tweede (via de volggpointer) object verwisselt (dus niet de inhouden), indien deze bestaan en het getal uit het eerste object groter is dan dat uit het tweede, en anders niets doet. d. In de functies bij a, b en c staat in de heading de parameter ingang. Deze heb je call by value of call by reference doorgegeven (met een &). Maakt het voor de werking van deze functies verschil uit of die & erbij staat? Leg duidelijk uit. e. Vul de functie voegtoe van a aan zodat na afloop alle volgl-pointers goed staan. Neem aan dat er minstens één letter < let in de lijst voorkomt. Tip: zoek de grootste kleinere. 37
Tentamen Oud tentamen: 14.12.2017 Werkcollege Programmeermethoden 14 december 2017 Zalen: 174, 412 en 402 Tentamen vrijdag 4 januari 2013 1. In een array int A[n] staan n (een const > 0) verschillende gehele getallen. a. Schrijf een C ++ -functie klein (A,i,kl,n) die de array-index van het kleinste getal uit A[i], A[i+1],..., A[n-1] in de parameter kl oplevert. Neem aan dat 0 i < n. NB Geef hier (en ook in de andere opgaven) de compleet ingevulde heading van de functie! b. Schrijf een Booleaanse C ++ -functie gesorteerd (A,i,n) die precies dan true teruggeeft als A[i] < A[i+1] <... < A[n-1], en anders false. Neem weer aan dat 0 i < n. c. Schrijf een C++-functie sorteer (A,n) die het array A oplopend sorteert door herhaald te kijken of het steeds kleiner wordende staartstuk al gesorteerd is, zo ja te stoppen, en zo nee het kleinste getal van het nog resterende gedeelte met het voorste te wisselen. Gebruik de functies van a en b. d. Hoeveel vergelijkingen tussen array-elementen doet sorteer minimaal? Tel hierbij zowel de vergelijkingen die in de aanroepen van klein als in die van gesorteerd worden gedaan. In welk(e) geval(len) gebeurt dit? e. En hoeveel vergelijkingen tussen array-elementen doet sorteer maximaal? 2.a. Bij een functie kun je te maken hebben met call by value en call by reference, en ook met locale en globale variabelen. Verder onderscheiden we ook nog formele en actuele parameters. Leg deze zes begrippen duidelijk uit. b. Gegeven een C ++ -programma met daarin de volgende twee functies: bool mark (int a, int b) { int z; a = a + b; b = a - b; a = a - b; cout << "M" << a << "," << b << endl; z += 10; return ( a < b ); }//mark int diederik (int b, int a) { bool temp; if ( mark (b,a) ) a += 2; while ( a > 0 ) { temp = mark (a,b); a--; cout << a << "," << b << endl; } z += 10; return ( a + b + 2); }//diederik Verder zijn de globale variabelen x, y en z gegeven (van type int). Wat is dan de uitvoer van het volgende stukje programma (leg je antwoord duidelijk uit; tip: 9 komma s): x = 1; y = 3; z = 1; x = diederik (y,z); cout << x << "," << y << "," << z; c. Als b, maar nu met een & ( ampersand ) bij de vier parameters van de functies. d. Als c, dus met vier & s erbij, voor: x = 1; y = 3; z = 1; y = diederik (y,y); cout << x << "," << y << "," << z; e. Als in de functie mark ergens a = diederik (static_cast<int>(mark (a,b)),y); staat, compileert het programma dan nog? Onderscheid gevallen met en zonder &. 3. Gegeven is een m bij m (een const > 0) Booleaans array T. Hierbij geeft T[i][j] aan of er een rechtstreekse trein van station i naar station j rijdt (true) of niet (false). Er gaat nooit een directe trein van een station naar zichzelf. 1 false false true true false true false true false a. Schrijf een C ++ -functie int duos (T) die berekent hoeveel duos (i, j) met 0 i < j < m er in T zijn, waarvoor geldt dat er zowel een rechtstreekse trein van i naar j is als van j naar i. In het voorbeeld: 1, namelijk (1, 2). b. Schrijf een C++-functie int druk (T) die het station met de meeste in- en uitgaande directe verbindingen geeft. Als er meer stations met deze eigenschap zijn, geef dan dat met het hoogste nummer. In het voorbeeld: station 2 (3 directe verbindingen, net als 1). c. Schrijf een Booleaanse C++-functie bereik (T,i,j) die precies dan true teruggeeft als je j vanuit i kunt bereiken met één overstap. Of er ook nog een rechtstreekse verbinding is, doet er niet toe. Neem aan dat 0 i, j < m en i j. d. Schrijf een C++-functie int aantal (T,i) die bepaalt hoeveel stations je, beginnende in station i, als volgt bezoekt, totdat je niet meer verder kunt. Je gaat steeds, met precies één overstap (gebruik de functie van c) naar het eerstvolgende station met een hoger nummer. In het voorbeeld: vanuit i = 1 reis je (met overstap in 0) naar 2, en klaar, met 2 bezochte stations. De stations waar je overstapt worden niet meegeteld. 4. Gegeven is het volgende type: class element { public: int info; element* rechts; element* onder; }; Hiermee wordt een graaf-achtige structuur gemaakt. Het veld rechts bevat een pointer naar het eerstvolgende rechts ernaast gelegen element-object. De onder-pointer (steeds het middelste vakje in het voorbeeld) wijst naar het er direct onder gelegen elementobject. Neem aan dat er maximaal twee rijen zijn, en dat boven elk object uit de tweede rij altijd precies één object uit de eerste zit. Een voorbeeld (begin van type element*): vanmiddag in zalen 174, 412, 402 begin 314 5678 NULL 2013 NULL 42 512 NULL NULL 39 NULL NULL a. Schrijf een C++-functie verwijder (begin) die het eerste element-object uit de structuur (met begin van type element* als ingang) netjes verwijdert, mits dat object bestaat. Als er een element-object onder is, moet dit eerst worden verwijderd. In het voorbeeld moeten de objecten met 5678 en 314 erin verwijderd worden. b. Schrijf een C ++ -functie voegtoe (begin,getal) die een nieuw element-object met getal erin vooraan de structuur met ingang begin toevoegt mits de structuur leeg is, of het voorste getal uit de structuur even is (zoals in het voorbeeld). c. Schrijf een C ++ -functie voegtoe2 (begin,getal) die een nieuw element-object met getal erin onder het eerste object van de structuur met ingang begin toevoegt mits dat eerste object bestaat, en daar nog geen object onder zit, en anders niets doet. Zet de rechts-pointer voorlopig op NULL. d. In de functies bij a, b en c staat in de heading een pointer. Deze heb je call by value of call by reference doorgegeven (met een &). Maakt het voor de werking van deze functies verschil uit of die & erbij staat? Mag het, moet het? Leg duidelijk uit. e. Schrijf een C ++ -functie zetrechts (begin) die alle rechts-pointers in de tweede rij goed zet, ongeacht wat hun waardes waren. Denk aan de laatste! Zie www.liacs.leidenuniv.nl/ kosterswa/pm/ voor meer vragen en antwoorden! 2 38
Programmeermethoden Tot slot werk wellicht nog aan de vierde programmeeropgave de deadline is al voorbij! donderdag 14 december s middags: werkcollege met oude tentamens (NIET op 15 december) in zalen 174, 412 en 402 tentamen: woensdag 3 januari 2018, 14.00 17.00 uur, Snellius (recht op extra tijd: zaal B1) hertentamen: donderdag 15 maart 2018, 14:00 17:00 uur, Snellius www.liacs.leidenuniv.nl/ kosterswa/pm/ 39