/* use function pointers */
#include <stdio.h>
#include <string.h>

double f(double x)
{
     return x * x;
}

double fPrime(double x)
{
     return 2 * x;
}

double fPrimePrime(double x)
{
     return 2;
}

int add(int a1, int a2)
{
     return a1 + a2;
}

int mult(int a1, int a2)
{
     return a1 * a2;
}

int subt(int a1, int a2)
{
     return a1 - a2;
}

int apply_func(int (*fptr)(int a1, int a2),
	       int a1, int a2)
{
     return fptr(a1, a2);
}

int main()
{
     int a1, a2;
     char command[5];
     double d;
     double (*fptr[3])(double x);
     int (*arithmetic)(int a1, int a2);

     fptr[0]= f;
     fptr[1]= fPrime;
     fptr[2]= fPrimePrime;

     printf("Type a double value: ");
     scanf("%lf", &d);
     printf("f(%f) is %f\n", d, fptr[0](d));
     printf("f'(%f) is %f\n", d, fptr[1](d));
     printf("f''(%f) is %f\n", d, fptr[2](d));

     printf("Type one of add, mult, subt: ");
     scanf("%s", command);
     printf("Type two integers: ");
     scanf("%d %d", &a1, &a2);
     if (!strcmp(command, "add")){
	  arithmetic= add;
     } else if(!strcmp(command, "mult")){
	  arithmetic= mult;
     }else {
	  arithmetic= subt;
     }
     printf("Result: %d\n", (*arithmetic)(a1, a2));

     return 0;
}

