Uitwerking Tentamen Programmeermethoden 3 januari 2018 OPGAVE 1 a. int verschil (int A[ ], int n) { int i, ma = A[0], mi = A[0]; for ( i = 1; i < n; i++ ) if ( A[i] > ma ) ma = A[i]; else if ( A[i] < mi ) mi = A[i]; return ( ma - mi ); }//verschil b. void eerste3 (int A[ ], int n, int & a, int & b, int & c) { int i = 1, temp; a = A[0]; while ( A[i] == a ) i++; b = A[i]; // eventueel hier i++; while ( A[i] == a || A[i] == b ) i++; c = A[i]; if ( a > b ) { temp = a; a = b ; b = temp; }//if if ( b > c ) { temp = b; b = c ; c = temp; }//if if ( a > b ) { temp = a; a = b ; b = temp; }//if }//eerste3 c. void sorteer (int A[ ], int n) { int i, a, b, c, tela = 0, telb = 0; // telc is overbodig, mag wel eerste3 (A,n,a,b,c); for ( i = 0; i < n; i++ ) if ( A[i] == a ) tela++; else if ( A[i] == b ) telb++; for ( i = 0; i < tela; i++ ) A[i] = a; for ( i = tela; i < tela + telb; i++ ) A[i] = b; for ( i = tela + telb; i < n; i++ ) A[i] = c; }//sorteer d. void busorteer (int A[ ], int n) { int i, j, temp; for ( i = 0; i < 2 * ( n / 3 ); i++ ) for ( j = 0; j < n - i - 1; j++ ) if ( A[j] > A[j+1] ) { temp = A[j]; A[j] = A[j+1]; A[j+1] = temp; }//if }//busorteer 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,1 3,4 3,3 3,3 3,3,3,6,3 6,3 (met regelovergangen ertussen) c. 3,1 3,4 3,4 3,4 3,4 4,4,3,7,3 7,3 d. 2,2 2,2 2,2,2,4,42 4 e. Er moet dan wel een protoype void vinci (int a, int b); boven da staan. En verder moeten beide parameters van vinci call by value zijn. OPGAVE 3 a. bool eerlijk (int stemmen[ ][n]) { int i, j, eerstesom = 0, som; for ( j = 0; j < n; j++ ) eerstesom += stemmen[0][j]; for ( i = 1; i < m; i++ ) { som = 0; for ( j = 0; j < n; j++ ) som += stemmen[i][j]; if ( som != eerstesom ) return false; }//for return true; }//eerlijk b. bool idem (int stemmen[ ][n], int i1, int i2) { int j, verschil; bool okee = false; for ( j = 0; j < n; j++ ) { verschil = stemmen[i1][j] - stemmen[i2][j]; if ( verschil > 1 || verschil < -1 ) return false; if ( verschil == 0 ) okee = true; }//for return okee; }//idem c. int vrienden (int stemmen[ ][n], int i1) { int teller = 0, i = i1, j, i2; bool hulp[m]; for ( j = 0; j < m; j++ ) hulp[j] = false; while ( i != -1 ) { hulp[i] = true; i2 = -1; teller++; for ( j = m-1; j >= 0; j-- ) if ( idem (stemmen,i,j) && ! hulp[j] ) i2 = j; i = i2; }//while return teller; }//vrienden OPGAVE 4 a. void voegtoe (getal* & ingang, int waarde) { getal* nieuw = new getal; nieuw->info = waarde; nieuw->volgende = ingang; if ( ingang != NULL ) { nieuw->vorige = ingang->vorige; ingang->vorige = nieuw; }//if else nieuw->vorige = nieuw; ingang = nieuw; }//voegtoe b. void verwijder (getal* & ingang) { getal* weg = ingang; if ( ingang != NULL && ingang->info % 2 == 0 ) { ingang = ingang->volgende; if ( ingang != NULL ) ingang->vorige = weg->vorige; delete weg; }//if }//verwijder c. void verwissel (getal* ingang) { int temp; if ( ingang != NULL && ingang->volgende != NULL && ingang->vorige != ingang->volgende ) { temp = ingang->info; ingang->info = ingang->volgende->info; ingang->volgende->info = temp; }//if }//verwissel d. Bij a en b moet het: de pointer ingang gaat veranderen (bij b niet altijd, overigens). Bij c mag het: de pointer verandert toch niet. e. void repareer (getal* ingang) { getal* p = ingang; getal* q = ingang->vorige; // of q = ingang; while ( p->volgende != NULL ) p = p->volgende; while ( q->vorige != NULL ) q = q->vorige; p->volgende = q; q->vorige = p; }//repareer