UITWERKING TENTAMEN PROGRAMMEERMETHODEN 30 maart 2023 OPGAVE 1 a. bool okee (int A[ ], int n) { int i; for ( i = 0; i < n-1; i++ ) { if ( A[i] > A[i+1] + 1 || A[i] < A[i+1] - 1 ) { return false; }//if }//for return true; }//okee b. bool mima (int A[ ], int n, int & mi, int & ma) { int i; mi = 0; ma = 0, aantalmi = 1, aantalma = 1; for ( i = 1; i < n; i++ ) { if ( A[i] < A[mi] ) { mi = i; aantalmi = 1; }//if else if ( A[i] == A[mi] ) { aantalmi++; }//else if ( A[i] > A[ma] ) { ma = i; aantalma = 1; }//if else if ( A[i] == A[ma] ) { aantalma++; }//else }//for if ( aantalmi == 1 && aantalma == 1 ) { return true; }//if mi = -1; ma = -1; return false; }//mima c. void sorteer (int A[ ], int n) { int i, j, temp, mi, ma; bool wissel = true; if ( ! mima (A,n,mi,ma) ) { return; }//if if ( mi > ma ) { temp = mi; mi = ma; ma = temp; }//if while ( wissel ) { wissel = false; for ( i = mi; i < ma; i++ ) { // eventueel ma-j, en j aflagen if ( A[i] > A[i+1] ) { wissel = true; temp = A[i]; A[i] = A[i+1]; A[i+1] = temp; }//if }//while }//sorteer d. Het te sorteren rijtje heeft t=|mi-ma|+1 elementen, maximaal aantal vergelijkingen als het omgekeerd gesorteerd was. Het aantal is t-1 + t-2 + ... + 2 + 1 = t(t-1)/2 . Of alle rondes even lang, zoals bij c, en dan t(t-1) 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 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,7,4 LF 2,3,8 LF 7,8,3 LF 1,5,6 LF 8,7,4 LF 15 LF 9,2,2 LF (LF = regelovergang) c. 1,7,4 LF 2,3,8 LF 7,2,6 LF 9 LF 2,7,6 LF d. 1,1,4 LF 3,0,2 LF 3 LF of 1,1,4 LF 3,1,2 LF 4 LF (als de volgorde bij de min anders is) e. De functie mia mag de functie dion alleen aanroepen als er een prototype van dion boven mia staat. En verder moet de tweede parameter van dion call-by-value zijn: 3 * z is geen l-value. OPGAVE 3 a. int klinkers (char P[ ][n]) { int i, j, teller = 0; for ( i = 0; i < m; i++ ) { for ( j = 0; j < n; j++ ) { if ( P[i][j] == 'a' || P[i][j] == 'e' || P[i][j] == 'i' || P[i][[j] == 'o' || P[i][j] == 'u' ) { teller++; }//if }}//forfor return teller; }//klinkers b. int aantal (char P[ ][n], int k) { int i, j, teller = 0, hekjes; for ( i = 0; i < m; i++ ) { j = 0; hekjes = 0; while ( j < n && hekjes < k ) { if ( P[i][j] == '#' ) { hekjes++; }//if j++; }//while if ( hekjes == k ) { teller++; }//if }//for return teller; }//aantal c. bool komtvoor (char P[ ][n], int & i, int & j, char W[ ], int lang) { int r, s; for ( i = 0; i < m; i++ ) { for ( j = 0; j < n; j++ ) { r = i; s = j; w = 1; if ( P[r][s] == W[0] || P[r][s] - 'A' + 'a' == W[0] ) { while ( w < lang ) { if ( r-1 >= 0 && ( P[r-1][s] == W[w] || P[r-1][s] - 'A' + 'a' == W[w] ) ) { r--; }//if else if ( r+1 < m && ( P[r+1][s] == W[w] || P[r+1][s] - 'A' + 'a' == W[w] ) ) { r++; }//else else if ( s-1 >= 0 && ( P[r][s-1] == W[w] || P[r][s-1] - 'A' + 'a' == W[w] ) ) { s--; }//else else if ( s+1 < n && ( P[r][s+1] == W[w] || P[r][s+1] - 'A' + 'a' == W[w] ) ) { s++; }//else else { w = lang + 10; }//else w++; }//while if ( w == lang ) { return true; }//if }//if }}//forfor i = -1; j = -1; return false; }//komtvoor OPGAVE 4 a. void verwijder (persoon* & ingang) { persoon * weg = ingang; if ( ingang != nullptr && '0' <= ingang->naam && ingang->naam <= '9' ) { ingang = ingang->volg; delete weg; }//if }//verwijder b. void wissel (persoon* ingang) { char temp; persoon* hulp; if ( ingang != nullptr && ingang->volg != nullptr ingang->naam != ingang->volg->naam ) { temp = ingang->naam; ingang->naam = ingang->volg->naam; ingang->volg->naam = temp; hulp = ingang->verder; ingang->verder = ingang->volg->verder; ingang->volg->verder = hulp; }//if }//wissel c. void voegtoe (persoon* & ingang, char name) { persoon* nieuw = new persoon; nieuw->naam = name; nieuw->volg = ingang; ingang = nieuw; nieuw = nieuw->volg; while ( nieuw != nullptr && nieuw->naam != name ) { nieuw = nieuw->volg; }//while ingang->verder = nieuw; }//voegtoe d. Bij a en c moet de ingangspointer (doorgaans) wijzigen, dus moet er een & bij. Bij b maakt het niet uit, de ingangspointer wijzigt nooit. e. int tel (persoon* ingang, char name) { int teller = 0; persoon* loper = ingang; while ( loper != nullptr && loper->naam != name ) { loper = loper->volg; }//while while ( loper != nullptr ) { loper = loper->verder; teller++; }//while return teller; }//tel