Uitwerkingen Tentamen Inleiding Programmeren in C++ voor LS&Ters vrijdag 12 maart 2004 OPGAVE 1 a. double min (double x, double y, double z) { if ( x <= y && x <= z ) return x; else if ( y <= x && y <= z ) return y; else return z; }//min b. int som (int n) { int i, res = 0; for ( i = 1; i <= n; i++ ) res += i * i; return res; }//som c. void deling (int x, int y) { int tel = 0; while ( x >= y ) { tel++; x = x - y; }//while cout << tel << " en " << x << endl; }//deling d. bool spiegel (char A[10], char B[10]) { int i = 0; bool okee = true; while ( okee && i < 10 ) { if ( A[i] != B[9-i] && A[i] != '*' && B[9-i] != '*' ) okee = false; i++; }//while return okee; }//spiegel OPGAVE 2 a. int kleinste (double A[n], int i) { int kl = i, k; for ( k = i+1; k < n; k++ ) if ( A[k] < A[kl] ) kl = k; return kl; }//kleinste b. void schuif (double A[n], int i, int j) { int k; double temp = A[j]; for ( k = j-1; k >= i; k-- ) A[k+1] = A[k]; A[i] = temp; }//schuif c. void sorteer (double A[n]) { int i, j; for ( i = 0; i < n-1; i++ ) { j = kleinste (A,i); if ( i < j ) schuif (A,i,j); }//for }//sorteer d. Een keer schuif (A,i,n-1) kost n-i+1 toekenningen van double's (steeds geldt namelijk dat j = n-1, de kleinste staat telkens achteraan). Dus: n+1 + n + ... + 4 + 3 = (n-1)(n+4)/2, kortom orde n-kwadraat 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. 4 5 6 2 8 9 4.25 4 5 6 2 c. 4 5 6 2 8 9 4.25 5 4 7 1 d. 7 7 7 7 13 15 7 (of 7.0) 7 gem (a, a, a, a) levert gewoon a op, omgezet naar een double e. Anders wordt er naar beneden afgerond. f. Het mag, mits eerste en tweede parameter van gem call by value zijn, dus zonder &. Het is geen recursie (tenzij het statement in de functie gem zelf staat). OPGAVE 4 a. int groter (int Life[100][100], int X) { int tel = 0; int i, j; for ( i = 0; i < 100; i++ ) for ( j = 0; j < 100; j++ ) if ( Life[i][j] > X ) tel++; return tel; }//groter b. bool max (int Life[100][100], int i, int j) { return ( groter ( Life, Life[i][j]-1 ) == 1 ); }//max c. void overleef (int Life[100][100]) { int i, j, tel; int Lifekopie[100][100]; for ( i = 0; i < 100; i++ ) for ( j = 0; j < 100; j++ ) { tel = 0; if ( i > 0 ) tel += Life[i-1][j]; if ( i < 99 ) tel += Life[i+1][j]; if ( j > 0 ) tel += Life[i][j-1]; if ( j < 99 ) tel += Life[i][j+1]; if ( 4 <= tel && tel <= 8 ) Lifekopie[i][j] = Life[i][j]; else Lifekopie[i][j] = 0; }//for for ( i = 0; i < 100; i++ ) for ( j = 0; j < 100; j++ ) Life[i][j] = Lifekopie[i][j]; }//overleef d. De eerste 100 mag weggelaten worden, de tweede moet blijven staan. Een 2-dimensionaal array wordt in C++ rij voor rij, achter elkaar, in het geheugen opgeslagen. De compiler moet de lengte van een rij, en dat is de tweede 100, weten om adressen tijdens het compileren goed uit te kunen rekenen.