0

コードはありませんが、ユーザーは数学の質問に 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;
                 }
             }
         }

}

どうすればいいのか本当にわからないので、助けてください。

ありがとうございました。

4

3 に答える 3

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()EOF をチェックするとfeof()、問題なくエラーが発生したと想定してferror()チェックを実行できerrnoます。errnoI/O 関数を呼び出す前に 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 */
}

Usingsigaction()は よりも冗長ですsignal()が、制御は優れています。

于 2013-08-21T15:13:36.727 に答える
0

標準設備ではできません。入力関数は、入力を受け取るまでブロックされ、それから初めてコードを再度実行できます。したがって、次の 2 つのオプションがあります。

  1. 入力を待つ前に時間をかけてください。入力を受け取ったら、もう一度時間を取ります。ユーザーが時間がかかりすぎた場合は、回答を拒否します。

  2. 別の入力システムを使用してください。たとえば、Boost.Asio を使用して実行できますが、それほど簡単ではありません。

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

于 2013-08-21T14:54:30.667 に答える
0

Turbo C を使用していると言ったように、使用できますkbhit()
ドキュメントはこちら

これは移植性のない関数ですが、Turbo C の世界では、最近押されたキーまたはゼロを返します。

そのため、現在の時刻とキーが押されたかどうかをチェックするループに入れることができます。

于 2013-08-21T15:24:08.517 に答える