
現在、ストップウォッチの一時停止およびラップをとる機能のプログラムを作成しているのですが、
「計測中に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言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
TeraPadの設定方法
-
*を使ったジグザグのラインをプ...
-
wsprintfの書式制御文字列につ...
-
現在時刻の表示について
-
C言語の問題です
-
C言語 プログラミング
-
CTRL+Dでループを抜けるには
-
テキストカーソル位置の取得
-
パスカルの三角形についてのCプ...
-
空Enterの扱い方
-
cshの文字列操作(0埋め)
-
文字を動かしたい
-
すごろくに使用するサイコロ
-
C言語での、年複利の計算方法...
-
error C2143: 構文エラー : ';'...
-
C++ 二次関数の重解、虚数解が...
-
三角形の判別
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報