// PROGRAM integ // x = a から x = b までの区間の f(x) の積分を計算する // 長方形近似を使う #include "TrueBASIC.h" #define f(x) (cos((x))) int main(); void initial(double *a, double *b, double *sum, double *dx, double *delta, int *n); void sumf(double a, double b, double *sum, double dx, double delta); void Double(double *dx, double *delta, int *n); void output(double sum, double dx, int n); int main() { int k, n; double a, b, delta, dx, sum; initial(&a, &b, &sum, &dx, &delta, &n); do { sumf(a, b, &sum, dx, delta); output(sum, dx, n); Double(&dx, &delta, &n); } while(!(kbhit())); k = getch(); return 0; } void initial(double *a, double *b, double *sum, double *dx, double *delta, int *n) { char Stmp1_[_LBUFF_]; printf("lower limit a = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", a); printf("upper limit b = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", b); (*n) = 2; // 区間数の初期値 (*dx) = ((*b) - (*a))/(*n); (*delta) = (*dx); // n = 2 の場合だけ delta = dx (*sum) = f((*a)); // 台形近似を使うときには (f(a) + f(b))/2 にする printf("\n"); printf(" n rectangular approximation\n"); printf("\n"); } void sumf(double a, double b, double *sum, double dx, double delta) { double x; x = a + dx; // dx は積分の区間幅 while(x < b) { (*sum) += f(x); x += delta; } } void Double(double *dx, double *delta, int *n) // 区間数を2倍にする { (*delta) = (*dx); (*n) *= 2; (*dx) *= 0.5; // n > 2 では dx は delta に等しくない } void output(double sum, double dx, int n) { printf("%7d ", n); printf(" "); printf("%12.7f\n", sum*dx); }