如何在2分钟内限制程序在C中执行

时间:2013-08-21 14:49:02

标签: c

我没有任何代码但是假设用户应该在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;
                 }
             }
         }

}

我真的不知道该怎么做,请帮助我。

谢谢。

3 个答案:

答案 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)

您不能使用标准设施。输入功能会一直阻塞,直到您收到输入,然后才能再次执行代码。所以你有两个选择:

  1. 在等待输入前花些时间。当您收到输入时,请再次花时间,如果用户花了太长时间,请拒绝回答。

  2. 使用其他输入系统。例如,你可以使用Boost.Asio来完成它,虽然它并不是那么简单。

  3. https://github.com/rtsuk/liaw2013/wiki/5.3-how-to-time-the-user

答案 2 :(得分:0)

正如您所说,您使用的是Turbo C,您可以使用kbhit() Documentation Here

它是一个非便携式功能,但在Turbo C世界中,它将返回最近按下的键,或者为零。

所以你可以把它放在一个循环中,检查当前时间,以及是否有一个键被击中。