プログラミングにもスパイスを
#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(