UITWERKING Tentamen Programmeermethoden voor Natuur/Sterrenkunde 11.11.2015 OPGAVE 1 a. int hoe (int A[ ], int X, int n) { int tel = 0, i; for ( i = 0; i < n; i++ ) if ( A[i] == X ) tel++; return tel; }//hoe b. int fac (int k) { int res = 1, i; for ( i = 1; i <= k; i++ ) res = res * i; return res; }//fac c. bool controle (int A[ ], int n) { int i; for ( i = 0; i < n; i++ ) if ( i % 2 == 0 ) { if ( i < hoe (A,A[i],n) ) return false; }//if else if ( A[i] != fac (i) ) return false; return true; }//controle d. void busort (int A[ ], int n) { int temp, i, j; bool gewisseld; for ( i = 1; i < n; i++ ) { gewisseld = false; for ( j = 0; j < n-i; j++ ) if ( A[j] > A[j+1] ) { gewisseld = true; temp = A[j]; A[j] = A[j+1]; A[j+1] = temp; }//if if ( ! gewisseld ) return; }//for }//busort e. Voor een gesorteerd rijtje (zoals 1 2 3 ... n): n-1 vergelijkingen; en voor een omgekeerd gesorteerd rijtje (zoals n n-1 ... 2 1): n-1 + n-2 + ... + 2 + 1 = n(n-1)/2 = O(n^2) vergelijkingen. f. int langste (int A[ ], int n, int & laatste) { int tel = 1, i, lang = 0; laatste = 0; for ( i = 1; i < n; i++ ) { if ( A[i] == A[i-1] ) tel++; else tel = 1; if ( tel >= lang ) { lang = tel; laatste = i; }//if }//for return lang; }//langste 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 r en y in z = f (r,y); b. 5.2 LF 8.3 LF 11.4 LF 11.4 LF 13.5 LF 2.1,3.1,42 Hierbij is LF een LineFeed. c. 5.2 LF 8.3 LF 11.4 LF 11.4 LF 22.8 LF 11.4,11.4,42 d. De bovengrens van de for-loop wordt groter en groter, dit stopt niet. e. De eerste parameter van harry moet dan zeker call-by-value zijn: er moet anders op die plek een l-value staan, en dat is 3*x niet. Verder moet er een prototype (kopregel) van harry boven gerard staan. f. Als y >= 0: x + floor(y) * y, en anders x. OPGAVE 3 a. void aflagen (int H[ ][n], int i, int j, int p, int q) { int r, s; for ( r = i; r <= p; r++ ) for ( s = j; s <= q; s++ ) if ( H[r][s] > 0 ) H[r][s]--; }//aflagen b. int gemiddeld (int H[ ][n], int i, int j) { int som = 0, tel = 0; if ( i > 0 ) { som += H[i-1][j]; tel++; }//if if ( i < m-1 ) { som += H[i+1][j]; tel++; }//if if ( j > 0 ) { som += H[i][j-1]; tel++; }//if if ( j < n-1 ) { som += H[i][j+1]; tel++; }//if return ( (int) ( (double) som / tel + 0.5 ) ); }//gemiddeld c. int maximum (int H[ ][n], int & i0, int & j0, int & aantal) { int i, j, maxi = -1; for ( i = 0; i < m; i++ ) for ( j = 0; j < n; j++ ) if ( H[i][j] > maxi ) { maxi = H[i][j]; aantal = 1; i0 = i; j0 = j; }//if else if ( H[i][j] == maxi ) aantal++; return maxi; }//maximum d. int egaliseer (int H[ ][n], int drempel) { int i0, j0, dummy, aantal, tellen = 0; dummy = maximum (H,i0,j0,aantal); while ( aantal < drempel ) { H[i0][j0]--; dummy = maximum (H,i0,j0,aantal); tellen++; }//while return tellen; }//egaliseer