/* Questo programma calcola numericamente la derivata della funzione radice quadrata in un punto. Il punto "tecnico" nuovo sono i puntatori a funzione */ #include #include #include double Function(double); double Derivative(double (*)(double),double,double); /* Notare il primo argomento che e' un puntatore ad una funzione -- per ora senza nome --che restituisce un double ed ha un argomento che e' un double */ main(){ double epsilon=1.; double x,der,DerAnalitica; double (* Ff)(); Ff=&Function; printf("Ff=%p Function=%p\n\n",Ff, Function); printf("Inserire il valore del punto in cui calcolare la derivata \n"); do{ scanf("%lf",&x); if(x==0.)printf("La derivata e' singolare nel punto scelto, ripetere la scelta\n"); }while(x==0.); DerAnalitica=0.5/sqrt(x); printf("epsilon der. num. risultato esatto per x=%f.\n\n",x); while (epsilon>1.e-18) { der=Derivative(Function,x,epsilon); /* la "funzione" viene passata con il primo argomento nella chiamata, passando in realta'il puntatore alla prima locazione di memoria che essa occupa */ printf("%e %f %f \n",epsilon,der,DerAnalitica); epsilon/=10.; } } double Function(double x){ return sqrt(x); } double Derivative(double (*f)(double),double x,double epsilon){ /*Il nome della funzione all'interno di Derivative -- f -- e'fissato nell'argomento */ double d; d = (f(x+epsilon)-f(x))/epsilon; return d; }