fork download
  1. #pragma warning(disable:4996)
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. typedef struct {
  8. const char *question;
  9. const char *choices[3];
  10. int correct; // 1〜3
  11. int points;
  12. } Quiz;
  13.  
  14. static int read_answer_1to3(void) {
  15. char buf[64];
  16.  
  17. for (;;) {
  18. printf("回答(1〜3)> ");
  19. fflush(stdout); // これを入れると環境によって表示が確実になる
  20.  
  21. if (fgets(buf, sizeof(buf), stdin) == NULL) {
  22. return -1;
  23. }
  24.  
  25. buf[strcspn(buf, "\r\n")] = '\0';
  26.  
  27. char *end = NULL;
  28. long v = strtol(buf, &end, 10);
  29.  
  30. if (end == buf || *end != '\0') {
  31. puts("数字だけで入力してください。");
  32. continue;
  33. }
  34. if (v < 1 || v > 3) {
  35. puts("1〜3の範囲で入力してください。");
  36. continue;
  37. }
  38. return (int)v;
  39. }
  40. }
  41.  
  42. int main(void) {
  43. Quiz quizzes[6] = {
  44. {"かな文字で,物語「源氏物語」を書いた。", {"1. 紫式部","2. 天草四郎","3. ヘレン・ケラー"}, 1, 20},
  45. {"随筆「枕草子」を書いた。", {"1. エジソン","2. 小野小町","3. 清少納言"}, 3, 15},
  46. {"全国各地を実測し,日本地図の作成に努めた。", {"1. 徳川家光","2. 伊能忠敬","3. 吉田松陰"}, 2, 10},
  47. {"日本最初の内閣総理大臣。", {"1. 田中正造","2. 小村寿太郎","3. 伊藤博文"}, 3, 15},
  48. {"「学問のすすめ」を書いた人物。", {"1. 福沢諭吉","2. 樋口一葉","3. 新渡戸稲造"}, 1, 20},
  49. {"細菌学者(医者)として,黄熱病の解明に努めた。", {"1. 山本五十六","2. 吉田茂","3. 野口英世"}, 3, 20}
  50. };
  51.  
  52. int total = 0;
  53. int n = (int)(sizeof(quizzes) / sizeof(quizzes[0]));
  54.  
  55. puts("--------クイズを答えてください。--------");
  56.  
  57. for (int i = 0; i < n; i++) {
  58. puts("");
  59. printf("第%d問(配点 %d点)\n", i + 1, quizzes[i].points);
  60. puts(quizzes[i].question);
  61. puts(quizzes[i].choices[0]);
  62. puts(quizzes[i].choices[1]);
  63. puts(quizzes[i].choices[2]);
  64.  
  65. int ans = read_answer_1to3();
  66. if (ans == -1) {
  67. puts("\n入力が終了しました。");
  68. break;
  69. }
  70.  
  71. if (ans == quizzes[i].correct) {
  72. puts("正解です。");
  73. total += quizzes[i].points;
  74. } else {
  75. printf("不正解です。正解は%dです。\n", quizzes[i].correct);
  76. }
  77. }
  78.  
  79. puts("");
  80. printf("あなたの得点は %d 点です。\n", total);
  81.  
  82. // ここが重要:Visual Studioでウィンドウが閉じる問題を潰す
  83. puts("Enterキーで終了します。");
  84.  
  85. return 0;
  86. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
--------クイズを答えてください。--------

第1問(配点 20点)
かな文字で,物語「源氏物語」を書いた。
1. 紫式部
2. 天草四郎
3. ヘレン・ケラー
回答(1〜3)> 
入力が終了しました。

あなたの得点は 0 点です。
Enterキーで終了します。