// PROGRAM cool // ニュートンの冷却の法則の数値解 #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; // 変数 counter の初期化 while(t <= tmax) { Euler(&t, &T_coffee, T_room, r, delta_t); ++counter; // 反復回数 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 は True BASIC の予約語なので,変数名には使えない (*t) = 0; // 時刻 (*T_init) = 82.3; // コーヒーの初期温度(C) (*T_room) = 17; // 室温(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); // 分 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); // 結果をスクリーンに表示 }