Uitwerkingen Tentamen Inleiding Programmeren in C++ voor LS&Ters woensdag 3 april 2002 OPGAVE 1 a. int max2 (int x, int y) { if ( x > y ) return x; else return y; } // max2 b. int max4 (int x, int y, int u, int v) { return max2 (max2 (x,y), max2 (u,v)); } // max4 c. void som (int n) { int i; int res = 0; for ( i = 1; i < n; i++ ) res = res + i * (i+1); cout << "Resultaat is: " << res << endl; } // som d. void hoeveel (int n, int & aantal) { aantal = 0; while ( n % 2 == 0 ) { n = n / 2; aantal++; } // while } // hoeveel OPGAVE 2 a. void wissel (double A[n], int i, int j) { double temp = A[i]; A[i] = A[j]; A[j] = temp; } // wissel b. int linzoek (double A[n], double X) { int i = 0; while ( A[i] != X ) i++; return i; } // linzoek c. void ruilen (double A[n], double X, double Y) { wissel (A,linzoek (A,X),linzoek (A,Y)); } // ruilen d. Binair zoeken werkt alleen indien het array (oplopend) gesorteerd is. Het doet dan maximaal circa log n vergelijkingen in plaats van (maximaal) n voor lineair zoeken. Je vergelijkt de gezochte X eerst met het (ongeveer) middelste array-element, stopt als dat X is, en als X kleiner is ga je in het "linker" array-gedeelte verder, anders in het "rechter" gedeelte; enz. OPGAVE 3 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. b. De functie draai verwisselt (de inhouden van) u en v. c. De for-loop uit jaar2002 wordt 5 maal doorlopen. Afgedrukt wordt: 11 , 1998 1999 , 11 12 , 1999 2000 , 12 13 , 2000 13 , 2000 , 6 , 5 13 , 5 d. Nu doet draai niets meer met u en v! Afgedrukt wordt: 1999 , 10 2000 , 10 2001 , 10 2002 , 10 2003 , 10 2003 , 10 , 6 , 5 1998 , 5 e. Dat mag niet, want dan zou jaar2002 boven draai moeten staan. Als je het echt wilt moet je een prototype van jaar2002 (alleen de kopregel met een ; er achter) boven draai zetten. Je krijgt dan wel ingewikkelde recursie overigens! OPGAVE 4 a. int rijsom (int A[n][n], int i) { int som = 0; int j; for ( j = 0; j < n; j++ ) som = som + A[i][j]; return som; } // rijsom b. void okeerijen (int A[n][n]) { int som = rijsom (A,0); bool okee = true; int i; for ( i = 1; i < n; i++ ) if ( som != rijsom (A,i) ) okee = false; if ( okee ) cout << "Rijsommen gelijk" << endl; else cout << "Rijsommen ongelijk" << endl; } // okeerijen c. bool diag ( int A[n][n]) { int som1 = 0, som2 = 0; int i; for ( i = 0; i < n; i++ ) { som1 = som1 + A[i][i]; som2 = som2 + A[i][n-1-i]; } // for return ( som1 == som2 ); } // diag d. bool allegetallen (int A[n][n]) { int X; for ( X = 1; X <= n*n; X++ ) if ( ! komtvoor (A,X) ) return false; return true; } // allegetallen