2016-07-26 3 views
-1

Я пишу программу таблицы умножения, чтобы помочь моей племяннице учиться. Я хочу, чтобы у нее было определенное количество времени, чтобы ответить на каждый вопрос (отсюда цикл for, который действует как задержка). Задержка срабатывает, как после задержка секунд выдает программы «Время вверх»! Тем не менее, программа все еще ждет ввода значения и нажмите клавишу ввода до того, как он оценит ответ и проверяет, является ли он «правильным» или «неправильным» (это не исправлено, поставив printf и scanf после цикла for вместе внутри цикла). Я знаю, что задержка просто ждет несколько секунд, а затем продолжается как обычно, поэтому мне нужно ввести номер и нажать enter. Однако я не знаю, как обойти это.Чтение значения с помощью таймера в C

В принципе, я хочу, чтобы программа автоматически «вводила», если задержка секунд прошло, и она не указала значение, в результате чего ответ был «неправильным». Но если она вводит значение и нажимает ввод до , то задержка секунд закончилась, я хочу по-прежнему проверить, является ли она «правильной» или «неправильной». Я искал другие способы сделать это, но я просто не могу понять это правильно. Это код до сих пор (опять же, я знаю, что за задержку петли только позволяет программе ждать задержку секунд, прежде чем продолжить нормально, но я не знаю, чтобы обойти это

time_t start_time = 0; 
int delay = 0; 
int answer = 0; 
int correct = 0; 
int wrong = 0; 

printf("How long should the delay be?:\t"); 
scanf("%d", &delay); 

start_time = clock(); 
printf("\n2 x 4 =\t"); 

for(;clock() - start_time <= delay*CLOCKS_PER_SEC;); 

printf("\n\nTime's up!\n\n"); 
scanf("%d", &answer); 

if(answer == 8) 
{ 
    printf("\nCorrect!\n"); 
    ++correct; 
} 
else if(answer != 8) 
{ 
    printf("\n\aWrong!\n"); 
    ++wrong; 
} 

EDIT:. Я запускать Windows и использовать CodeBlocks с mingw32.Я просто хочу, чтобы программа была простым .exe-файлом, который будет работать через CMD. (Он делает это уже, хотя).

+0

Это сильно зависит от ОС (Windows, Linux, ...). –

+0

Я спросил, но кто-то просто направил меня на веб-страницу с таймерами, когда я задал вопрос без кода с ним, я проверил эту веб-страницу, и это то, как далеко я пришел, но сейчас я в тупике. Я отредактирую сообщение с моей ОС и IDE и компилятором. – ThE411

+0

Посмотрите на [этот вопрос SO] (http://stackoverflow.com/questions/19955617/win32-read-from-stdin-with-timeout), но это не прямолинейно. Вероятно, вам нужно переписать функции ввода, чтобы заменить scanf (что является хорошей идеей, так как scanf, если vey bad, если пользовательский ввод не может быть предсказан). –

ответ

0

Я думаю, вы можете использовать потоки в этом случае! будет основной нить, а другой поток будет для ввода ответа на вопрос. Другой поток начнется, когда основной поток будет приостановить/приостановить его выполнение и будет работать до тех пор, пока основной поток не будет возобновлен. Затем вы можете проверить значение переменной «ответ» и отобразить соответствующее сообщение. Я не так хорошо знаком с нитью в C. Вы можете ссылаться на эту ссылку для ссылок: https://msdn.microsoft.com/en-us/library/y6h8hye8.aspx

+0

Stackoverflow - это не то место, где вы набросаете отрывочные решения. Как только вы перейдете к специфике, вы увидите, что предлагаемое нечеткое решение не помогает. Это средний ответ от неопытных разработчиков программного обеспечения, когда сталкивается с проблемой параллелизма: используйте больше потоков! Извините, [это не решение] (http://stackoverflow.com/questions/38593588/reading-a-value-with-a-timer-in-c#comment64621042_38593588). – IInspectable

1

Ваша цель не может быть достигнута с помощью scanf(), поскольку это блокирующий вызов. Следующая строка кода не будет выполняться до тех пор, пока пользователь не войдет во вход , Это не то, что вы хотите.

Вы можете использовать другую библиотечную функцию kbhit() - Он возвращает> 0, если нажата любая клавиша. Но это не даст вам ключа. Для этого вы должны позвонить getch().

kbhit является частью conio.h

Так что ваш код будет:

bool bAnswered = false; 
for(;clock() - start_time <= delay*CLOCKS_PER_SEC;) 
{ 
    if(kbhit() > 0) //Some key is pressed 
     { 
      answer = getch(); //Read that key 
      bAnswered = true; // User has answered 
     } 
} 

// Print message if there wasn't any key press. 
if(bAnswered == false) 
{ 
printf("\n\nTime's up!\n\n"); 
} 

if(answer == 8) 
{ 
    printf("\nCorrect!\n"); 
    ++correct; 
} 
else if(answer != 8) 
{ 
    printf("\n\aWrong!\n"); 
    ++wrong; 
} 

Проблема с выше кода вы можете прочитать только один символ за один раз. Я оставляю это для вас. Кроме того, вам нужно написать дополнительный код для преобразования ASCII в целое число, так как getch() возвращает символ ASCII.

+0

Спасибо, я так долго боролся. Я новичок в C, и люди продолжают замечать мои сообщения, но факт в том, что я все еще пытаюсь многому научиться. Еще раз спасибо. – ThE411

+0

OK теперь реализуйте редактирование строк поверх этого (если вы не намереваетесь наказать своих пользователей за исправление опечаток). –

-1

Спасибо, что потратили время, убедившись, что ваша племянница учится математике! Мастерство, в котором мы все нуждаемся.

https://gist.github.com/DaemonDave/b2eda8f9fa6b8bbf90a5e1fc1147a461

<script src="https://gist.github.com/DaemonDave/b2eda8f9fa6b8bbf90a5e1fc1147a461.js"></script>

This works as I claimed.

Вот рабочий файл по математике-tester.c, который работает на Ubuntu Linux с GCC. Вам не нужен conio, я нашел функцию.

Я использую 3 вещи для достижения ваших требований. Я использую kbhit для проверки символов для проверки, я использую sleep для ожидания вторых интервалов в цикле while, и я использую ввод из командной строки для запроса временной задержки в секундах.

Наслаждайтесь!

0

Этот в основном работает. Я не могу проверить случай, когда пользователь начинает печатать, а затем истекает время ожидания. Я думаю, что он должен работать в Windows, но я могу тестировать только под эмуляцию Windows, которая не идеальна. Пользователь может нажать кнопку «Назад» перед вводом следующего ответа.

#include <windows.h> 
#include <process.h> 
#include <stdio.h> 
#include <stdlib.h> 

int answer = 0; 

DWORD WINAPIinput_thread(void*) 
{ 
    scanf("%d", &answer); 
    return 0; 
} 

int main() 
{ 
    srand(time(0)); 

    HANDLE h = (HANDLE)_beginthreadex(0, 5000, input_thread, 0, 0, 0); 
    while (1) { 
     int u = rand() % 7 + 2; 
     int v = rand() % 7 + 2; 
     printf ("%d * %d = ? ", u, v); 

     DWORD res = WaitForSingleObject(h, 20000); 

     if (res == WAIT_TIMEOUT) 
     { 
      printf ("\nSorry, timed out!\n"); 
      FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); 
     } 
     else 
     { 
      if (answer == u * v) 
      { 
       printf ("Congrats, you won!\n"); 
      } 
      else 
      { 
       printf ("Sorry, wrong answer!\n"); 
      } 
      CloseHandle(h); 
      h = (HANDLE)_beginthreadex(0, 5000, input_thread, 0, 0, 0); 
     } 
    } 

} 
Смежные вопросы