// PROGRAM cool // numerical solution of Newton's law of cooling #include "TrueBASIC.h" int main(); void initial(double *t, double *T_init, double *T_room, double *r, double *delta_t, double *tmax, double *nshow); void Euler(double *t, double *T_coffee, double T_room, double r, double delta_t); void output(double t, double T_coffee, double T_room); int main() { double T_coffee, T_room, counter, delta_t, nshow, r, t, tmax; initial(&t, &T_coffee, &T_room, &r, &delta_t, &tmax, &nshow); counter = 0; // initialize counter for clarity while(t <= tmax) { Euler(&t, &T_coffee, T_room, r, delta_t); ++counter; // number of iterations if(fmod(counter, nshow) == 0) output(t, T_coffee, T_room); } return 0; } void initial(double *t, double *T_init, double *T_room, double *r, double *delta_t, double *tmax, double *nshow) { double tshow; char Stmp1_[_LBUFF_]; // time is keyword in True BASIC so cannot be used as a variable (*t) = 0; // time (*T_init) = 82.3; // initial coffee temperature (C) (*T_room) = 17; // room temperature (C) printf("cooling constant r = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", r); printf("time step dt = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", delta_t); printf("duration of run = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", tmax); // minutes printf("time between output of data = "); fgets(Stmp1_, _LBUFF_, stdin); sscanf(Stmp1_, "%lg", &tshow); (*nshow) = (int)(tshow/(*delta_t) + 0.5); output(*t, *T_init, *T_room); } void Euler(double *t, double *T_coffee, double T_room, double r, double delta_t) { double change; change = -r*((*T_coffee) - T_room)*delta_t; (*T_coffee) += change; (*t) += delta_t; } void output(double t, double T_coffee, double T_room) { if(t == 0) { printf("\n"); printf(" time (min) T_coffee T_coffee - T_room\n"); printf("\n"); } printf("%12f %12f %12f\n", t, T_coffee, T_coffee - T_room); // show results on screen }