Uitwerking tentamen Programmeermethoden 15 maart 2018 OPGAVE 1 a. int groot (int A[ ], int n) { int gr = A[0], i; for ( i = 1; i < n; i++ ) if ( A[i] > gr ) gr = A[i]; return gr; }//groot b. int langst (int A[ ], int & start, int n) { int groot = 1, i, tel = 1, mijnstart = 0; start = 0; for ( i = 1; i < n; i++ ) if ( A[i] == A[i-1] ) { tel++; if ( tel > groot ) { groot = tel; start = mijnstart; }//if else { tel = 1; mijnstart = i; }//else return groot; }//langst c. void busorteer (int A[ ], int n) { int i, j, temp; for ( i = 1; i < n; i++ ) 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; }//if }//busorteer d. void speciaal (int A[ ], int n) { int start, temp; if ( langst (A,start,n) == n-2 && start == 1 && groot (A,n) == A[start] ) { temp = A[1]; A[1] = A[n-1]; A[n-1] = temp; if ( A[0] > A[1] ) { temp = A[0]; A[0] = A[1]; A[1] = temp; }//if }//if else busorteer (A,n); }//speciaal 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 LF 3 LF 7 LF 2 LF 5 LF 11 LF 42,3,3 LF (LF = LineFeed) c. 1 LF 3 LF 7 LF 1 LF 3 LF 7 LF 34,2 LF d. -1 LF -1 LF -1 LF -1 LF -1 LF -1 LF 2,0 LF e. Nee, want er is geen functie die zichzelf direct of indirect aanroept. f. Nee, want dan moet in een aanroep piet (z) altijd een l-value (variabele) z staan, en mag bijvoorbeeld piet (piet (z)) niet. OPGAVE 3 a. int score (int doelpunten[ ][n], int i, int & totaal) { int i, tel = 0; totaal = 0; for ( j = 0; j < n; j++ ) if ( i != j ) { totaal += doelpunten[i][j]; if ( doelpunten[i][j] > doelpunten[j][i] ) tel += 3; else if ( doelpunten[i][j] == doelpunten[j][i] ) tel++; }//for return tel; }//score b. int winnaar (int doelpunten[ ][n]) { int i, totaal, hoogste = -1, hoto = -1, beste; for ( i = 0; i < n; i++ ) { descore = score (doelpunten,i,totaal); if ( descore > hoogste || ( descore == hoogste && totaal > hoto ) ) { hoogste = descore; hoto = totaal; beste = i; }//if return beste; }//winnaar c. int keten (int doelpunten[ ][n], int i1) { int teller = 0, i2; bool geweest[n]; for ( i = 0; i < n; i++ ) geweest[i] = false; while ( i1 < n ) { geweest[i1] = true; teller++; i2 = 0; while ( i2 < n && ! ( doelpunten[i1][i2] > doelpunten[i2][i1] ) ) i2++; if ( i2 < n && geweest[i2] ) i1 = n; else i1 = i2; }//while return teller; }//keten OPGAVE 4 a. void voegtoe (object* & ingang, char letter ) { object* nieuw = new object; nieuw->volgende = ingang; nieuw->info = letter; if ( 'a' <= letter && letter <= 'z' ) nieuw->tja = ingang; else if ( 'A' <= letter && letter <= 'Z' && ingang != NULL ) nieuw->tja = ingang->volgende; else nieuw->tja = NULL; ingang = nieuw; }//voegtoe b. void verwijder (object* & ingang) { object* weg = ingang; if ( ingang != NULL && ( ingang->info == 'a' || ingang->info == 'e' || ingang->info == 'i' || ingang->info == 'o' || ingang->info == 'u' ) ) { ingang = ingang->volgende; delete weg; }//if }//verwijder c. void wissel (object* ingang) { char temp; if ( ingang != NULL && ingang->volgende != NULL && ingang->volgende->volgende != NULL ) { temp = ingang->info; ingang->info = ingang->volgende->info; ingang->volgende->info = temp; }//if }//wissel d. Bij a en b moet er een & bij, de ingangspointer gaat immers wijzigen. Bij c mag het, maar het hoeft niet. De ingangspointer wijzigt niet. e. object* eennalaatste (object* ingang) { object* p = ingang; object* prev; while ( p->volgende != NULL ) { prev = p; if ( p->tja != NULL ) p = p->tja; else p = p->volgende; }//while if ( prev->volgende != p ) prev = prev->volgende; return prev; }//eennalaatste