Uitwerkingen Tentamen Inleiding Programmeren in C++ voor LS&Ters vrijdag 14 maart 2003 OPGAVE 1 a. int rondaf (double x) { return (int)(x + 0.5); } // rondaf b. int wortel (double x) { int root = 0; while ( root * root <= x ) root++; return (root - 1); } // wortel c. Binair zoeken ... zie dictaat ... Binair zoeken werkt alleen indien het array (oplopend) gesorteerd is. Het doet dan maximaal circa log n vergelijkingen in plaats van (maximaal) n voor lineair zoeken. Je vergelijkt de gezochte X eerst met het (ongeveer) middelste array-element, stopt als dat X is, en als X kleiner is ga je in het "linker" array-gedeelte verder, anders in het "rechter" gedeelte; enz. d. int verschil (int A[10], int B[10]) { int tel = 20; int i, j; for ( i = 0; i < 10; i++ ) for ( j = 0; j < 10; j++ ) if ( A[i] == B[j] ) tel--; return tel; } // verschil OPGAVE 2 a. bool ispiek (int A[ ], int i) { return ( i == 0 || A[i] > A[i-1] ) && ( i == n-1 || A[i] > A[i+1] ); } // ispiek b. int pieken (int A[ ], int n) { int i, tel = 0; for ( i = 0; i < n; i++ ) if ( ispiek( A,i) ) tel++; return tel; } // pieken c. int dalen (int A[ ], int n) { int aantal = pieken (A,n) - 1; if ( ! ispiek (A,0) ) aantal++; if ( ! ispiek (A,n-1) ) aantal++; return aantal; } // dalen d. bool gesorteerd (int A[ ], int n) { return ( pieken (A,n) == 1 && dalen (A,n) == 1 ); } // gesorteerd OPGAVE 3 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. b. Jules 10 6 Jules 10 8 Jules 0 10 Wallace 0 10 4 0 10 c. 10 keer Jules 10 6 Wallace 10 4 11 10 4 d. keer loopt als het waarde steeds verder weg, zodat de for-lop nooit beeindigd wordt e. Het is geen recursie (tenzij het statement in de functie wallace zelf staat). Het mag alleen als beide variabelen van wallace call by value (zonder &) zijn! OPGAVE 4 a. int lengte (char bord[10][10]) { int tel = 0; int i, j; for ( i = 0; i < 10; i++ ) for ( j = 0; j < 10; j++ ) if ( bord[i][j] != ' ' ) tel++; return tel; } // lengte b. zoek (char bord[10][10], char X, int & i, int & j) { int r, s; for ( r = 0; r < 10; r++ ) for ( s = 0; s < 10; s++ ) if ( bord[r][s] == X ) { i = r; j = s; } // if } // zoek c. bool looprechts (char bord[10][10]) { int i, j; zoek (bord,'K',i,j); if ( j < 9 && bord[i][j+1] == ' ' ) { bord[i][j] = 'L'; bord[i][j+1] = 'K' return true; } // if else return false; } // looprechts d. void kortin (char bord[10][10]) { int i, j; zoek (bord,'S',i,j); if ( i > 0 && bord[i-1][j] == 'L' ) bord[i-1][j] = 'S'; else if ( j > 0 && bord[i][j-1] == 'L' ) bord[i][j-1] = 'S'; else if ( i < 9 && bord[i+1][j] == 'L' ) bord[i+1][j] = 'S'; else if ( j < 9 && bord[i][j+1] == 'L' ) // overbodige test ... bord[i][j+1] = 'S'; bord[i][j] = ' '; } // kortin