クイズなどの四択問題の選択肢の表示順を毎回ランダムに並べ替えて表示するプログラム。
今回の場合、選択肢配列の先頭が正しい答えだとする。
並べ替えたあとに正答番号が狂わないようにチェックもする。
/* シャッフルした選択肢の正答を追跡する */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main(void) { const int SENTAKU_SI = 4; // 選択肢の数 /* 問題と選択肢 */ char *mondai = "人類はどこから来た?"; char sentaku[][64] = {"アフリカ大陸", "ヨーロッパ大陸", "ユーラシア大陸", "ムー大陸" }; int i; int r1, r2; // 乱数を2つ生成(sentaku配列の添え字として) char work[64]; // シャッフルするときの退避用 int kotae; // 正答の配列添え字番号 初期値はsentaku配列の添え字0 // この場合、「アフリカ大陸」が正答 srand((unsigned)time(NULL)); // 乱数系列を初期化 /* 選択肢をシャッフル */ kotae = 0; for(i=0; i<20; i++){ r1 = rand() % SENTAKU_SI; r2 = rand() % SENTAKU_SI; // 選択肢を入れ替え strcpy(work, sentaku[r1]); strcpy(sentaku[r1], sentaku[r2]); strcpy(sentaku[r2], work); // 正答を入れ替え if(r1 == kotae) kotae = r2; else if(r2 == kotae) kotae = r1; } /* 問題とシャッフルした選択肢を表示 */ printf("問題\n%s\n\n", mondai); for(i=0; i<SENTAKU_SI; i++){ printf("%d)%s ", i+1, sentaku[i]); } printf("\n\n正答は、[%d]です\n", kotae+1); // kotaeは、正答の添え字 return 0; }
実行イメージ
問題
人類はどこから来た?1)ヨーロッパ大陸 2)ユーラシア大陸 3)ムー大陸 4)アフリカ大陸
正答は、[4]です
問題
人類はどこから来た?1)ユーラシア大陸 2)アフリカ大陸 3)ヨーロッパ大陸 4)ムー大陸
正答は、[2]です
コメント