Uitwerking tentamen Programmeermethoden 4 augustus 2008 OPGAVE 1 a.int desom (int A[ ], int i, int j) { int som = 0, k; for ( k = i; k <= j; k++ ) som += A[k]; return som; }//desom b.int grootsom (int A[ ], int n) { int maxsom = A[0], i, j; for ( i = 0; i < n; i++ ) for ( j = i; j < n; j++ ) if ( desom (A,i,j) > maxsom ) maxsom = desom (A,i,j); return maxsom; }//grootsom c.void sorteer (int A[ ], int n) { int temp, i, j = n-1; bool wissels = true; while ( wissels ) { wissels = false; for ( i = 0; i < j; i++ ) if ( A[i] > A[i+1] ) { temp = A[i]; A[i] = A[i+1]; A[i+1] = temp; wissels = true }//if j--; }//while }//sorteer d.int grootsomnieuw (int A[ ], int n) { int i = 0; while ( A[i] < 0 ) i++; return grootsom (A,i,n-1); }//grootsomnieuw e.int grootsomnieuw2 (int A[ ], int n) { int i = 0, kl = 0; while ( i < n && A[i] < 0 ) { if ( A[i] > A[kl] ) kl = i; i++; }//while if ( i < n ) return grootsom (A,i,n-1); else return A[kl]; }//grootsomnieuw2 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. 3,5 3,5 3,5 3,5 3,5 5,3,6,16 16,3,5 c. 3,5 5,3 3,5 3,5,4,12 12,5,3 d. 0,0 0,0,2,0 0,3,5 e. bas (y,z) verwisselt y en z van inhoud; aad (y,z) doet niks met y en z als y >= z, en als y < z worden ze van inhoud verwisseld OPGAVE 3 a.bool controle (char letters[ ][n], int i) { int j; for ( j = 0; j < n-1; j++ ) if ( letters[i][j] > letters[i][j+1] ) return false; return true; }//controle b.bool zoek (char letters[ ][n], int & i, int & j, char let) { for ( i = 0; i < m; i++ ) for ( j = 0; j < n; j++ ) if ( letters[i][j] == let ) return true; return false; }//zoek c.bool zoekbeter (char letters[ ][n], int & i, int & j, char let) { int p = 0, q = 0; while ( p < m && q < n ) { i = p; j = q; while ( j < n && letters[i][j] < let ) j++; if ( j < n && letters[i][j] == let ) return true; j = q; while ( i < m && letters[i][j] < let ) i++; if ( i < m && letters[i][j] == let ) return true; p++; q++; }//while return false; }//zoekbeter OPGAVE 4 a.void voegtoe (info* & ingang, int get) { info* nieuw = new info; nieuw->getal = get; nieuw->som = get; nieuw->volg = ingang; nieuw->vorig = NULL; if ( ingang != NULL ) { nieuw->som += ingang->som; ingang->vorig = nieuw; }//if ingang = nieuw; }//voegtoe b.void verwijder (info* & ingang) { info* weg = ingang; if ( ingang != NULL && ingang->som % 2 == 1 && ingang->get % 2 == 1 ) { ingang = ingang->volg; delete weg; if ( ingang != NULL ) ingang->vorig = NULL; }//if }//verwijder c.void verwissel (info* ingang) { int temp; if ( ingang != NULL && ingang->volg != NULL ) { temp = ingang->getal; ingang->getal = ingang->volg->getal; ingang->volg->getal = temp; ingang->volg->som += ( ingang->volg->getal - ingang->getal ); }//if }//verwissel d.Bij a en b moet er een & bij, bij c mag het. Bij a gaat de pointer veranderen, bij b vaak ook, en bij c helemaal niet. e.void repareer (info* ingang) { info* hulp = ingang; if ( ingang != NULL ) { ingang->vorig = NULL; while ( hulp->volg != NULL ) { hulp->volg->vorig = hulp; hulp = hulp->volg; }//while }//repareer