UITWERKING OPGAVE 1 a. int hoe (int A[ ], int X, int n) { int i, tel = 0; for ( i = 0; i < n; i++ ) if ( A[i] == X ) tel++; return tel; }//hoe b. void uniek (int A[ ], int n) { int i, j; for ( i = 0; i < n; i++ ) for ( j = i+1; j < n; j++ ) if ( A[i] == A[j] ) A[j] = 0; }//uniek c. void busort (int A[ ], int n) { int i, j, temp; bool klaar = false; for ( i = 1; i < n && ! klaar; i++ ) { klaar = true; 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; klaar = false; }//if }//for }//busort d. void uniek (int A[ ], int n) { int i, vorige = A[0] + 1, nieuw; for ( i = 0; i < n; i++ ) { nieuw = A[i]; if ( nieuw == vorige ) A[i] = 0; else vorige = nieuw; }//for }//uniek e. Bij b altijd n-1 + n-2 + ... + 2 + 1 = n(n-1)/2 = O(n^2), bij d altijd n. Bij c: minimaal n-1, maximaal n(n-1)/2. 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.1 6.5 5.3 42 LF 6.5 1.1 5.3 LF (LF = regelovergang) c. 1.1 5.5 3.3 42 LF 1.1 2.2 3.3 LF d. 13 13 13 42 LF 13 4.0001 8.0001 LF OF overal 13 <--> 14 (of misschien zelfs 13.0, resp. 14.0) Het hangt af van de volgorde van + in r = r + (int) ivo (t);!!! e. Dan moet er een prototype van fred boven ivo staan, en moeten tweede en derde parameter van fred call by value zijn (er staat op die plek namelijk geen l-value). OPGAVE 3 a. bool beter (int V[ ][n], int i1, int i2) { int j; for ( j = 0; j < n; j++ ) if ( V[i1][j] < V[i2][j] ) return false; return true; }//beter b. int meest (int V[ ][n], int & tel, int & aantal) { int i, j, telaantal, index; tel = 0; aantal = -1; for ( i = 0; i < m; i++ ) { telaantal = 0; for ( j = 0; j < n; j++ ) telaantal += V[i][j]; if ( telaantal == aantal ) tel++; else if ( telaantal > aantal ) { aantal = telaantal; tel = 1; index = i; }//else }//for return index; }//meest c. int manage (int V[ ][n], int i1) { int i = i1, j = 0, tel = 1; while ( true ) { while ( j < n && V[i][j] != 0 ) j++; if ( j == n ) return tel; while ( i < m && V[i][j] < 4 ) i++; if ( i == m ) return tel; tel++; }//while return tel; }//manage OPGAVE 4 a. void voegtoe (vak* & eerste, int vaknr, int vakcf) { vak* nieuw = new vak; nieuw->nr = vaknr; nieuw->cijfer = vakcf; nieuw->volg = eerste; nieuw->voorvorig = NULL; if ( eerste != NULL && eerste->volg != NULL ) eerste->volg->voorvorig = nieuw; eerste = nieuw; }//voegtoe b. void verwijder (vak* & eerste) { vak* weg = eerste; if ( eerste != NULL ) { eerste = eerste->volg; if ( eerste != NULL && eerste->volg != NULL ) eerste->volg->voorvorig = NULL; delete weg; }//if }//verwijder c. void wissel (vak* eerste) { int temp; if ( eerste != NULL && eerste->volg != NULL && eerste->cijfer == eerste->volg->cijfer ) { 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 moeten gebeuren. e. int rangnummer (vak* eerste, vak* ptr) { int tel = 0; while ( ptr != NULL ) { if ( ptr->voorvorig != NULL ) tel += 2; else if ( eerste == ptr ) tel++; else tel += 2; ptr = ptr->voorvorig; }//while return tel; }//rangnummer