初期位置を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;
}
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
単純にC言語の問題で考えれば、こういうものはコンソールアプリケーションで十分であり
windows.hは不要だと思います。(stdio.hだけで十分だと思います)
>「初期位置を1m,落下速度を「重力加速度×1ループにかかる時間」とし,
1ループというのはプログラム上のことですか。そうであれば、これは、CPUやメモリなどの
ハードウェアに依存したあまり意味のないプログラムになるような気がします。
(ハードウェアのベンチマークが目的なら別ですが)
それと、あまりこういうものを書いたことは無いのですが
どうしても
windows.hを使いたければ
int main(void)ではなく
int winmain(void)
(大文字と小文字の区別はあまり自信が有りませんが)
になるそうです。
No.2
- 回答日時:
>というか意味が分からないです
はい、私も意味が解りません。
貴方の言葉で書かれているのでしょうか。そこで、理解違いによる表現をされているのだと思います。
「1/2×重力加速度×経過時間の二乗」ということを理解しているならば「落下速度を重力加速度×1ループにかかる時間」などという表現はしないはずです。これでは何回目のループであっても1ループにかかる時間が同じであれば落下速度は同じとなってしまいます。
そりゃ、確かに空気抵抗を考慮すれば落下速度が一定に近くなることはわかりますが、「初期位置を1m」とかしてるんだし、空気抵抗のことは全く書かれていないのだから、これは無視するということですよね。だったら、あり得ないです。
プログラミング言語がどうのこうの以前の問題です。日本語で正しく表現しましょう。それができたら、言語というくらいだから、後は翻訳するだけです。
No.1
- 回答日時:
コーディング前に「物理法則の数式モデル」を作りましたか?
モデルを漸化式で表現してからコーディングすれば実装できると思いますが。
プログラムの問題というより、数学と物理の問題です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した文字列から母音だけを...
-
プログラムで関数は使わない方...
-
Excel VBAで年度をまたぐ期間の...
-
UWSCにてある一定の動作を無限...
-
For文の終了値を関数にしても問...
-
while doについて
-
ループを途中で抜けたいのですが。
-
COBOLのEVALUATE文
-
C言語forループが完結した場合...
-
PAD図の書き方
-
入力した数値を倍々するプログラム
-
opencvの静止画保存について
-
ループについて
-
do-while文が禁止される理由
-
for文while文の無限ループの違...
-
strstr()関数の実装内容について。
-
ループ文出力から バイナリフ...
-
このC#プログラムの1〜11を埋め...
-
猫でもわかる、がわかりません。
-
放電現象の2分法C言語プログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
For文の終了値を関数にしても問...
-
UWSCにてある一定の動作を無限...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
入力した数値を倍々するプログラム
-
PIC のプログラムについて ど...
-
放電現象の2分法C言語プログラ...
-
C言語forループが完結した場合...
-
Delphiで・・・
-
While文の終わりにセミコロンが...
-
他言語で言うcontinue文
-
n重のfor文にするには?
-
フラッシュ暗算
-
for文while文の無限ループの違...
-
ループの特定入力終了
-
PAD図の書き方
-
Excel VBAで年度をまたぐ期間の...
おすすめ情報