Uitwerking tentamen Programmeermethoden Natuur/sterrenkunde 18 december 2015 OPGAVE 1 a. bool gesorteerd (int A[ ], int n) { int i; for ( i = 0; i < n-1; i++ ) if ( A[i] > A[i+1] ) return false; return true; }//gesorteerd b. int fibo (int i) { int j, a = 1, b = 1, temp; for ( j = 1; j < i; j++ ) { temp = b; b = a + b; a = temp; }//for return b; }//fibo c. bool fibocheck (int A[ ], int n) { int i, tel = 0; if ( ! gesorteerd (A,n) ) return false; for ( i = 0; i < n; i++ ) if ( A[i] != fibo(i) ) tel++; return ( tel <= 2 ); }//fibocheck d. void sorteer (int A[ ], int n) { //bubblesort int i, j, temp; for ( i = 1; i < n; i++ ) for ( j = 0; j < n-i; j++ ) { if ( A[j] > A[j+1] ) { temp = A[j]; A[j] = A[j+1]; A[j+1] = temp; }//if }//for }//sorteer e. Altijd n-1 + n-2 + ... + 2 + 1 = n(n-1)/2 vergelijkingen f. int langste (int A[ ], int n, int & gem) { int leng = 1, i, delangste = 1; mijngem = A[0]; for ( i = 0; i < n-1; i++ ) { if ( A[i] <= A[i+1] ) { leng++; mijngem += A[i+1]; }//if else { leng = 1; mijngem = A[i+1]; }//else if ( leng >= delangste ) { delangste = leng; gem = mijngem; }//if }//for gem = (int) ( (double) gem / delangste + 0.5 ); return delangste; }//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. 4,18,6 LF -8 LF 1,4 LF (LF is een regelovergang) c. 4,18,6 LF -8 LF 18,6 LF d. 4,17,5 LF -8 LF 17,5 LF maar ook 4,16,5 LF -7 LF 16,5 LF is mogelijk e. Dan moet er een prototype van donald boven hillary staan (anders kent hillary donald niet), en beide parameters van donald moeten call by value zijn (want 0 en a-a zijn geen l-values). f. 2(1-r-s) OPGAVE 3 a. int maxim (int M[ ][n], int & i, int & j) { int r, s, gr = -1; for ( r = 0; r < m; r++ ) for ( s = 0; s < n; s++ ) if ( M[r][s] >= gr ) { gr = M[r][s]; i = r; j = s; }//if return gr; }//maxim b. int druk (int M[ ][n], int & maxsom) { int rijsom, i, j, grootste = 0, rij = 0; for ( i = 0; i< m; i++ ) { rijsom = 0; for ( j = 0; j < n; j++ ) rijsom += M[i][j]; if ( rijsom > grootste ) { grootste = rijsom; rij = i; } }//for return rij; }//druk c. int paren (int M[ ][n], int ondergrens) { int teller = 0, i, j; for ( i = 0; i < m; i++ ) for ( j = 0; j < n; j++ ) { if ( j < n-1 && M[i][j] == M[i][j+1] && 2*M[i][j] >= ondergrens ) teller++; if ( i < m-1 && M[i][j] == M[i+1][j] && 2*M[i][j] >= ondergrens ) teller++; }//for return teller; }//paren d. int verhuis (int M[ ][n]) { int stappen = 0, maxi, maxj, gr, buren = 1; while ( buren > 0 ) { gr = maxim (M,maxi,maxj); buren = 0; if ( maxi > 0 && M[maxi][maxj] >= M[maxi-1][maxj] + 5) { M[maxi-1][maxj]++; buren++; }//if if ( maxi < m-1 && M[maxi][maxj] >= M[maxi+1][maxj] + 5) { M[maxi+1][maxj]++; buren++; }//if if ( maxj > 0 && M[maxi][maxj] >= M[maxi][maxj-1] + 5) { M[maxi][maxj-1]++; buren++; }//if if ( maxj < n-1 && M[maxi][maxj] >= M[maxi][maxj+1] + 5) { M[maxi][maxj+1]++; buren++; }//if stappen++; M[maxi][maxj] -= buren; }//while return stappen; }//verhuis