Uitwerking tentamen Programmeermethoden 6 januari 2015 OPGAVE 1 a. bool bijna (int A[ ], int n, int & i) { int tel = 0, j; for ( j = 0; j < n-1; j++ ) if ( A[j] > A[j+1] ) { tel++; i = j; }//if if ( tel != 1 ) { i = -1; return false; }//if else return true; }//bijna b. void effisort (int A[ ], int n) { int i, temp; if ( bijna (A,n,i) ) { temp = A[i]; while ( i < n-1 ) { A[i] = A[i+1]; i++; }//while A[n-1] = temp; }//if }//effisort c. void busort (int A[ ], int n) { int i, ronde = 1, temp; bool klaar = false; while ( ! klaar ) { klaar = true; for ( i = 0; i < n-ronde; i++ ) if ( A[i] > A[i+1] ) { klaar = false; temp = A[i]; A[i] = A[i+1]; A[i+1] = temp; }//if ronde++; }//while }//busort d. Minimaal: een ronde, met n-1 vergelijkingen (als het laatste element vervangen was); en anders: maximaal: twee rondes, met n-1 + n-2 = 2n-3 vergelijkingen. 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 oorspronkelijke 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. 6,2 LF 38,2 LF 2,38 LF (LF = regelovergang) c. 6,6 LF 42,42 LF 42,42 LF d. n*a + b (als n >= 0) e. (a^2+b)^2 + a^2+b f. Dan moet de tweede parameter van jeanine call by value zijn, en een prototype van jeanine moet boven ludo staan. OPGAVE 3 a. bool klinker (char c) { return ( c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' ); }//klinker b. int aantal (char HL[ ][n]) { int i, j; for ( i = 0; i < m; i++ ) for ( j = 0; j < n-1; j++ ) if ( klinker (HL[i][j]) && klinker (HL[i][j+1] ) return 2; return 0; }//aantal c. bool kliko (char HL[ ][n], int i1, int i2, int j) { while ( i1 <= i2 ) if ( klinker (HL[i1][j]) ) i1++; else return false; return true; }//kliko d. bool verti (char HL[ ][n]) { int i, j; for ( j = 0; j < n; j++ ) if ( klinker ( HL[0][j] ) ) { if ( kliko (HL,1,m-1,j) ) return true; // of kliko (HL,0,m-1,j) i = 1; while ( klinker (HL[i][j]) ) i++; if ( j-1 >= 0 && klinker (HL[i-1][j-1]) ) return kliko (HL,i,m-1,j-1); if ( j+1 < n && klinker (HL[i-1][j+1]) ) return kliko (HL,i,m-1,j+1); }//if return false; }//verti OPGAVE 4 a. void verwijder (mens* & eerste) { mens* weggooien = eerste; if ( eerste != NULL ) { eerste = eerste->volg; delete weggooien; if ( eerste != NULL ) eerste->vorig = NULL; }//if }//verwijder b. void voegtoe (mens* & eerste, int mensnr) { mens* nieuw = new mens; nieuw->vorig = NULL; nieuw->volg = eerste; nieuw->nr = mensnr; nieuw->weg = false; if ( eerste != NULL ) eerste->vorig = nieuw; eerste = nieuw; }//voegtoe c. void wissel (mens* eerste) { int temp; if ( eerste != NULL && eerste->volg != NULL && eerste->nr > eerste->volg->nr ) { temp = eerste->nr; eerste->nr = eerste->volg->nr; eerste->volg->nr = temp; }//if }//wissel d. Bij a en b moet er een & bij, bij c mag het (het maakt daar niet uit). Bij b gaat de ingangspointer zeker veranderen, bij a kan dat ook de bedoeling zijn. e. void opschonen (mens* & eerste) { mens* p = eerste; mens* q; while ( p != NULL ) { q = p; p = p->volg; if ( q->weg ) { if ( q->vorig != NULL ) q->vorig->volg = p; else eerste = p; if ( p != NULL ) p->vorig = q->vorig; delete q; }//if }//while }//opschonen