初期位置を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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
For文の終了値を関数にしても問...
-
ループの特定入力終了
-
ループを途中で抜けたいのですが。
-
break文でループを一気に抜ける...
-
C言語 数字を削除する関数
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
while doについて
-
aが500として ループ文の中に i...
-
エクセルでC言語のfor文と同じ...
-
#define _CRT_SECURE_NO_WARNIN...
-
Enterキーを押されたら次の処理...
-
OpenGLの惑星プログラム
-
数字以外が入力されたらエラー...
-
2÷3などの余りについて
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
小数か整数かを判定する方法
-
プログラムでの数字につく”f”の...
-
DWORDの実際の型は何でしょうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
Cプログラムが終了しない
-
プログラムで関数は使わない方...
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報