重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

現在、ストップウォッチの一時停止およびラップをとる機能のプログラムを作成しているのですが、
「計測中に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);
}
}
}

A 回答 (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);
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!