
現在、ストップウォッチの一時停止およびラップをとる機能のプログラムを作成しているのですが、
「計測中に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ランキング
-
台形の面積を求めるプログラム
-
テキストカーソル位置の取得
-
【C言語教えてください】sin波...
-
C言語
-
コマンドライン引数
-
C言語プログラミング
-
ifなんですが
-
c言語でAからZまでを表示する...
-
なぜgccはstdio.hをインクルー...
-
(C言語)めちゃくちゃな値にな...
-
(C言語)西暦年月日を入力して...
-
コンパイルすると『breakの位置...
-
改行について 1行に何個かづ...
-
分数を表示するプログラム(長...
-
プログラミング言語C
-
万年カレンダーのC言語プログラ...
-
C言語 ツェラーの公式を使った...
-
サイコロをふって、出た目のパ...
-
printf で二進表示を行いたい。
-
じゃんけんゲーム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
printf で二進表示を行いたい。
-
コマンドラインに出力した文字...
-
(C言語)めちゃくちゃな値にな...
-
c言語でAからZまでを表示する...
-
printfの出力内の文字をdefine...
-
defineで定数が置き換えられな...
-
c言語で2000年以降カレンダーを...
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
4の倍数を論理演算で表す。。
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
教えてください!!
-
Cプログラムについて
-
サイコロをふって、出た目のパ...
-
strcmp
-
じゃんけんゲームの応用
-
C言語でマウス入力(クリックや...
-
printfの有無で値が変化する
おすすめ情報