PowerPoint-presentatie

advertisement
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
Download