2016-06-01 103 views
1

我在寫一個簡單的程序來幫助我的侄女學習她的乘法表。爲了防止她花太長時間,我想使用一個計時器,經過一段時間後,程序會自動跳到下一個問題而不輸入任何內容。如果此時程序做到這一點,它會讓計數器,顯示有多少次她跑出來的時候,是這樣的:在設定的時間後自動繼續下一個語句

if(table_to_test == 2) 
     { 
      finish = clock() + time_to_complete; 
      ++tries; 
      printf("2 x 8 = "); 
      scanf("%d", &answer); 
      if(answer == 16 && (clock() < finish)) 
      { 
       printf("Correct!\n"); 
       ++amount_correct; 
      } 
      else if(answer != 16 && (clock() < finish)) 
      { 
       printf("\aWrong!\n"); 
      } 
      else if(clock() > finish) 
      { 
       printf("\aTime's up!\n"); 
       ++ran_out_of_time; 
      } 
     } 

成績是她在計時器跳到下一個問題之前,多久了,而time_to_complete是用戶在自動跳到下一個問題之前輸入了多長時間的程序。

每當我運行這個程序時,無論輸入答案有多快,程序都會輸出「Time's up!」。線。

time_to_complete和終點都是int類型

+0

你是否檢查time_to_complete的單位?例如(秒,毫秒,微秒) – tigris

+0

在輸入答案後,爲什麼不將'clock()'返回的值存儲在新變量中,然後使用調試器來跟蹤值? – mathematician1975

+0

附註:由於[Man](http://man7.org/linux/man-pages/man3/clock.3.html)表示時鐘函數返回'clock_t'類型。我提出了重複,因爲'scanf'在用戶輸入數據之前阻塞了代碼。 – LPs

回答

-1

你指定time_to_complete變量,時間爲秒?

嘗試改變時鐘()的調用爲以下函數調用:

clock_t clock_wrapper() 
{ 
    return clock()/CLOCKS_PER_SEC; 
} 

if(table_to_test == 2) 
    { 
     finish = clock_wrapper() + time_to_complete; 
     ++tries; 
     printf("2 x 8 = "); 
     scanf("%d", &answer); 
     if(answer == 16 && (clock_wrapper() < finish)) 
     { 
      printf("Correct!\n"); 
      ++amount_correct; 
     } 
     else if(answer != 16 && (clock_wrapper() < finish)) 
     { 
      printf("\aWrong!\n"); 
     } 
     else if(clock_wrapper() > finish) 
     { 
      printf("\aTime's up!\n"); 
      ++ran_out_of_time; 
     } 
    } 

CLOCKS_PER_SEC是分路器,用來轉換時鐘秒。

+0

啓動程序,運行直到'scanf',去做咖啡。在用戶實際輸入內容之前,您無法分辨是否花了太長時間。 – Lundin

+0

我看不到來自問題文本的sscanf中斷的要求。 如果在簡單情況下需要,我們可以在POSIX兼容的操作系統上使用alarm()調用和SIGTERM處理程序。 –

+0

「在沒有輸入任何內容的情況下自動跳到下一個問題」 – Lundin

1

你不能用scanf做到這一點,它太鈍了 - 如果用戶沒有輸入任何內容,它將永遠鎖定程序。

您將不得不使用一些操作系統特定的非標準控制檯功能,該功能允許您在不等待用戶的情況下查看控制檯輸入。結合使用此功能的計時器會在時間到了時標記出您的位置。

你沒有提到你正在使用哪個系統。有Linux ncurses或Windows「console API」等,它們都不是標準C.

專業解決方案涉及使用多線程,但這可能有點矯枉過正。

+0

我使用的是Windows,而我的編譯器是CodeBlocks。我不一定需要完全按照原樣使用此代碼。有沒有另外一種方法來實現這種類型的計時器? – ThE411

+0

@ ThE411 Codeblocks是一個IDE,而不是編譯器。我猜你正在使用gcc/mingw。你會想看看Windows API'PeekConsoleInput',[這裏是示例](http://stackoverflow.com/questions/9782287/undefined-reference-to-gotoxy-in-c/9783195#9783195)。至於計時器,有很多不同的選項,如[this](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644901%28v=vs.85%29.aspx)。 – Lundin

相關問題