/* 教科書 p70, List3-7 * 九九練習プログラム * 作者; 結城浩 * Copyright (C) 1993 by Hiroshi Yuki. * * Slightly modified by T. Watanabe, May 14, 2002. */ #include #include #include #define MAX_Q 10 /* 表示する問題の個数 */ #define MAX_LINE 128 /* 入力行の最大長 */ int main(void); void kuku(int questno); int good_answers = 0; /* 正答の個数 (グローバル変数)*/ /***************************************************************** * 関数 main は九九の練習をする。 * 問題を MAX_Q 回繰り返す。 * 最後に結果を表示する。 */ int main(void) { int i; /* 問題の番号 */ float rate; /* 正答率 */ /* 現在時刻を使って乱数の「種」を得るので、実行毎に違う乱数が生成される。 */ srand((unsigned int) time(NULL)); printf("これから九九の問題を %d問出します。\n", MAX_Q); good_answers = 0; /* 正答数を数える変数*/ for (i = 0 ; i < MAX_Q ; i++) { kuku(i); /* この関数が問題を出題する */ } /* 出題が終わったので正答率を求める */ rate = good_answers * 100.0 / MAX_Q; printf("問題は %d問ありました。\n", MAX_Q); printf("%d問は正しく答えられましたが、\n", good_answers); printf("%d問は間違ってしまいました。\n", MAX_Q - good_answers); printf("正答率は %0.1f%%です。\n", rate); printf("\n"); printf("お疲れ様。\n"); } /***************************************************************** * 関数 kuku は九九の問題を一問出題し、答えを待つ。 * 正答か誤答かの別も表示する。 */ void kuku(int questno) /* questno は問題の番号*/ { int x, y, result; char buffer[MAX_LINE]; x = rand() % 9 + 1; /* 乱数を使って、1から9までの数が書いてあるサイコロを振る */ y = rand() % 9 + 1; printf(" [第 %d問] %d x %d = ", questno + 1, x, y); fflush(stdout); /* 念のため、標準出力(stdout)にまだ出力されていないデータを吐き出す */ gets(buffer); /* ユーザが入力した答えを取得する */ result=atoi(buffer); if ( x * y == result ) { printf("はい、正解です。\n"); good_answers++; /* 正答数を1増やす */ } else { printf("残念、間違えです。\n"); } printf("\n"); }