vervolg C 1 Onderwerpen voor vandaag • Parameter passing • Recursie • Code generates code Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 2 Parameter passing ‘enkelvoudige’ parameters by value int fun( int n ){ n++; return n; } int x = 9; int y = fun( x ); printf( ”%d %d\n”, x, y ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 3 Parameter passing array parameters by reference int fun( int n[] ){ n[0]++; return n[0]; } int x[] = { 8, 9, 10 }; int y = fun( x ); printf( ”%d %d\n”, x[0], y ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 4 Parameter passing Function parameters int int fun( int n, int (*f)() ){ return f( n ); } int g( int x ){ return x + 5; } int y = fun( 3, g ); Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 5 recursie Een functie hoeft niet alles zelf te doen, hij kan (andere?) functies aanroepen die een deel van het werkt doen. int max2( int a, int b ){ return a > b ? A : b; } int max3( int a, int b, int c ){ return max2( a, max2( b, c )); } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 6 Recursie : faculteit Faculteit( 0 ) == 1 Faculteit( N ) = N * Faculteit( N – 1 ) unsigned int fac( unsigned int n ){ if( n == 0 ) return 1; return n * fac( n - 1 ); } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 7 recursie Bepaal de lengte van een string int strlen( char s[] ){ int n; for( n = 0; s[ n ] != ’\0’; n++ ); return n; } int strlen( char s[] ){ if( s[0] == ’\0’ ) return 0; return 1 + strlen( s[1] ); } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 8 recursie Print een positief getal decimaal void PrInt( int x ){ if( x == 0 ){ putchar( ’0’ ); } else { while( x > 0 ){ putchar( ’0’ + x % 10 ); x = x / 10; } } } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 9 recursie Print een positief getal decimaal void PrInt2( int x ){ if( x == 0 ) return; putchar( ’0’ + x % 10 ); PrInt( x / 10 ); } void PrInt( int x ){ if( x == 0 ){ putchar( ’0’ ); } else { PrInt2( x ); } } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 10 recursie Print een positief getal decimaal void PrInt2( int x ){ if( x == 0 ) return; void PrInt2( int x ){ if( x == 0 ) return; putchar( ’0’ + x % 10 ); PrInt( x / 10 ); PrInt( x / 10 ); } void PrInt( int x ){ putchar( ’0’ + x % 10 ); } if( x == 0 ){ putchar( ’0’ ); } else { PrInt2( x ); } } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 11 recursie Zoek of een getal voorkomt in een gesorteerde array van getallen (lineair doorlopen). int IsIn( int x, int a[], int n ){ int i; for( i = 0; i < n; i++ ){ if( a[ i ] == x ) return 1; } return 0; } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 12 recursie Zoek of een getal voorkomt in een gesorteerde array van getallen (binair zoeken). int IsIn( int x, int a[], int first, int n ){ int h; if( n == 0 ) return; if( n == 1 ) return a[ first ] == x; h = n / 2; if( a[ h ] > a ){ return IsIn( x, a, 0, h ); } else { return IsIn( x, a, h, n – h ); } } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 13 recursie Bisectie : zoek het nulpunt float f( float x ){ return cos( x ) - x; } float find0( float a, float b, float d ){ float m = ( b + a ) / 2; if( b - a <= 2 * d ) return m; if( f( m ) > 0 ) return find0( a, m, d ); return find0( m, a, d ); } Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 14 Opdracht 1 ”zoek nulpunt ” Schrijf een recursieve functie die van een gegeven functie op een gegeven monotoon interval het nulpunt zoekt, met een gegeven nauwkeurigheid. Controleer of je een positieve en een negatieve functiewaarden hebt, houd er rekening mee dat het interval stijgend of dalend kan zijn. Test met cos(x)-x en cos(x)-3*x. Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 15 Sudoku check versnellen Doel : zo snel mogelijke code om een (mogelijk maar gedeeltelijk) ingevulde sudoku te checken op fouten. Idee: int SudoFastOK( SudoField s[ 81 ] ){ if(( s[0] + s[1] + s[2] … + s[8] ) != … ) return 0; if(( s[9] + s[10] + s[11] … + s[17] ) != … ) return 0; … return 1; } Dat is niet leuk om uit te schrijven, maar voor niet-leuke dingen heb je een computer… Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology vervolg C 16 Opdracht 2 ”versnel de check” Schrijf een programma dat de SudoFastOK() functie voor je schrijft. Gebruik die SudoFastOK functie in je sudoku checker. Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology