#include #include #include #include #define absVal(x) ( ( (x)>0 ) ? (x) : -(x) ) #define printInt(expr) printf("Line %d: %s=%d\n", \ __LINE__, #expr, expr ) #define printArrayItem(arr,idx) printf("%s[%d]=%d\n", \ #arr, idx, arr[idx] ) int zz; void printStrings( const char *str1, ... ) { const char *nextStr; va_list argp; printf( "%s\n", str1 ); va_start( argp, str1 ); while( ( nextStr = va_arg( argp, const char * ) ) != NULL ) printf( "%s\n", nextStr ); va_end( argp ); } int (absVal)( int x ) { return x > 0 ? x : -x; } int square( int x ) { return x * x; } int cube( int x ) { return x* x * x; } struct function { char *functionName; int ( * ptrToF ) ( ); }; struct function fs[ ] = { { "cube", cube }, { "abs", absVal }, { "absVal", absVal }, { "square", square } }; int invokeFunction( const char *name, int x ) { int i; int numFunctions = sizeof( fs ) / sizeof( fs[ 0 ] ); for( i = 0; i < numFunctions; i++ ) if( strcmp( name, fs[ i ].functionName ) == 0 ) return ( *fs[ i ].ptrToF )( x ); printf( "OOPS!!! BAD FUNCTION NAME\n" ); return 0; } int intCompare( const void * lhs, const void * rhs ) { int first = *(int *)lhs; int second = *(int *)rhs; if( first < second ) return -1; else return first > second; } int main( ) { int x = 3; int y = -5; int arr[ ] = { 8, 4, 1, 12, 7, -3 }; int *ptr; int ARR_SIZE = sizeof( arr ) /sizeof( arr[ 0 ] ); int i; printInt( absVal( x ) ); printInt( absVal( y ) ) ; printInt( 5 * absVal( x+y ) ); printInt( (absVal)( ++x ) ); printInt( invokeFunction( "square", -7 ) ); printInt( invokeFunction( "abs", -4 ) ); printInt( invokeFunction( "absVal", -4 ) ); printInt( invokeFunction( "cube", 10 ) ); for( i = 0; i < ARR_SIZE; i++ ) printInt( arr[i] ); qsort( arr, ARR_SIZE, sizeof( arr[ 0 ] ), intCompare ); ptr = arr; for( i = 0; i < ARR_SIZE; i++ ) printArrayItem( ptr, i ); printStrings( "This", "is", "a", "test", ( const char *) NULL ); return 0; }