// PROGRAM free_fall // 空気抵抗なし #include "TrueBASIC.h" int main(); void initial(double *y, double *v, double *a, double *g, double *t, double *dt); void Euler(double *y, double *v, double *a, double g, double *t, double dt); void print_table(double y, double v, double a, double t, int *nshow); int main() { int counter, nshow; double a, dt, g, t, v, y; initial(&y, &v, &a, &g, &t, &dt); // 初期条件とパラメータの設定 print_table(y, v, a, t, &nshow); // 初期条件を出力する counter = 0; while(y >= 0) { Euler(&y, &v, &a, g, &t, dt); if((++counter % nshow) == 0) print_table(y, v, a, t, &nshow); } print_table(y, v, a, t, &nshow); // 地面での値を出力する return 0; } void initial(double *y, double *v, double *a, double *g, double *t, double *dt) { char Stmp1_[_LBUFF_]; (*t) = 0; // 時刻の初期値 (sec) (*y) = 10; // 高さの初期値 (m) (*v) = 0; // 初速度 (*g) = 9.8; // 重力加速度(の大きさ) (*a) = -(*g); printf("time step dt = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", dt); } void Euler(double *y, double *v, double *a, double g, double *t, double dt) { (*y) += (*v)*dt; // 区間の初めでの速度を使う // 加速度が一定であることを忘れないように次の行を入れておく (*a) = -g; // y 軸は上方が正 (*v) += (*a)*dt; (*t) += dt; } void print_table(double y, double v, double a, double t, int *nshow) { char Stmp1_[_LBUFF_]; if(t == 0) { printf("number of time steps between output = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%d", nshow); printf("\n time (s) y (m) velocity (m/s) accel (m/s^2)\n\n"); } printf("%12f %12f %12f %12f\n", t, y, v, a); }