UITWERKING TENTAMEN PROGRAMMEERMETHODEN 16 januari 2025 OPGAVE 1 a. void negpos (int A[ ], int n, int & pos, int & neg) { int i; pos = 0; neg = 0; for ( i = 0; i < n; i++ ) { if ( A[i] >= 0 ) { pos += A[i]; }//if else { neg += A[i]; }//else }//for }//negpos b. void splits (int A[ ], int n) { int i = 0, j = n-1, temp; while ( i < j ) { if ( A[i] < 0 ) { i++; }//if else if ( A[j] >= 0 ) { j--; }//if else { temp = A[i]; A[i] = A[j]; A[j] = temp; i++; j--; }//else }//while }//splits c. void sorteer (int A[ ], int n) { int i = 0, j, temp; bool klaar = false; while ( ! klaar ) { klaar = true; i++; for ( j = 0; j < n-i; j++ ) { // of altijd n-1 if ( A[j] > A[j+1] ) { temp = A[j]; A[j] = A[j+1]; A[j+1] = temp; klaar = false; }}}//if&for&while }//sorteer d. bool som3 (int A[ ], int n) { int i, j, k; for ( i = 0; i < n-2; i++ ) { for ( j = i+1; j < n-1; j++ ) { for ( k = j+1; k < n; k++ ) { if ( A[i] + A[j] + A[k] == 0 ) { return true; }}}}//if&for&for&for return false; }//som3 e. O(n^3), want drie-dubbele for loop; slechtste geval (doorgaans): geen dergelijk drietal aanwezig (of het allerlaatste trio deed het) 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. B 3,3 P 1,3 B 4,4 P 2,7 B 3,3 P 3,10 10 3,4,42 Hierbij is een LineFeed (regelovergang). c. B 3,3 P 2,3 P 3,6 6 3,3,38 d. Als a >= b is het a; anders a + (b-a)/2 (naar beneden afgerond), tenzij i oneven is en b-a even: dan is het a + (b-a)/2 + 1. OPGAVE 3 a. int tellen (char puzzel[ ][n]) { int i, j, tel = 0; for ( i = 0; i < m-1; i++ { for ( j = 0; j < n; j++ ) { if ( 'a' <= puzzel[i][j] && puzzel[i][j] <= 'z' ) { if ( j < n-1 && puzzel[i][j] == puzzel[i+1][j+1] { tel++; }//if if ( j > 0 && puzzel[i][j] == puzzel[i+1][j-1] { tel++; }//if }}}if&for&for return tel; }//tellen b. int gr (char puzzel[ ][n], int & j) { int i, j0, som, groot = -1; for ( j0 = 0; j0 < n; j0++ ) { som = 0; for ( i = 0; i < m; i++ ) { if ( '0' <= puzzel[i][j0] && puzzel[i][j0] <= '9' ) { som += puzzel[i][j0] - '0'; }//if }//for if ( som > groot ) { groot = som; j = j0; }//if }//for return groot; }//gr c. void print (char puzzel[ ][n], char c) { for ( i = 0; i < m; i++ ) { for ( j = 0; j < n; j++ ) { if ( puzzel[i][j] == c ) { // gebeurt maximaal 1 keer i++; while ( i < m && ! ( '0' <= puzzel[i][j] && puzzel[i]j[] <= '9' ) ) { cout << puzzel[i][j]; i++; }//while return; }}}//if&for&for }//print OPGAVE 4 a. void voegtoe (dier* & ingang, char s1, int l1, char s2, int l2) { dier* nieuw = new dier; nieuw->soort = s1; nieuw->leeftijd = l1; nieuw->volg = ingang; ingang = nieuw; nieuw = new dier; nieuw->soort = s2; nieuw->leeftijd = l2; nieuw->vriend = nullptr; nieuw->volg = nullptr; ingang->vriend = nieuw; }//voegtoe b. void verwijder (dier* & ingang) { dier* weg = ingang; if ( ingang != nullptr ) { ingang = ingang->volg; if ( weg->vriend->vriend == nullptr ) { delete weg->vriend; }//if delete weg; }//if }//verwijder c. void wisselen (dier* ingang) { char temp; if ( ingang != nullptr && ( ingang->leeftijd + ingang->vriend->leeftijd ) % 2 == 1 ) { temp = ingang->soort; ingang->soort = ingang->vriend->soort; ingang->vriend->soort = temp; }//if }//wisselen d. Bij a en b gaat de ingang (doorgaans) veranderen, dus dan moet er een & bij. Bij c hoeft het niet, het mag wel. e. int totaal (dier* ingang, int & h1, int & h2) { int tot = 0; dier* loper = ingang; h1 = 0; h2 = 0; while ( loper != nullptr ) { if ( loper->vriend->vriend != nullptr ) { h1++; }//if else { tot += loper->vriend->leeftijd; h2++; }//else tot += loper->leeftijd; loper = loper->volg; }//while return tot; }//totaal