プログラミングにもスパイスを

#include
#include
#include
#include

#define MIN_STAGE 1 /* 最小ステージ数 */
#define MAX_STAGE 10 /* 最大ステージ数 */
#define LEVEL_MIN 3 /* 最小レベル(桁数) */
#define LEVEL_MAX 20 /* 最大レベル(桁数) */

/*--- xミリ秒経過するのを待つ ---*/
     int sleep(unsigned long x)
     {
     clock_t c, s = clock();

     do{
         if*1 == (clock_t) - 1) /* エラー */
               return (0);
     }while(1000UL * (c - s) / CLOCKS_PER_SEC < x);
     return (1);
}

int main(void)
{
     int i, stage;
     int user_stage;     /* ステージ数 */
     int level;       /* レベル(数値の桁数)*/
     int success = 0;    /* 正解数 */
     clock_t start, end;  /* 開始時間・終了時間 */

     printf("数字記憶トレーニング\n");
     do{
         printf("挑戦するレベル(%d〜%d):", LEVEL_MIN, LEVEL_MAX);
         scanf("%d", &level);
     }while(level < LEVEL_MIN || level > LEVEL_MAX);
     do{
         printf("挑戦する回数(%d〜%d):",MIN_STAGE, MAX_STAGE);
         scanf("%d", &user_stage);
     }while(user_stage < MIN_STAGE || user_stage > MAX_STAGE);

     printf("%d桁の数値記憶%d回挑戦しましょう。\n", level, user_stage);

     start = clock();
     for(stage = 0; stage < user_stage; stage++){
         char no[LEVEL_MAX + 1];     /* 記憶すべき数字の並び */
         char x[LEVEL_MAX + 2];     /* 読み込んだ数字の並び */

         no[0] = '1' + rand() % 9;   /* 先頭数字は'1'〜'9' */
         for (i = 1; i < level; i++)
              no[i] = '0' + rand() % 10; /* それ以降は'0'〜'9' */
         no[level] = '\0';

         printf("%s", no);
         fflush(stdout);
         sleep(125 * level); /* 問題提示は 125*levelミリ秒 */

         printf("\r%*s\r入力せよ:", level, "");
         scanf("%s", x);

         if (strcmp(no, x) != 0)
              printf("\a間違いです。\n");
         else{
              printf("正解です。\n");
              success++;
         }
     }
     end = clock();

     printf("%d回中%d回成功しました。\n", user_stage, success);
     printf("%.1f秒でした。\n", (double)(end - start) / CLOCKS_PER_SEC);

     return(0);
}

 今は『たのしいC』という本を読んでいます。
 「読んでいる」といっても、題材を打ち込んで、コンパイラして実行してみているだけです。
 正直、それだけだと写経と同じで“単純作業”に陥ります。


 そこで、予め“こんな事できるかな?”と題材と若干違うコードにしてみます。
 そうすることで、何がどう“引数”“変数”“ポインタ”“繰り返し文”なのか分かってきます。


 創意工夫は結構大事ですね。

*1:c = clock(