課題1 
double euler(double (*fnc)(double, double), double t, double x, double h){
 return (x + (*fnc)(t, x) * h);
}

形だけは簡単ですよね?おそらく数学的にはx(t), dx(t)/dtではないかと考えるかと思いますが、
ここでの数値計算では、xもtもただの変数としてとらえます。
(*fnc)(t, x)はt, xと(*fnc)を送って戻り値を獲得すると考えてください。

課題2
#include <・・・>

double euler(double (*fnc)(double, double), double t, double x, double h){
・・・
 double fnc(double t, double x){
 double b=0.02;
 double a=0.1;
 double g=9.807;
 return (-1.0*b*x*x - a*x + g);
}

main(){
 static double t, h, t0, tn, x;
 static int i, n;
 FILE *fp;

 if ((fp = fopen("dat.txt", "r")) == NULL) {
  printf("file open error!!\n");
  exit(EXIT_FAILURE); /* (3)エラーの場合は異常終了 */
 }
 t0=0.0;
 x=0.0;
 tn=5.0;
 h=0.001;
 n=(int)((tn-t0)/h);
 x = x0 + i * h;
 fprintf(fp, "%f %f\n", t, x);
 
 for(i=0; i<n; i++){
  x = euler(fnc, t, x, h);
  fprintf(fp, "%f %f\n", t, x);
 }
 fclose(fp);
}