2013-03-23 3 views
3

Я пытаюсь создать программу секундомера, используя этот стандартный C-Free 5.0. Вот что у меня до сих пор:Программа секундомера в стандарте C

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

char button; 
int minutes=0, seconds=0, millisec=0; 

int main(void) 
{ 
    while(1) 
    { 
     reset: 
     button = '\0'; 
     int minutes=0, seconds=0, millisec=0; 
     printf(" %d : %d : %d ", minutes, seconds, millisec); 
     system("cls"); 
     if(button == 'a') 
     { 
      while(1) 
      { 
       cont: 
       button = '\0'; 
       Sleep(10); 
       millisec++; 
       if(millisec == 100) 
       { 
        millisec = 0; 
        seconds++; 
        if(seconds == 60) 
        { 
         seconds = 0; 
         minutes++; 
        } 
       } 
       printf(" %d : %d : %d ", minutes, seconds, millisec); 
       system("cls"); 
       if(button == 's') 
       { 
        while(1) 
        { 
         button = '\0'; 
         printf(" %d : %d : %d ", minutes, seconds, millisec); 
         system("cls"); 
         if(button == 'a') 
         { 
          goto cont; 
         } 
         if(button == 'd') 
         { 
          goto reset; 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Я пытаюсь запустить секундомер с прессованными кнопками «а», но это не будет работать. Использование scanf() приведет к приостановке всей программы. Есть ли способ обнаружить нажатие кнопки и продолжить программу секундомера? Я имею в виду, не останавливая программу, особенно нажатие 's', чтобы остановить и снова нажать «a», чтобы продолжить, при одновременном отображении таймера.

+0

Не в стандартной C. – md5

+0

[C-Free] (http://www.programarts.com/cfree_en/index.htm) является IDE, а не компилятор. Можете ли вы рассказать нам, с каким компилятором вы его используете? потому что в некоторых поддерживаемых библиотеках компилятора будут доступны такие функции, как 'kbhit()'. – fvu

ответ

0

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

Под Windows есть разные вызовы, которые вы должны сделать, чтобы получить нажатие клавиши.

Под Unix вы должны поместить свой tty в неканонический режим (есть набор магических вызовов tcgetattr и tcsetattr).

Смотрите, one for example

2

Поскольку вы используете system("cls");, это, вероятно, в командной строке DOS/Windows. Вы можете проверить, поддерживается ли ваш 0 компилятор conio.h.

Если это так, kbhit() or _kbhit() (ссылка на MSDN, вы должны проверить документы своих библиотек компилятора для наиболее точной ссылки), похоже, то, что вам нужно использовать.

3

Это должно помочь _kbhit, и после этого важно использовать _getch().

#include <conio.h> 

//... 

int key; 
while (1) 
{ 
    if (_kbhit()) 
    { 
     key = _getch(); 

     if (key == 'a') 
      printf("You pressed 'a'\n"); 
     else if (key == 'd') 
      printf("You pressed 'd'\n"); 
    } 
} 
+0

kbhit() полностью сработал ... удивительно .. большое вам спасибо ... ^^ –

+2

@JitzuZu, когда вы получаете ответ, вас устраивает, важно, как работает Stack Overflow, что вы принимаете ответ (нажмите отметьте в верхнем левом углу ответа). Вы не принимали никакого ответа на какие-либо из ваших вопросов, поэтому идите и проверьте их, и примите, если на них ответят. – hyde

0
#include<stdio.h> 
#include<conio.h> 
#include<dos.h> 
#include<time.h> 
#include<windows.h> 
main() 
{ 
int choice, h,m,s; h=0; m=0; s=0; //--variable declaration--// 
char p= 'p'; 
printf("Press 1 to start the timer\nPress 2 to exit\n"); 
printf("\nEnter your choice\n"); 
scanf("%d",&choice); 
switch(choice) //--switch case --// 
{ 
case 1: 
{ 
while(1) //--while condition is true// 
{ 
if(s>59) //--if seconds(s) is > 59--// 
{ 
m=m+1; //--increment minute by 1--// 
s=0; 
} 
if(m>59) //--if minutes(s) is > 59--// 
{ 
h=h+1; //--increment hour by 1--// 
m=0; 
} 
if(h>11) //--if hour(h) is > 11--// 
{ 
h=0; //-Hour to 0--// 
m=0; 
s=0; 
} 
Sleep(1000); //--inbuilt function for 1sec delay--// 
s=s+1; 
system("cls"); //--Clear screen--// 
printf("DIGITAL CLOCK"); 
printf("\n\nHOUR:MINUTE:SECOND"); 
printf("\n\n%d:%d:%d",h,m,s); //--Print time--// 
printf("\n\nTo pause : press P\n"); 
if(kbhit()) //--Check if any button is pressed on keyboard--// 
{ 
if(p==getch()) //--Check if P is pressed--// 
{ 
system("pause"); //--Inbuilt function for pause and resume--// 
} 
} 
} 
break; 
} 
case 2: 
exit(0); //--Exit --// 
default: 
{ 
printf("Wrong Choice"); 
} 
} 
getch(); //--Holding the screen--// 
return 0; 
} 
Смежные вопросы