
現在、ストップウォッチの一時停止およびラップをとる機能のプログラムを作成しているのですが、
「計測中にtを押すと一時停止.一時停止中にtで計測再開」の部分は計測していないときに計測が開始されてしまいます。(計測中の処理は上手く動作できました)
「計測中にlを押すとラップをとる」という使い方の部分も同様に計測していないときに計測が開始されてしまいます。それから、実際に計測中にlを押したとき、ラップタイムではなく、スピリットタイムで表示されてしまい、上手く動作しません。
至急、修正または追加のほうお願いします。
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <conio.h>
#pragma comment(lib, "winmm.lib")
void disp(DWORD time_value)
{
printf("%02d:%02d:%02d:%03d\r",time_value/3600000,(time_value/60000)%60,(time_value/1000)%60,time_value%1000);
}
int main(void)
{
int add_flag = 0;
DWORD counter=0,start_time,cur_time;
printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n");
printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n");
printf("使い方:qでプログラム終了\n\n");
printf("使い方:計測中にtを押すと一時停止.一時停止中にtで計測再開\n");
printf("使い方:計測中にlを押すとラップをとる\n");
disp(counter);
for (;;){
start_time = timeGetTime();
while (start_time == (cur_time = timeGetTime()))
{
if (kbhit()) {
switch (_getch()){
case 's':
disp(counter);
printf(add_flag ? "\n計測中止\n" : "\n計測開始\n");
add_flag = !add_flag;
start_time = cur_time = timeGetTime();
counter = 0;
break;
case 't':
disp(counter);
printf(add_flag ? "\n一時停止\n" : "\n計測再開\n");
add_flag = !add_flag;
start_time = cur_time = timeGetTime();
break;
case 'r':
disp(counter);
printf("\nカウンタリセット,停止\n");
add_flag = 0;
counter = 0;
start_time = cur_time = timeGetTime();
break;
case 'l':
disp(counter);
printf("\nラップ\n");
add_flag = 1;
break;
case 'q':
printf("\n終了\n");
return 0;
}
disp(counter);
}
}
if (add_flag != 0){
counter += cur_time - start_time;
disp(counter);
}
}
}
No.1ベストアンサー
- 回答日時:
計測開始・終了と一時停止・再開を同じadd_flagで管理しているので、't'が's'が動作制御的に同じ意味になってしまっています。
あとラップですが、ラップタイムは前回'l'を押した時からの経過時間ですよね、であれば'l'押下時のcounterを覚えておいて差分を取らなければならないという話だと思います。
という感じで修正してみましたが、どうでしょう。
int add_flag = 0;
int t_flg = 0;
DWORD counter=0,start_time,cur_time;
DWORD lap = 0;
printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n");
printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n");
printf("使い方:qでプログラム終了\n\n");
printf("使い方:計測中にtを押すと一時停止.一時停止中にtで計測再開\n");
printf("使い方:計測中にlを押すとラップをとる\n");
disp(counter);
for (;;){
start_time = timeGetTime();
while (start_time == (cur_time = timeGetTime()))
{
if (kbhit()) {
switch (_getch()){
case 's':
disp(counter);
printf(add_flag ? "\n計測中止\n" : "\n計測開始\n");
add_flag = !add_flag;
t_flg = 1;
start_time = cur_time = timeGetTime();
counter = 0;
break;
case 't':
disp(counter);
printf(add_flag ? "\n一時停止\n" : "\n計測再開\n");
t_flg = !t_flg;
start_time = cur_time = timeGetTime();
break;
case 'r':
disp(counter);
printf("\nカウンタリセット,停止\n");
add_flag = 0;
counter = 0;
start_time = cur_time = timeGetTime();
break;
case 'l':
disp(counter - lap);
lap = counter;
printf("\nラップ\n");
break;
case 'q':
printf("\n終了\n");
return 0;
}
disp(counter);
}
}
if ((add_flag != 0) && (t_flg != 0)){
counter += cur_time - start_time;
disp(counter);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
H8マイコンCでprintf/scanfが使...
-
「%n」や「%S」は何故恥ずかし...
-
C言語プログラミング
-
C言語の勉強しています。すみま...
-
C言語で四則演算を使って10を作...
-
ピラミッド表示プログラム。
-
ホームページをC言語で作りたい...
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
Cプログラムについて
-
コマンドラインに出力した文字...
-
WM_CLOSEで閉じれないウィンド...
-
C言語の&に関する質問
-
すごろくに使用するサイコロ
-
文字と数字の判定について
-
printf( " %2d", p * q );
-
【C言語教えてください】sin波...
-
%P と %X の違い
-
C言語の勉強しています。すみま...
-
strcmp
-
c言語でAからZまでを表示する...
-
unsigned int型について
-
(C言語)めちゃくちゃな値にな...
-
printf で二進表示を行いたい。
-
プログラミング C言語 課題でプ...
-
c言語で2000年以降カレンダーを...
おすすめ情報