Uitwerking Tentamen Programmeermethoden 4 januari 2000 - dag 1.a. void invoegsorteer (int A[ ], int n) { int i, j, temp; for ( i = 1; i < n; i++ ) { // voeg A[i] in op juiste plaats temp = A[i]; j = i - 1; while ( ( j >= 0 ) && ( A[j] > temp ) ) { A[j+1] = A[j]; j--; } // while A[j+1] = temp; } // for } // invoegsorteer b. Minimaal: n-1, bij reeds gesorteerd rijtje. Maximaal: 1 + 2 + 3 + ... + (n-1) = n (n-1) / 2, bij omgekeerd gesorteerd rijtje. c. int absoluut (int x, int y) { if ( x > y ) return x - y; else return y - x; } // absoluut d. int grootste (int A[ ], int n) { int k, gr = absoluut (A[0],A[1]); // OF gr = 0; en dan k vanaf 0 for ( k = 1; k < n - 1; k++ ) if ( absoluut (A[k],A[k+1]) > gr ) gr = absoluut (A[k],A[k+1]); return gr; } // grootste e. int grootstenu (int A[ ], int n, int i, int w) { // eventueel nog w = grootste (A,n); if ( A[i+1] - A[i-1] > w ) return A[i+1] - A[i-1]; else return w; } // grootstenu 2.a. formeel: in functieheading, bijvoorbeeld int f (int x, bool y) { ... actueel: bij aanroep, bijvoorbeeld r en y in z = f (r,y); call by value: waarde wordt doorgegeven aan locale kopie; actuele parameter verandert niet call by reference (met & erbij): variabele zelf wordt doorgegeven, en kan dus ook veranderen globaal: kan overal gebruikt worden; bovenaan programma aangemaakt locaal: plaatselijk in functie geldig b. 1.1 6.5 5.3 7 6.5 1.1 5.3 c. 1.1 5.5 3.3 7 1.1 2.2 3.3 d. 14 14 14 7 14 4.0001 8.0001 dit als eerst geheel (t) (bij r = ...) geevalueerd wordt: de volgorde bij + is in C++ onbepaald; anders: overal 13 in plaats van 14. Overal mogen nog (meer) cijfers na de komma. Overigens is hier ook r += t + 10; riskant. 3.a. int klein (int K[ ][n], int m) { // OF n ook nog als parameter meegeven // maar hij moet toch bij K[ ][n] staan int som = 0, kl, i, j; for ( j = 0; j < n; j++ ) { kl = K[0][j]; for ( i = 1; i < m; i++ ) if ( K[i][j] < kl ) kl = K[i][j]; som += kl; } // for return som; } // klein b. int zelfderij (int K[ ][n], int m, int p, int q) { int i, j, telp, telq; for ( i = 0; i < m; i++ ) { telp = 0; telq = 0; for ( j = 0; j < n; j++ ) { if ( K[i][j] == p ) telp++; if ( K[i][j] == q ) telq++; } // for if ( p == q && telp > 1 ) return i; else if ( p != q && telp > 0 && telq > 0 ) return i; } // for return -1; } // zelfderij c. void drukaf (int K[ ][n], int m) { int i, j; for ( i = 0; i < m; i++ ) { for ( j = 0; j < n; j++ ) if ( zelfderij (K,m,K[i][j],K[i][j]) != i ) // OF == -1 cout << K[i][j]; cout << endl; } // for } // drukaf 4.a. void voegtoe (vakje* & ingang, int jaartal) { vakje* p = new vakje; p->info = jaartal; p->volgende = ingang; if ( ingang != NULL ) p->volgvolgende = ingang->volgende; else p->volgvolgende = NULL; ingang = p; } // voegtoe b. void verwijder (vakje* & ingang) { vakje* p = ingang; if ( p != NULL && p->info != 2000 ) { ingang = ingang->volgende; delete p; } // if } // verwijder c. void verwissel (vakje* ingang) { int temp; if ( ingang != NULL && ingang->volgende != NULL ) { temp = ingang->info; ingang->info = ingang->volgende->info; ingang->volgende->info = temp; } // if } // verwissel d. Bij a en b moet er een & bij staan: de pointer ingang kan (bij a zelfs zeker) veranderen. Bij c maakt het niet uit: de ingangspointer verandert toch niet. Staat er geen & bij, dan wordt er met een lokale kopie van ingang gewerkt. e. int lengte (vakje* ingang) { int tel = 1; vakje* p = ingang; if ( ingang == NULL ) return 0; while ( p->volgvolgende != NULL ) { tel+= 2; p = p->volgvolgende; } // while if ( p->volgende != NULL ) tel++; return tel; } // lengte