Uitwerking tentamen Programmeermethoden 13 maart 2014 OPGAVE 1 a. double groot (double A[ ], double X, int n) { int i; double degrootste; if ( X == A[0] ) degrootste = A[1]; else degrootste = A[0]; for ( i = 0; i < n; i++ ) if ( A[i] != X && A[i] > degrootste ) degrootste = A[i]; return degrootste; }//groot b. double grootste (double A[ ], int n) { double a = groot (A,0,n), b = groot (A,1,n); if ( a > b ) return a; else return b; }//grootste c. double kde (double A[ ], int k, int n) { double temp; int i, j; for ( i = 1; i <= k; 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 return A[n-k]; }//kde d. Dan is het gewoon bubblesort, dus n-1 + n-2 + ... + 1 = n(n-1)/2, terwijl het met n-1 vergelijkingen kan. 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. 1,3,7 2,8,4 3,5,9 4,10,6 6,16 5,42 c. 3,3,2 3,3,5 6,6,5 7,12 7,36 d. 1,2,2 4,4 2,42 e. Als n < 0: u + v; anders: u + v + 2*n. f. Dan moet er een prototype int wim (int x, int y); boven kees staan, en moet y een call by value parameter zijn in wim (v+1 is geen l-value). OPGAVE 3 a. bool okee (char Tekst[ ][n]) { int i, j; for ( i = 0; i < m-1; i++ ) for ( j = 0; j < n-1; j++ ) if ( Tekst[i][j+1] == Tekst[i+1][j] ) return false; return true; }//okee b. int verschillende (char Tekst[ ][n], int i) { int aantal = 0, j, k; bool tellen; for ( j = 0; j < n; j++ ) { tellen = true; for ( k = j+1; k < n; k++ ) if ( Tekst[i][j] == Tekst[i][k] ) tellen = false; if ( tellen ) aantal++; }//for return aantal; }//verschillende c. bool komtvoor (char Tekst[ ][n], char Woord[ ], int i, int j) { int k = 1; if ( Tekst[i][j] != Woord[0] ) return false; while ( k < w ) { if ( i < m - 1 && Tekst[i+1][j] == Woord[k] ) { i++; k++; }//if else if ( j < n - 1 && Tekst[i][j+1] == Woord[k] ) { j++; k++; }//if else return false; }//while return true; }//komtvoor OPGAVE 4 a. void voegtoe (letter* & ingang, char denaam, int getal) { letter* nieuw = new letter; nieuw->naam = denaam; nieuw->volg = ingang; nieuw->aantal = getal; if ( getal == 0 ) nieuw->vervolg = nieuw; else nieuw->vervolg = ingang; ingang = nieuw; }//voegtoe b. void verwijder (letter* & ingang) { letter* weg; if ( ingang != NULL ) { weg = ingang; ingang = ingang->volg; delete weg; }//if }//verwijder c. void wissel (letter* ingang) { char denaam; int getal; if ( ingang != NULL && ingang->volg != NULL && ingang->volg->aantal == ingang->aantal + 1 ) { denaam = ingang->naam; ingang->naam = ingang->volg->naam; ingang->volg->naam = denaam; getal = ingang->aantal; ingang->aantal = ingang->volg->aantal; ingang->volg->aantal = getal; if ( ingang->vervolg != NULL ) { ingang->vervolg = ingang->vervolg->volg; ingang->volg->vervolg = ingang->vervolg; }//if }//if }//wissel d. Bij a en b moet er een & bij, bij c mag het (het maakt daar niet uit). Bij a gaat de ingangspointer zeker veranderen, bij b kan dat ook moeten gebeuren. e. void zet (letter* ingang, int waarde) { letter* p = ingang; letter* loper = ingang; int dewaarde = waarde; while ( p != NULL && dewaarde > 0 ) { p = p->volg; dewaarde--; }//while while ( loper != NULL ) { loper->aantal = waarde; loper->vervolg = p; if ( p != NULL ) p = p->volg; loper = loper->volg; }//while }//zet