Uitwerking tentamen Programmeermethoden 3 januari 2017 OPGAVE 1 a. int nega (int A[ ]. int n) { int i, teller = 0; for ( i = 0; i < n; i++ ) if ( A[i] < 0 ) teller++; return teller; }//nega b. int eerste (int A[ ], int i, int n) { int j = i + 1; if ( j < 0 ) j = 0; while ( j < n ) { if ( A[j] > 0 ) return j; j++; } //while return -1; }//eerste c. void busort (int A[ ]. int n) { int r, i, temp; for ( r = 1; r < n; r++ ) for ( i = 0; i < n-1; i++ ) // of < n-r als bovengrens if ( A[i] > A[i+1] ) { temp = A[i]; A[i] = A[i+1]; A[i+1] = temp; }//if }//busort d. void raresort (int A[ ], int n) { int r, i, j, temp; for ( r = 1; r < n; r++ ) { i = eerste (A,-1,n); while ( i != -1 ) { j = eerste (A,i,n); if ( j != -1 && A[j] < A[i] ) { temp = A[i]; A[i] = A[j]; A[j] = temp; }//if i = j; }//while }//for }//raresort e. n-1-g als g < n, en 0 als g = n 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. F H d,6 J d,2 c. F G H d,5 I d,4 d. Er moet dan wel een prototype char mark (char k, int m); boven lodewijk staan. Verder moeten beide parameters van mark call by value zijn. e. int i, j; for ( i = 0; i < 26; i++ ) { j = i; cout << lodewijk ('a',j); }//for OPGAVE 3 a. bool checkrij (int M[ ][n], int i) { int j, k; for ( j = 0; j < n; j++ ) for ( k = j+1; k < n; k++ ) if ( M[i][j] == M[i][k] && M[i][j] != 0 ) return false; return true; }//checkrij b. void losop (int M[ ][n]) { int i, j; for ( i = 0; i < m; i++ ) for ( j = 0; j < n; j++ ) if ( M[i][j] == 0 ) { do { M[i][j]++; } while ( ! checkrij (M,i) || ! checkkolom (M,j) ); }//if }//losop c. int aantal (int M[ ][n], int & i, int & j) { int r, s, teller = 0; bool geweest[m][n]; for ( r = 0; r < m; r++ ) for ( s = 0; s < n; s++ ) geweest[r][s] = false; geweest[i][j] = true; while ( true ) { if ( j == 0 ) j++; else if ( j == n-1 ) j--; else if ( M[i][j-1] > M[i][j+1] ) j--; else j++; teller++; if ( geweest[i][j] ) return teller; geweest[i][j] = true; if ( i == 0 ) i++; else if ( i == m-1 ) i--; else if ( M[i-1][j] > M[i+1][j] ) i--; else i++; teller++; if ( geweest[i][j] ) return teller; geweest[i][j] = true; }//while }//aantal OPGAVE 4 a. void voegtoe (vak* & eerste, int vakcijfer, char vaknaam) { vak* nieuw = new vak; nieuw->cijfer = vakcijfer; nieuw->naam = vaknaam; nieuw->volg = eerste; nieuw->ander = eerste; if ( eerste != NULL && eerste->ander == NULL ) eerste->ander = nieuw; eerste = nieuw; }//voegtoe b. void verwijder (vak* & eerste) { vak* weg = eerste; if ( eerste != NULL ) { eerste = eerste->volg; if ( eerste != NULL ) eerste->ander = eerste->volg; delete weg; }//if }//verwijder c. void wissel (vak* eerste) { int vakcijfer; if ( eerste != NULL && eerste->volg != NULL && ( eerste->naam == 'p' || eerste->volg->naam == 'p' ) ) { vakcijfer = eerste->cijfer; eerste->cijfer = eerste->volg->cijfer; eerste->volg->cijfer = vakcijfer; }//if }//wissel d. Bij a en b moet er een & bij (de ingangspointer gaat veranderen; bij b overigens niet als hij NULL was). Bij c hoeft het niet, de pointer verandert niet; het mag wel. e. void keerom (vak* eerste) { if ( eerste == NULL ) return; vak* p = eerste; vak* q = eerste->volg; while ( q != NULL ) { if ( q->ander == p && q->volg != NULL ) q->ander = q->volg; else q->ander = p; p = q; q = q->volg; }//while }//keerom