我没有任何代码但是假设用户应该在2分钟内回答数学问题并生成它的分数:
示例输出1:
1+2 = *user's answer*
1+5 = *user's answer*
5+6 = *user's answer*
9+0 = *user's answer*
5+8 = *user's answer*
2+9 = *user's answer*
Time: 0:2:0:0
Time's up!
Your score: 6
示例输出2:
1+2 = *user's answer*
1+5 = *user's answer*
5+6 = *user's answer*
9+0 = *user's answer*
Time: 0:2:0:0
Time's up!
Your score: 4
代码:
void add() //Addition
{
int x,num,num2,ans,sum,score=0;
time_t t;
clrscr();
for(x=0;x<5;x++) // I tried for(x=0;x<=time();x++) but compiled error
{
srand((unsigned) time(&t));
num=rand()%9;
num2=rand()%9;
sum=num+num2;
gotoxy(30,14);
clrscr();
printf("\n%d + %d = ",num,num2);
printf("\nAns: ");
scanf("%d",&ans);
if(ans==sum)
{
score++;
}
else
{
printf("\nengggk!!!\n");
}
}
printf("\n\t\t\t ....Your score: %d",score);
pass(score);
}
void time()
{
int h,m,s;
clrscr();
for(h=0;h<12;h++)
{
for(m=0;m<60;m++)
{
for(s=0;s<60;s++)
{
printf("TIMER::\n%d:%d:%d",h,m,s);
if(m==2)
{
printf("Time's up!");
pass();
return m;
}
}
}
}
我真的不知道该怎么做,请帮助我。
谢谢。
答案 0 :(得分:2)
假设有足够类似POSIX的系统,您可以使用alarm()
signal()
或(更好)
sigaction()
。概括地说:
static volatile sig_atomic_t alarmed = 0;
static void alarm_handler(int signum)
{
signal(signum, alarm_handler); // Uses signum — probably not strictly necessary
alarmed = 1;
}
...
signal(SIGALRM, alarm_handler);
alarm(2*60);
if ((nbytes = read(line, sizeof(line), STDIN_FILENO)) > 0)
{
...process normal answer...
}
else if (nbytes == 0)
...process EOF...
else if (errno == EINTR)
...check whether alarm went off — alarm_handler should set a flag...
else
...something broke — report error...
鉴于您可能正在使用标准I / O,您将read()
更改为fgets()
并使用feof()
检查EOF,并且您可以认为您遇到了错误且没有麻烦ferror()
并执行errno
检查。在调用I / O函数之前,您可能更喜欢将errno
设置为0;但这并不是绝对必要的。
您可以通过拨打alarm(0);
来取消闹钟呼叫。
我在我的一个名为timeout
的程序中进行了挖掘,该程序运行另一个命令并等待它完成 - 但是如果它没有足够快地完成它就会超时。在评论中有一些注释可能会对您有所帮助:
/*
** On MacOS X, the signal() function is implemented using sigaction()
** and includes SA_RESTART in the options, so that when the alarm times
** out, the signal catcher is called but wait() resumes, which is
** not what's wanted. Hence, upgrade to use sigaction() directly (when
** available; assume it is available by default) without the SA_RESTART.
*/
static void set_interruptible_alarm_handler(void (*handler)(int))
{
#ifdef NO_SIGACTION
/* Unlikely to be necessary on modern POSIX systems */
signal(SIGALRM, catcher);
#else
struct sigaction act;
if (sigemptyset(&act.sa_mask) != 0)
err_syserr("sigemptyset failed: ");
act.sa_handler = handler;
act.sa_flags = 0;
if (sigaction(SIGALRM, &act, 0) != 0)
err_syserr("failed to set signal handler\n");
#endif /* NO_SIGACTION */
}
使用sigaction()
比signal()
更详细,但控件更好。
答案 1 :(得分:0)
您不能使用标准设施。输入功能会一直阻塞,直到您收到输入,然后才能再次执行代码。所以你有两个选择:
在等待输入前花些时间。当您收到输入时,请再次花时间,如果用户花了太长时间,请拒绝回答。
使用其他输入系统。例如,你可以使用Boost.Asio来完成它,虽然它并不是那么简单。
https://github.com/rtsuk/liaw2013/wiki/5.3-how-to-time-the-user
答案 2 :(得分:0)
正如您所说,您使用的是Turbo C,您可以使用kbhit()
Documentation Here
它是一个非便携式功能,但在Turbo C世界中,它将返回最近按下的键,或者为零。
所以你可以把它放在一个循环中,检查当前时间,以及是否有一个键被击中。