- 締切済み
C言語に関する質問
初期位置を1mとして、ある物体の自由落下をシミュレートするプログラムを 「高さ=1-1/2×重力加速度×経過時間の二乗」 という考え方を 「初期位置を1m,落下速度を「重力加速度×1ループにかかる時間」とし, 高さを,「1ループ前の高さ」+「落下速度×1ループにかかる時間」」という考え方に変更して計算するようなプログラムにしたいのですが、どのように変えれば分かりません。(というか意味が分からないです) 何か公式などのヒントやソースコードより、どの部分をこのように変えれば良いという指摘があれば分かりやすく教えてください。 #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 double y=1; DWORD start; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); h=m=s=ms=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; y=1-(1.0/2.0)*(9.8/1000000)*ms*ms; printf("t=%d[ms],y=%f[m]\r",ms,y); //printf("t=%02d:%02d:%02d:%03d,y=%f[m]\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000,y); } //printf("%02d:%02d:%02d:%03d\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); if(c_flag==0){ printf("t=%d[ms],y=%f[m]\r",ms,y); //printf("t=%02d:%02d:%02d:%03d,y=%f[m]\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000,y); } } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; /* if(y==0){ printf("\n終了\n"); quit_flag = 0; } */ } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } } return 0; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- alwen25
- ベストアンサー率21% (272/1253)
単純にC言語の問題で考えれば、こういうものはコンソールアプリケーションで十分であり windows.hは不要だと思います。(stdio.hだけで十分だと思います) >「初期位置を1m,落下速度を「重力加速度×1ループにかかる時間」とし, 1ループというのはプログラム上のことですか。そうであれば、これは、CPUやメモリなどの ハードウェアに依存したあまり意味のないプログラムになるような気がします。 (ハードウェアのベンチマークが目的なら別ですが) それと、あまりこういうものを書いたことは無いのですが どうしても windows.hを使いたければ int main(void)ではなく int winmain(void) (大文字と小文字の区別はあまり自信が有りませんが) になるそうです。
- AkiraHari
- ベストアンサー率19% (255/1313)
>というか意味が分からないです はい、私も意味が解りません。 貴方の言葉で書かれているのでしょうか。そこで、理解違いによる表現をされているのだと思います。 「1/2×重力加速度×経過時間の二乗」ということを理解しているならば「落下速度を重力加速度×1ループにかかる時間」などという表現はしないはずです。これでは何回目のループであっても1ループにかかる時間が同じであれば落下速度は同じとなってしまいます。 そりゃ、確かに空気抵抗を考慮すれば落下速度が一定に近くなることはわかりますが、「初期位置を1m」とかしてるんだし、空気抵抗のことは全く書かれていないのだから、これは無視するということですよね。だったら、あり得ないです。 プログラミング言語がどうのこうの以前の問題です。日本語で正しく表現しましょう。それができたら、言語というくらいだから、後は翻訳するだけです。
- private3int
- ベストアンサー率28% (25/87)
コーディング前に「物理法則の数式モデル」を作りましたか? モデルを漸化式で表現してからコーディングすれば実装できると思いますが。 プログラムの問題というより、数学と物理の問題です。