/* ""の部分を自分で埋めてプログラムを完成してください。 */ #include int main(void) { /* 浮動小数点型の定数gは重力加速度を表す。 */ float g = 9.81; /* 浮動小数点型の定数dtは時間間隔、 整数型の定数imaxは時間積分の回数を表す。 */ float dt = 0.01; int imax = 500; /* 変数を宣言する。 */ int i; float ui, wi, u, w, x, z, up, wp, xp, zp, um, wm, xm, zm; /* ファイルポインタfpを宣言する。 */ FILE *fp; /* 入力を求めるメッセージを標準出力に書き出す。 */ printf( "%s\n", "u_init, w_init?" ); /* scanf文で入力値を読みこむ。 */ scanf( "%f,%f", &ui, &wi ); /* 水平速度U、鉛直速度W、水平座標X、鉛直座標Zに初期値を代入する。 uにui、wにwi、xとzに0.を代入する。 */ u = ; w = ; x = ; z = ; /* ファイルを開く。 モードは"w"(テキストファイルへの書き出し)を指定する。 */ fp = fopen( "output.txt", "w" ); /* 水平座標xと鉛直座標zの初期値を ファイルポインタfpで指定されたファイルに書き出す。 書式は" %9.3f %9.3f"を指定する。 "%9.3f"は全体が9ケタで小数点以下が3ケタの浮動小数点という意味である。 */ fprintf( fp, " %9.3f %9.3f\n", x, z ); /* ==== ここから1回目の時間積分 ==== */ /* ここから時間積分のためのforループが始まる。 差分化された運動方程式にしたがって、 u+、w+、x+、z+を計算する。 ここでは、オイラー法によって、u、w、x、zから、 u+、w+、x+、z+を計算する点に注意する。 */ up = ; wp = ; xp = ; zp = ; /* u、w、x、zの値をu-、w-、x-、z-に、 u+、w+、x+、z+の値をu、w、x、zに代入して、 時間ステップをひとつ進める。 */ um = ; wm = ; xm = ; zm = ; u = ; w = ; x = ; z = ; /* 水平座標xと鉛直座標zの値を ファイルポインタfpで指定されたファイルに書き出す。 書式は" %9.3f %9.3f"を指定する。 "%9.3f"は全体が9ケタで小数点以下が3ケタの浮動小数点という意味である。 */ fprintf( fp, " %9.3f %9.3f\n", , ); /* ==== ここまで1回目の時間積分 ==== */ /* ==== ここから2回目以降の時間積分 ==== */ /* ここから時間積分のためのforループが始まる。 (imax-1)回だけ反復する。 */ for (i=0; i<=imax-2; i++) { /* ここから時間積分のためのforループが始まる。 差分化された運動方程式にしたがって、 u+、w+、x+、z+を計算する。 ここでは、リープフロッグ法を用いる点に注意する。 */ up = ; wp = ; xp = ; zp = ; /* u、w、x、zの値をu-、w-、x-、z-に、 u+、w+、x+、z+の値をu、w、x、zに代入して、 時間ステップをひとつ進める。 */ um = ; wm = ; xm = ; zm = ; u = ; w = ; x = ; z = ; /* 水平座標xと鉛直座標zの値を ファイルポインタfpで指定されたファイルに書き出す。 書式は" %9.3f %9.3f"を指定する。 "%9.3f"は全体が9ケタで小数点以下が3ケタの浮動小数点という意味である。 */ fprintf( fp, " %9.3f %9.3f\n", , ); /* ここでforループが終了する。 */ } /* ==== ここまで2回目以降の時間積分 ==== */ /* ファイルを閉じる。 */ fclose( fp ); return 0; }