• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語)

C言語ストップウォッチの一時停止機能の修正方法

このQ&Aのポイント
  • ストップウォッチの一時停止の機能をもつC言語プログラムを修正する方法を教えてください。
  • 現在のプログラムでは一時停止しても再開できない状態です。
  • 差分をとる方法についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

追記。 「_kbhit()」は環境依存なので、当方の環境に合わせて「kbhit()」にしてある。質問者さんの環境に合わせるには「kbhit()」を「_kbhit()」に変更する事。 あと、以下のように変更すると、停止中に無駄なprintfを行わないので、CPU負荷が減る。どこがどう変わったか見比べてみよう。 #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"); 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': if (add_flag) { disp(counter); printf("\nラップ\n"); } break; case 'q': printf("\n終了\n"); return 0; } disp(counter); } } if (add_flag != 0) { counter += cur_time - start_time; disp(counter); } } }

makorin0727
質問者

補足

もうしわけありませんが、大幅には修正はせず、質問のプログラムを基に適宣追加をしてもらえないでしょうか?

その他の回答 (2)

回答No.3

>質問のプログラムを基に適宣追加をしてもらえないでしょうか? 残念ながら、ここまでグチャグチャで手の付けられないプログラムに追加修正を施して正しく動くように直す技術は当方にはありません(タテマエ) 終わってるから作りなおした方が早い(ホンネ)

回答No.1

#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"); for (;;) { disp(counter); 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': if (add_flag) { disp(counter); printf("\nラップ\n"); } break; case 'q': printf("\n終了\n"); return 0; } } } if (add_flag != 0) { counter += cur_time - start_time; disp(counter); } } }

makorin0727
質問者

補足

もうしわけありませんが、大幅には修正はせず、質問のプログラムを基に適宣追加をしてもらえないでしょうか?