- ベストアンサー
C言語ストップウォッチの一時停止機能の修正方法
- ストップウォッチの一時停止の機能をもつC言語プログラムを修正する方法を教えてください。
- 現在のプログラムでは一時停止しても再開できない状態です。
- 差分をとる方法についても教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
追記。 「_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); } } }
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>質問のプログラムを基に適宣追加をしてもらえないでしょうか? 残念ながら、ここまでグチャグチャで手の付けられないプログラムに追加修正を施して正しく動くように直す技術は当方にはありません(タテマエ) 終わってるから作りなおした方が早い(ホンネ)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
#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); } } }
補足
もうしわけありませんが、大幅には修正はせず、質問のプログラムを基に適宣追加をしてもらえないでしょうか?
補足
もうしわけありませんが、大幅には修正はせず、質問のプログラムを基に適宣追加をしてもらえないでしょうか?