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

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

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

Programmeermethoden NA

Programmeermethoden NA. Week 4: Files & Functies

Programmeermethoden NA. Week 5: Functies (vervolg)

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

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

C``ifPCwhileLinuxdiffintFirefoxboolpublicprivateWindows. fileg``unixvisualosfedoralscharpsopenclosegetputarray

Programmeermethoden NA. Week 5: Functies (vervolg)

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

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

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

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

Datastructuren: stapels, rijen en binaire bomen

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

XPcpelmmuttelsecoutmainRedHatmkdireditorenumDebian. classusingmathunitytruecpsusenamespacestructinclude

C``ifPCwhileLinuxdiffintFirefoxboolpublicprivateWindows. fileg``unixvisualosfedoralscharpsopenclosegetputarray

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

Cursus Algoritmiek najaar 2005

XPcpelmmuttelsecoutmainRedHatmkdireditorenumDebian. classusingmathunitytruecpsusenamespacestructinclude

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

Datastructuren: stapels, rijen en binaire bomen

Object-geOriënteerd Programmeren & Life

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

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

Programmeermethoden NA. Week 6: Lijsten

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

PROS1E1 Gestructureerd programmeren in C Dd/Kf/Bd


Programmeermethoden NA. Week 3: Controlestructuren

Programmeermethoden NA

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

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

9 Meer over datatypen


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

Datastructuren Werkcollege Intro

10 Meer over functies

Toetsvoorbereiding Informatica HAVO/VWO 5 (T51) Programmeren met Python II. Duur: 70 minuten Datum: sept 2018

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

Online c++ leren programmeren:

HomeOffice to ASCII Teksten converteren

Een korte samenvatting van enkele FORTRAN opdrachten

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

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

Inleiding Programmeren in C++

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

VOORBLAD SCHRIFTELIJKE TOETSEN

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

Inleiding Programmeren in C++

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

Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby?

Small Basic Programmeren Text Console 2

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

Informatie over. 5VWO DT51: JavaLogo. Casper Bezemer. Toetsweek 1 13 oktober 2016

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

C++ programmeermethoden Bachelor Kunstmatige Intelligentie

17 Operaties op bits Bitoperatoren en bitexpressies

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

Hoofdstuk 0. Van Python tot Java.

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

Controle structuren. Keuze. Herhaling. Het if statement. even1.c : testen of getal even of oneven is. statement1 statement2

Wortels met getallen en letters. 2 Voorbeeldenen met de (vierkants)wortel (Tweedemachts wortel)

VOORBLAD SCHRIFTELIJKE TOETSEN

Python voor Natuur- en Sterrenkundigen Week 1

Disclaimer Het bestand dat voor u ligt, is nog in ontwikkeling. Op verzoek is deze versie digitaal gedeeld. Wij willen de lezer er dan ook op wijzen

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

Waarden persistent (blijvend) opslaan gaat in bestanden (files). Lege tekst: eof

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Instructies en blokken

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

WISNET-HBO. update aug. 2011

Introductie in C++ Jan van Rijn. September 2013

