我这里有代码。目标是创建一个多项选择测验,其中问题来自文本文件,并随机挑选以显示。我能够做多项选择,问题是当它生成时,已经选择和显示的问题再次显示。此外,选项来自文本文件的答案,但问题是选择是在问题中重复显示。
所以我想知道如何不再显示挑选问题,以及如何不重复显示选择。
示例输出
1. what month do we celebrate Christmas?
a.december
b.december
c.january
d.december
//Randomizes the questionList vector
random_shuffle(questionList.begin(), questionList.end());
//Goes through every Test question
for(int i = 0; i < questionList.size(); i++){
vector <Test> randomAnswer;
//Puts the correct Answer into it first
randomAnswer.push_back(questionList[i]);
//Then randomly gets 3 other answers from questionList
while(randomAnswer.size() < 4)
{
int random = rand();
if(random != i){
randomAnswer.push_back(questionList[rand() % (questionList.size() - 1)]);
}
//Shuffle the answers
random_shuffle(randomAnswer.begin(), randomAnswer.end());
//Print the question
cout << questionList[i].getQuestion() << ":" << endl;
//Initialize the first choice character to 'A'
char ch = 'A';
//Prints the shuffled answers
for(int j = 0; j < randomAnswer.size(); j++)
{
cout << ch << ") " << randomAnswer[j].getAnswer() << endl;
//Increment 'A' so it can print 'B' and so forth
++ch;
}
//Get users response
cout << "\nYour answer: ";
cin >> response;
//Bool data type to determine if the correct answer was found
bool isCorrect = false;
switch(toupper(response))
{
case 'A':
if(randomAnswer[0].getAnswer()==questionList[i].getAnswer())
isCorrect = true;
break;
case 'B':
if(randomAnswer[1].getAnswer()==questionList[i].getAnswer())
isCorrect = true;
break;
case 'C':
if(randomAnswer[2].getAnswer()==questionList[i].getAnswer())
isCorrect = true;
break;
case 'D':
if(randomAnswer[3].getAnswer()==questionList[i].getAnswer())
isCorrect = true;
break;
default:
cout << "\nIncorrect input.\n";
}
//If the answer was found print "Correct" else "Wrong"
if(isCorrect)
{
cout << "\nYou got the answer correct!\n";
}
else
{
cout << "\nYou got the answer WRONG!\n"
<< "Correct answer was " << questionList[i].getAnswer() <<
endl;
答案 0 :(得分:1)
您的方法不正确,您在列表中插入正确的答案,然后随机选择三个答案。可视示例(1是正确的):
1 2 3 4
Insert 1 into randomAnswer
Randomly pick three numbers and insert them into randomAnswer: ex (2, 1, 3)
正确的方法是采取所有四个答案并将其洗牌。伪码
swap(questionList[i], *(questionList.end() - 1));
Insert questionList[i]
Shuffle questionList.begin() - questionList.end() - 2 and randomly pick 3