// PROGRAM free_fall // no air resistance #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); // initial conditions and parameters print_table(y, v, a, t, &nshow); // print initial conditions 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); // print values at surface return 0; } void initial(double *y, double *v, double *a, double *g, double *t, double *dt) { char Stmp1_[_LBUFF_]; (*t) = 0; // initial time (sec) (*y) = 10; // initial height (m) (*v) = 0; // initial velocity (*g) = 9.8; // (magnitude) of accel due to gravity (*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; // use velocity at beginning of interval // following included to remind us that acceleration is constant (*a) = -g; // y positive upward (*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); }