- 締切済み
C言語
ストップウォッチの一時停止の機能およびラップ機能をもつプログラムを作成しているのですが、上手く動作しません。 (一時停止し、再開してもその状態から再開できない状態) (ラップのほうはスピリットで出力されてしまう) #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 int b,c,d,e; int a; int f,g,i; DWORD start,cur; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); printf("使い方:tを押すと一時停止.一時停止中,tで計測再開\n"); printf("使い方:lを押すとラップをとる.\n"); h=m=s=ms=0; b=c=d=e=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; b=h/3600000; c=(m/60000)%60; d=(s/1000)%60; e=ms%1000; cur=timeGetTime(); ms=(cur-g); f=ms; } printf("%02d:%02d:%02d:%03d\r",b,c,d,e); } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; } else if(command=='t' && c_flag != 0) { printf("\n一時停止\n"); c_flag = 0; a=c_flag; //計測開始時にtを押すとバグが発生するため } else if(command=='t' && a==0) { printf("\n計測再開\n"); c_flag = 1; f=timeGetTime(); } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } else if(command=='l' && c_flag==1) { c_flag=0; printf("\nラップ\n"); printf("%02d:%02d:%02d:%03d\n",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); c_flag=1; } } return 0; } 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 上記のソースコードを基に適宣追加をしてくだされば幸いです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- dnp121133
- ベストアンサー率41% (12/29)
> 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 windowsでの処理系が無いので、検証した訳ではございませんが… 「command=='t' && c_flag != 0 が成立した時(一時停止)の現在時間」と 「command=='t' && a==0 が成立した時(計測再開)の現在時間」との差分を取れば、 止めていた時間(ご質問者様の言う所の差分[計測再開時間-一時停止時間])が求まります。 #ここでいう現在時間は、timeGetTime()という、現在の時刻そのもののことです。 その差分時間をstartに加えていけば、希望の動作に近づいていくのかと…。 #startって変数の役割は、最初の時間を引いておくという意味で使っているようですね。 #よって、「差分時間をstartに加えていく」という処理を追加していけば、 #カウントアップ動作をさせている時間だけを求める効果があるのかと。 #つまり、h=m=s=ms = timeGetTime() - start; って、最初の時間から、 #現在の時間を引く処理ですので、startの値を「最初の時間+差分時間」 #としてしまえば良い訳です。 > 上記のソースコードを基に適宣追加をしてくだされば幸いです。 windowsでの処理系を持っていたら、プログラムを書いて検証してからのアドバイスが できるのですが、アルゴリズムだけ考えただけのコメントです。 ソースを示したり、検証後の回答でなく、申し訳ないです…。 ソースレベルでのフォローを期待される場合は、そのような処理系をお持ちの 他の方のフォローをお待ち下さい。