2.1 Bewerkingen [1] Video Geschiedenis van het rekenen ( 15 x 3 = 45

Inhoudsopgave Voorwoord 5 Voordat je begint 6 Wat heb je nodig? 7 De website bij het boek 7 Voor ouders, verzorgers en leraren

Faculteit Economie en Bedrijfskunde

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

Wouter Geraedts Processen & Processoren

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Wat is scripting?

Breuken met letters WISNET-HBO. update juli 2013

Algemeen. Rorschachtest. Algemene info

Computerspellen in soorten en maten

Breuksplitsen WISNET-HBO NHL. update juli 20014

Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00

Java Les 3 Theorie Herhaal structuren

Ziv-Lempel-Welch Compressie

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

Functies. Huub de Beer. Eindhoven, 4 juni 2011

Tentamen Programmeren in C (EE1400)

Programmeeropdracht 2 Toernooi Algoritmiek, voorjaar 2019

SEQUENTIE-STRUCTUUR. Oefening: Dichtheid

Oefententamen 2. Tijd: 2 uur. Maximaal aantal punten: 30. Naam: Studentnummer:

1.3 Rekenen met pijlen

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

Cursus Algoritmiek --- najaar 2005

Programmeeropdracht 1 Mastermind Algoritmiek, voorjaar 2019

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

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Transcriptie:

Programmeermethoden Files & functies Walter Kosters week 4: 26 30 september 2016 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1

Files Introductie En dan nu eerst: files. Input en output voor programma s staan vaak in files, bijvoorbeeld iets.cc, uitvoer.txt, cin (toetsenbord) en cout (beeldscherm). Voor de tweede programmeeropgave moet je een C ++ - programma schrijven dat een geheime boodschap uit een file haalt of er juist in stopt. 2

Files Algemeen #include <fstream>... ifstream invoer ("jefile.txt", ios::in); ofstream uitvoer ("./C++/iets.cc", ios::out); char letter; // zelfs / bij Windows!!... letter = invoer.get ( ); uitvoer.put (letter); uitvoer << "Hitchcock";... invoer.close ( ); uitvoer.close ( ); 3

Files Theorie Een file is een object van klasse ios. Ook cin en cout zijn van deze klasse. Met objecten kun je bepaalde dingen doen: memberfuncties (= methoden ) aanroepen, zoals get. Je zegt dan de naam van het object, dan een punt, en dan de naam van de methode. Voorbeelden: letter = invoer.get ( ); cout.put (letter); Eigenlijk is een invoerfile van klasse (= type) ifstream, en een uitvoerfile van klasse ofstream. Beide stammen af van ios. En get en put zijn (member)functies. 4

Files Tekstfile kopiëren Een tekstfile, zoals een C ++ -programma, bestaat uit regels, gescheiden door regelovergangen (bij UNIX LF, bij Windows CR-LF). Meestal staat aan het eind ook een regelovergang, gevolgd door het einde-file (EOF) symbool. Op dat laatste kun je testen met de methode eof ( ). Zo kopiëren we een file invoer naar een file uitvoer: kar = invoer.get ( ); // eerst get-ten!!! while (! invoer.eof ( ) ) { uitvoer.put (kar); kar = invoer.get ( ); // en hier de volgende... }//while Het lijkt alsof er één get meer wordt gedaan dan put s, maar de close zet als het ware de als laatste gelezen EOF. (Eigenlijk is dit het UNIX-commando cp.) 5

Files Kopiëren aanpassen Wijzig stap voor stap zo n kopieerprogramma: kar = invoer.get ( ); while (! invoer.eof ( ) ) { if ( kar!= \n ) // wijzig dit voor de uitvoer.put (kar); // tweede programmeeropgave kar = invoer.get ( ); }//while Dit kopieert, maar sloopt alle regelovergangen weg. Meer get s zijn niet nodig! 6

Files Filepointer Eigenlijk werken files met filepointers, net als bij oude video-banden. Voorlopig kun je alleen maar vooruit spoelen. Een put zet een karakter neer en schuift de filepointer één op, get pakt een karakter en schuift de filepointer ook op. >> j a put een s >> j a s 7

Files Details Iets algemener: string filenaam; // gebruik <string> ifstream invoer; // gebruik <fstream>... cin >> filenaam; invoer.open (filenaam.c_str ( )); //!!! if ( invoer.fail ( ) ) { cout << filenaam << " niet te openen" << endl; return 1; // of exit (1); }//if PS En files doorgeven als parameter: void doewat (ifstream & invoer, ofstream & uitvoer)... 8

Files & functies 2e programmeeropgave: Netjes Voor de tweede programmeeropgave moet je nu een C ++ - programma schrijven dat iets met een file doet: if ( leeftijd > 60/2 ) {{ // ah{a cout << "Oud";// of niet? } moet worden (waarbij een spatie voorstelt; tab = 3 ): if ( leeftijd > 60/2 ) {{ cout << "Oud"; En is 196 een Lychrel-getal? www.liacs.leidenuniv.nl/ kosterswa/pm/op2pm.php 9

Files & functies 2e programmeeropgave 196 is dit (waarschijnlijk) 18). Als dit laatste gebeurt, wordt dit erbij vermeld. Elke directe opeenvolging van cijfers in de invoerfile wordt als een geheel getal opgevat. Neem aan dat ze alle kleiner dan of gelijk aan INT_MAX zijn. Zo bevat 123abcd-"qqq 5"+++uvw-77.88ddd//vb5656 de gehele getallen 123, 5, 77 en 88. Het maakt verder ook niet uit of een getal al dan niet binnen een string staat, het telt gewoon mee. Getallen binnen commentaar worden niet gedaan. Programmeermethoden 2016 Tweede programmeeropgave: Netjes De tweede programmeeropgave van het vak Programmeermethoden in het najaar van 2016 heet Netjes: het gaat over netjes afdrukken; zie ook het vierde werkcollege, vijfde werkcollege (de betreffende WWW-bladzijde bevat handige tips evenals testfiles te zijner tijd!) en zesde werkcollege, en lees geregeld deze pagina op WWW. Spreek/Vragenuur in zalen 302... 309: dinsdag 27, donderdag 29 september, dinsdag 4, donderdag 6, dinsdag 11, donderdag 13 oktober 2016, van circa 15:30 tot 17:00 uur; en vrijdag 14 oktober 2016, vanaf ongeveer 11:15 uur. I&E-studenten (Den Haag) Vragenmiddag in zaal Paleistuin/Malieveld op donderdag 13 oktober 2016, 14:45-17:30 uur. Er moet een programma worden geschreven dat een foutloos te compileren C++-programma (bijvoorbeeld een uitwerking van de eerste programmeeropgave) een klein beetje probeert te begrijpen, oftewel een paar zaken doet die een compiler ook moet doen. Het programma moet de invoerfile netjes ingesprongen naar een uitvoerfile kopiëren, en daarbij alle //-commentaar weglaten. Verder moet het programma getallen opsporen, en kijken of deze een speciale eigenschap hebben. Stel eenvoudige vragen om gegevens van de gebruiker te weten te komen. Het programma leest dan eenmalig de opgegeven invoerfile, en schrijft deze symbool voor symbool op de juiste wijze aangepast weg naar de uitvoerfile; tijdens dit proces wordt om de zoveel regels een rapportje op het scherm afgedrukt. De volgende drie punten moeten worden gedaan: 1) Commentaar moet verwijderd worden. Elk commentaar dat begint met // moet niet naar de uitvoerfile worden weggeschreven, maar weggelaten worden. Alleen de regelovergang wordt weer naar de uitvoerfile gekopieerd. Voor het gemak mag aangenomen worden dat er geen /*... */ commentaar voorkomt. Als er binnen //-commentaar opnieuw // voorkomt, wordt die volgende // ook gewoon verwijderd. We vatten zelfs // binnen een string op als het begin van commentaar. 2) Inspringen moet netjes geregeld worden. De bedoeling is dat iedere regel op diepted even ver inspringt, en wel tab maal d spaties. Hierbij is tab een door de gebruiker te kiezen getal, bijvoorbeeld 3. De diepte d van een regel wordt als volgt bepaald. De eerste regel van het programma is op diepte 0, iedere openingsaccolade { verhoogt de diepte met 1 (één) en iedere sluitaccolade } verlaagt de diepte met 1 (één). Een veranderde diepte merk je pas op de volgende regel (zie verderop hoe we accolades zelf afhandelen). We nemen aan dat er geen accolades binnen strings (of als karakter '{') voorkomen. Accolades die binnen commentaar staan tellen niet mee voor de berekening van de diepte. De oude regelstructuur van het programma blijft behouden; voor iedere regel geldt dat het eerste karakter ongelijk spatie en TAB ('\t') op positie tab maal d +1 moet komen. Dit karakter kan een regelovergang zijn; zo wordt een oorspronkelijk "lege" regel op diepte d nu een regel met tab maal d spaties, en een regelovergang. Wellicht ten overvloede, een regel met een stel spaties en TAB's, en dan verder alleen //-commentaar, komt als tab * d spaties in de uitvoerfile. We nemen aan dat de accolades netjes gepaard zijn. En op welke positie staat een accolade, als dit het eerste symbool is dat op een regel wordt afgedrukt? We spreken af dat als dit een openings-accolade is hiervoor nog de "oude" diepte wordt gebruikt, en voor een sluit-accolade de "nieuwe". We krijgen dus (waarbij een punt (.) een spatie voorstelt; tab = 3, d = 2):...if ( x == y )...{...z = 0;...} 3) Lychrel-getallen moeten worden opgespoord. Voor elk geheel getal > 0 uit de invoerfile wordt gekeken of het een Lychrel-getal is. Op het scherm wordt afgedrukt wat het aantal iteraties is om tot een palindroom te komen (voor 545 is dit 0, voor 113 is dit 1), of het nummer van de iteratie waarvan het resultaat boven INT_MAX (gebruik include <climits>) uitkomt (voor Om de zoveel regels en na afloop moeten op het scherm enkele "statistieken" afgedrukt worden, namelijk het totaal aantal ingelezen karakters (inclusief regelovergangen, spaties en dergelijke), het aantal in de uitvoerfile afgedrukte karakters en het maximale aantal iteraties voor Lychrel-berekeningen met het bijbehorende getal (het laatste als het meer keren hetzelfde maximum was). Aan de gebruiker wordt vooraf gevraagd hoe de originele invoerfile en de "doelfile" heten (als de invoerfile niet bestaat stopt het programma direct), hoe groot tab moet worden en om de hoeveel regels statistieken moeten worden afgedrukt (bijvoorbeeld 20). Ter verdere inspiratie, zie het vijfde werkcollege, ook voor voorbeeldfiles. Let op: files van websites kopiëren door met rechter muisknop op de links te klikken, anders (met markeer-copy-paste) gaan spaties/tabs wellicht fout! Opmerkingen We nemen aan dat de gebruiker zo vriendelijk is verder geen fouten te maken bij het invoeren van gegevens. Gebruik zonodig de regelstructuur: elke regelovergang in een bestand bestaat uit een LineFeed (\n)(in UNIX) of een CarriageReturn gevolgd door een LineFeed (\r\n)(in Windows). Normaal gesproken gaat dit "vanzelf" goed. We nemen aan dat er voor het EndOfFile-symbool (wat dat ook moge zijn) een regelovergang staat. Alleen voor de namen van de files mag een array (of string) gebruikt worden; voor het lezen en verwerken van de tekst is slechts het huidige karakter en enige kennis over de voorgaande karakters nodig zie boven. Alleen de headerfiles iostream, climits en fstream mogen gebruikt worden, en string voor de filenamen (denk daar aan het gebruik van c_str). Uit een file mag alleen met invoer.get (...) gelezen worden, vergelijk Hoofdstuk 3.7 uit het dictaat, gedeelte "aantekeningen bij de hoorcolleges". Er staan zo weinig mogelijk get's in het programma: vergelijk het voorbeeldprogramma uit dit hoofdstuk (daar staat twee keer get, één maal vóór de loop, uiteraard). Wat overigens ook kan, is als je commentaar hebt gedetecteerd, meteen in een while-loopje de rest van de regel weglezen; maar misschien is dat minder elegant. Karakters mogen niet worden teruggezet in de oorspronkelijke file. Schrijf zelf functies die testen of een karakter een cijfer is, etcetera. Er mogen geen andere functies dan die uit fstream gebruikt worden, en c_str. Denk aan het infoblokje dat aan begin op het scherm verschijnt: geef informatie over jezelf en het programma aan de gebruiker. Gebruik enkele geschikte functies, bijvoorbeeld voor infoblokje, inlezen gegevens van de gebruiker en de Lychrel-test (zie de tips bij het vijfde werkcollege). En voor het omzetten van de files. De functie main mag maximaal 2 regels hebben (waarvan return 0; er één is). Globale variabelen zijn streng verboden. Ruwe indicatie voor de lengte van het C++-programma: circa 200 regels. Uiterste inleverdatum: vrijdag 14 oktober 2016, 17:00 uur. Manier van inleveren: 1. Digitaal de C++-code inleveren: stuur een email naar pm@liacs.leidenuniv.nl. Stuur geen executable's, lever alleen de C++-file digitaal in! Noem deze bij voorkeur ruttesamsom2.cc, dit voor de tweede opdracht van het duo Rutte-Samsom. De laatst voor de deadline ingeleverde versie wordt nagekeken. 2. En ook een papieren versie van het verslag (inclusief de C++-code) deponeren in de speciaal daarvoor bestemde doos "Programmeermethoden" in de postkamer van Informatica, kamer 156 van het Snelliusgebouw. I&E-studenten (Den Haag) mogen de pdf-versie per email meesturen. Overal duidelijk datum en namen van de (maximaal twee) makers vermelden, in het bijzonder als commentaar in de eerste regels van de C++-code. Lees bij het zesde werkcollege hoe het verslag eruit moet zien en wat er in moet staan. Te gebruiken compiler: als hij maar C++ vertaalt; het programma moet in principe zowel op een Linux-machine (met g++) als onder Windows met Code::Blocks draaien. Test dus in principe op beide systemen! Normering: layout 2; commentaar 2; overzichtelijkheid/modulariteit/functies 2; werking 4. Eventuele aanvullingen en verbeteringen: lees deze WWW-bladzijde: www.liacs.leidenuniv.nl/~kosterswa/pm/op2pm.php. www.liacs.leidenuniv.nl/ kosterswa/pm/op2pm.php 10

Introductie Een functie is een zwarte doos (black box) waar iets in gaat en iets (anders) uit komt. Elk C ++ -programma bestaat uit een verzameling functies. Executie begint bij de functie main. Sommige functies rekenen iets uit (zoals int-functies: geef het kwadraat van x), andere verrichten een taak (een voidfuncties: druk een tabel af op het scherm; of afwassen). Functies hebben allerlei (soorten) parameters. Functies mogen alleen functies aanroepen die eerder gedefinieerd zijn. 11

Voorbeeld Een eenvoudige void-functie: void tekstopscherm ( ) { cout << "Sterke tekst." << endl; }//tekstopscherm En een eenvoudige int-functie: int inhoud (int l, int b, int h) { return l * b * h; }//inhoud Met aanroepen: tekstopscherm ( ); cout << inhoud (16,37,42) << endl; 12

Werking Hoe werkt het functie-mechanisme? Bij aanroep spring je naar de desbetreffende functie, en als die klaar is, wanneer je een return of de laatste } tegenkomt, spring je weer terug, en wel naar het returnadres. Parameters worden netjes doorgegeven. Soms helpt het als je niet aan het springen denkt, maar meer denkt in termen van deze functie verricht die taak. Eigenlijk komen functie-aanroepen op een stapel gevuld met uitgestelde verplichtingen. 13

Variabelen // bereken inhoud van l bij b bij h blok double inhoud (double l, double b, double h) { double temp; temp = l * b * h; return temp; }//inhoud Hier zijn l, b, h en temp locale variabelen, waarbij l, b en h (de formele parameters) als startwaarde de waarde van de actuele parameters krijgen; ze worden wel geinitialiseerd, in tegenstelling tot temp. Hun scope waar ze leven is de functie inhoud. Men noemt l, b en h wel call by value parameters. Bij een aanroep als t = inhoud (b,5,x); zijn b, 5 en x de actuele parameters (of variabelen). 14

Schrikkel De volgende functie bepaalt of jaar een schrikkeljaar is: bool schrikkel (int jaar) { return ( jaar % 4 == 0 && ( jaar % 400 == 0 jaar % 100!= 0 ) ); }//schrikkel Dus 1963 niet, 2016 wel, 2017 niet, 2000 wel, en 2100 niet... 15

ggd De grootste gemeenschappelijke/gemene deler (ggd) van twee positieve gehele getallen ( 0, niet beide 0) wordt met het algoritme van Euclides als volgt berekend: int ggd (int x, int y) { int rest; while ( y!= 0 ) { rest = x % y; x = y; y = rest; }//while return x; }//ggd Voorbeeldaanroepen: cout << ggd (15,21) << endl; z = ggd (z,7); // z van type int 16

Vraag Een functie kan maar één waarde retourneren = teruggeven. (Of zelfs geen, bij een void-functie.) Hoe kun je dan twee of meer waarden doen? Antwoord: met call by reference, let op de &. Overigens: een void-functie hoeft geen return-statement te hebben, maar het mag wel. Er staat dan geen waarde achter, dus gewoon return; stopt zo n functie. 17

Vereenvoudigen // vereenvoudig breuk teller/noemer zoveel mogelijk // aanname: teller >= 0, noemer > 0 void vereenvoudig (int & teller, int & noemer) { int deler = ggd (teller,noemer); if ( deler > 1 ) { // test hoeft niet teller = teller / deler; noemer = noemer / deler; }//if }//vereenvoudig Voorbeeldaanroep: int tel = 15, noem = 21; vereenvoudig (tel,noem); cout << tel << " " << noem << endl; 18

Commentaar Boven iedere functie hoort duidelijk commentaar: // vereenvoudig breuk teller/noemer zoveel mogelijk // aanname: teller >= 0, noemer > 0 void vereenvoudig (int & teller, int & noemer) {... }//vereenvoudig Tip: maak een zin waarin de functienaam en de namen van de parameters voorkomen. En: wat geldt vooraf, en wat na afloop? 19

Call by reference Naast call by value, waar de waarde van de variabele aan een lokale kopie wordt doorgegeven, bestaat ook call by reference, waar de variabele zelf, of preciezer: diens adres, wordt doorgegeven. void wissel (int & a, int & b) { int hulp = a; a = b; b = hulp; }//wissel Voorbeeldaanroep: a = 8; k = 2; wissel (a,k); De & (ampersand) geeft aan dat het een call by reference variabele betreft. 20

Wisselen in C In C, dat alleen call by value heeft, moet je wissel als volgt schrijven (zie later): void wissel (int *a, int *b) { int hulp = *a; // *a is de int waar a naar wijst *a = *b; *b = hulp; }//wissel Voorbeeldaanroep, waarbij &a het adres van a betekent: a = 8; k = 2; wissel (&a,&k); NB De functie mag weer wissel heten, omdat de types van de parameters anders zijn; dit fenomeen heet overloading. 21

Wisseltruc Merk op dat a = b; b = a; niet werkt! Blijkbaar heb je een hulpvariabele nodig. Of toch niet: void wisseltruc (int & a, int & b) { a = a + b; // a = a_oud + b_oud b = a - b; // b = a_oud a = a - b; // a = b_oud }//wisseltruc De aanroep wisseltruc (x,x) maakt helaas x gelijk aan 0. En deze getructe functie mag overigens geen wissel heten. 22

Voorbeeld call by value void hoogop (int x) { x = x + 10; cout << x; }//hoogop void maaknul (int t) { t = 0; cout << t; }//maaknul int x, m, q; x = 7; hoogop (x); cout << x; m = 3; hoogop (m+8); cout << m; q = 5; maaknul (q); cout << q; maaknul (42); 17 7 21 3 0 5 0 Er wordt alleen een waarde doorgegeven, en wel van de actuele parameter aan de formele parameter; er wordt dus een lokale kopie gemaakt, wat tijd en ruimte kost. 23

Voorbeeld call by reference void hoogop (int & x) { x = x + 10; cout << x; }//hoogop void maaknul (int & y) { y = 0; cout << y; }//maaknul int x, m, q; x = 7; hoogop (x); cout << x; m = 3; hoogop (m+8); // VERBODEN!!! q = 5; maaknul (q); cout << q; maaknul (42); // VERBODEN!!! 17 17 0 0 Er wordt nu een adres (een pointer) doorgegeven. De actuele parameter kan nu wel veranderen. De actuele parameter mag geen rare expressie als m+8 of 42 zijn. Er wordt alleen een adres gekopieerd. 24

Tot slot werk aan de tweede programmeeropgave de deadline is op vrijdag 14 oktober 2016 lees Savitch Hoofdstuk 3 en 4, en 12.1/2 lees dictaat Hoofdstuk 3.6, 3.7 en 4.1 maak opgaven 11/17 uit het opgavendictaat www.liacs.leidenuniv.nl/ kosterswa/pm/ 25