Uitwerking tentamen Programmeermethoden 5 januari 2009 OPGAVE 1 a. void sort (int A[ ], int n) { int i, ronde, temp; for ( ronde = 1; ronde < n; ronde++ ) for ( i = 0; i < n-ronde; i++ ) if ( A[i] > A[i+1] ) { temp = A[i]; A[i] = A[i+1]; A[i+1] = temp; }//if }//sort b. bool dubbel (int A[ ], int n) { int i; for ( i = 0; i < n-1; i++ ) if ( A[i] == A[i+1] ) return true; return false; }//dubbel c. int plak (int w, int A[ ], int n, int & i1, int & i2) { int i, j; for ( i = 0; i < n; i++ ) if ( A[i] == w ) { i1 = i; i2 = -1; return 1; }//if for ( i = 0; i < n; i++ ) for ( j = i; j < n; j++ ) if ( A[i] + A[j] == w ) { i1 = i; i2 = j; return 2; }//if i1 = -1; i2 = -1; return 0; }//plak d. int serie (int A[ ], int n) { int w = 1, dummy1, dummy2; while ( plak (w,A,n,dummy1,dummy2) != 0 ) w++; return w-1; }//serie OPGAVE 2 a. Globale variabelen gelden in het gehele programma, en worden helemaal bovenin aangemaakt. Locale variabelen gelden (tijdelijk) alleen in de functie waarin ze aangemaakt zijn. Variabelen kunnen call by value en call by reference worden meegegeven aan een functie. Bij call by value gaat alleen de waarde van de parameter naar de functie, alwaar een locale variabele deze waarde opvangt, en er met deze locale variabele wordt verder gerekend. De oorspronkelijk variabele behoudt zijn waarde. Bij call by reference (&) gaat als het ware de variabele zelf naar de functie, en kan dan ook blijvend veranderd worden. Eigenlijk wordt het adres (de reference) doorgegeven. Formeel: in functieheading, bijvoorbeeld x, y in int f (int x, bool y) { ... Actueel: bij aanroep, bijvoorbeeld 7 en y in z = f (7,y); b. 5,3,14,4,1 1 1,14,1,1 c. 5,3,14,4,1 3 7,14,3,0 d. 42 1,12,42 Merk op dat (omdat "een" al true is in if ( een || ... ) de functie xyz niet wordt aangeroepen. e. Mag niet: op de plek van een call by reference parameter hoort een variabele (eigenlijk een l-value), en niet (zoals hier) (int)(y-2*z). OPGAVE 3 a. int hoogste (int bergen[ ][n], int & i, int & j) { int p, q, hoog = -1; for ( p = 0; p < m; p++ ) for ( q = 0; q < n; q++ ) if ( bergen[p][q] > hoog ) { hoog = bergen[p][q]; i = p; j = q; }//if return hoog; }//hoogste b. int zien (int bergen[ ][n], int i, int j) { int p = i-1, totaal = 1; while ( p >= 0 && bergen[p][j] < bergen[i][j] ) { p--; totaal++; } p = i+1; while ( p < m && bergen[p][j] < bergen[i][j] ) { p++; totaal++; } p = j-1; while ( p >= 0 && bergen[i][p] < bergen[i][j] ) { p--; totaal++; } p = j+1; while ( p < n && bergen[i][p] < bergen[i][j] ) { p++; totaal++; } return totaal; }//zien c. int puttop (int bergen[ ][n]) { int i, j, tel = 0; for ( i = 0; i < m; i++ ) for ( j = 0; j < n; j++ ) if ( zien (bergen,i,j) == 1 || zien (bergen,i,j) == m+n-1 ) tel++; return tel; }//puttop OPGAVE 4 a. void verwissel (kand* ingang) { char nm; int cf; //de test ingang->volg != NULL is zinloos ... if ( ingang != NULL && ingang->naam > ingang->volg->naam) { nm = ingang->naam; ingang->naam = ingang->volg->naam; ingang->volg->naam = nm; cf = ingang->cijfer; ingang->cijfer = ingang->volg->cijfer; ingang->volg->cijfer = cf; }//if }//verwissel b. void voegtoe (kand* & ingang, char nm, int cf, kand* & laatste) { kand* nieuw = new kand; nieuw->naam = nm; nieuw->cijfer = cf; nieuw->reserve = NULL; nieuw->volg = ingang; ingang = nieuw; if ( laatste == NULL ) laatste = nieuw; laatste->volg = nieuw; //ook als laatste NULL was }//voegtoe c. void verwijder (kand* & ingang, kand* & laatste) { kand* weg = ingang; if ( ingang != NULL && ingang->cijfer <= 5 ) { if ( ingang->volg == ingang ) { laatste = NULL; ingang = NULL; } else { ingang = ingang->volg; laatste->volg = ingang; } delete weg; }//if }//verwijder d. Bij b en c kunnen (of moeten) de pointers veranderen, dus moet er een & bij. Bij a mag het: de pointer verandert toch niet. e. kand* delaatste (kand* ingang) { kand* p = ingang; kand* q = ingang; if ( ingang != NULL ) { while ( p->volg != ingang ) p = p->volg; do { q->reserve = p; q = q->volg; } while ( q != p ); }//if return p; }//delaatste