Ciao a tutti
Sono alle prime armi in C, e devo risolvere un problema riguardo il risolvimento di un programma che calcoli l' integrale tra 0 e pi/2 di sqrt (sin(x))dx.
Ho trovato questo sorgente, qualcuno è in grado di spiegarmelo a grandi linee?
GRAZIE MILLE PER L' AIUTO! 






ps: NATURALMENTE LA PRIMA PARTE LA CAPISCO, SE MI POTETE SPIEGARE QUANDO INIZIANO LE FUNZIONI (RETTANGOLO, TRAPEZIO E SIMPSON)....AH E ANCHE A COSA SERVE IL PUNTATORE (*fp)
GRAZIEEEEEEEEEEEEE 





codice:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define A 0 /* Estremi dell’intervallo di integrazione A e B */
#define B M_PI/2 /* M_PI è la costante pigreco in C*/
double funzione(double x);
double rettangoli(double(*fp)(double), double a, double b, int n); //sintassi funzione: tipo di ritorno (*nome puntatore)(parametro1, parametro2...")//
double trapezi(double(*fp)(double), double a, double b, int n);
double simpson(double(*fp)(double), double a, double b, int n);
int main(void) //Inizio del Main//
{
int k, n;
for (k=0;k<=11;k++)
n=pow(2,k);
printf(" INTEGRATE from 0 to pi/2 of sqrt sen(x)dx\n\n\n");
printf("\n RISULTATI CON I VARI METODI:\n\n\n");
printf("Metodo dei rettangoli: %f\n", rettangoli(funzione, A, B, n));
printf("Metodo dei trapezi : %f\n", trapezi(funzione, A, B, n));
printf("Metodo simpson : %f\n", simpson(funzione, A, B, n));
system ("pause");
return 0;
}
double funzione(double x)
{
return sqrt(sin(x)); /* Funzione da integrare */
}
double rettangoli(double(*fp)(double), double a, double b, int n) //funzione metodo del rettangolo o MID POINT//
{
double h=0, value=0, i=0;
h=(b-a)/n;
for(i=0;i<b;i+=h) value+=h*(*fp)(i+h/2);
return value;
}
double trapezi(double(*fp)(double), double a, double b, int n) //funzione metodo dei trapezi//
{
double h=0, value=0, i=0;
h=(b-a)/n;
for(i=0;i<b;i+=h) value+=(((*fp)(i)+(*fp)(i+h))*h/2);
return value ;
}
double simpson(double(*fp)(double), double a, double b, int n) //funzione metodo di cavalieri-simpson//
{
double h=0, i=0, pari=0, dispari=0;
int j=0;
if ( n % 2 ) ++n;
h=(b-a)/n;
for(i=0+h;i<b;i+=h){
if(j%2==0) pari+=(*fp)(i);
else dispari+=(*fp)(i);
j++;
}
return h* ((*fp)(a)/3 + 4*pari/3 + 2*dispari/3 + (*fp)(b)/3);