在C++中用数组进行多选择测试的困惑

在C++中用数组进行多选择测试的困惑,c++,arrays,testing,choice,C++,Arrays,Testing,Choice,对于课堂,我的任务是创建一个多项选择题测试,该测试有一组预先给出的正确答案。提示用户输入20个答案,然后程序将正确答案与学生输入的答案进行比较。我对重写数组的大小感到困惑,因为我试图将所有学生的正确答案和不正确答案放入两个新数组中,然后将它们输出给用户,以查看他/她得到的正确答案 我的代码是: #include<iostream> #include<string> using namespace std; int main() { char answers[20] =

对于课堂,我的任务是创建一个多项选择题测试,该测试有一组预先给出的正确答案。提示用户输入20个答案,然后程序将正确答案与学生输入的答案进行比较。我对重写数组的大小感到困惑,因为我试图将所有学生的正确答案和不正确答案放入两个新数组中,然后将它们输出给用户,以查看他/她得到的正确答案

我的代码是:

#include<iostream>
#include<string>
using namespace std;

int main()
{
char answers[20] = { 'A','D','B','B','C','B','A','B','C','D','A','C','D','B','D','C','C','A','D','B' };
char studentAnswers[20];
int correctlyAnswered[20];
int falselyAnswered[20];
for (int i = 0; i <= 19; i++)
{
    cout << "Please enter your answer for question #" << i+1 << ": ";
    char choice;
    cin >> choice;
    if (choice != 'A' || choice != 'B' || choice != 'C' || choice != 'D')
    {
        cout << "Error: Answer must be A,B,C or D. Please enter a new answer: ";
        cin >> choice;
    }
    studentAnswers[i] = choice;
    cin.sync();
    if (answers[i] = studentAnswers[i])
    {
        studentAnswers[i] = correctlyAnswered[i];
    }
    else
    {
        studentAnswers[i] = falselyAnswered[i];
    }


}
cout << "You answered " << sizeof(correctlyAnswered[20]) << " questions correctly out of 20" << endl;
system("pause");
return 0;
}


代码还没有完全完成,尽管我想在继续之前解决这个问题。我相信我的问题源于将正确应答和错误应答数组的大小设置为20,尽管我不知道如何解决这个问题。请帮忙

您的代码有几个问题。第一个:

if (answers[i] = studentAnswers[i])
这会将答案[i]分配给学生答案[i]。您希望使用==-这是一个比较运算符

那么

studentAnswers[i] = correctlyAnswered[i];
没什么意义。正确答案是一个单位化数据数组,为什么要从中读取任何内容?我想,你想以某种方式设置学生答案[I]

sizeofstudentAnswersed[20]将始终返回相同的值,即字符大小,该值始终保证为1。

我建议每次学生正确回答时增加一个整数

因此,我将修改代码声明:

int correctlyAnswered = 0;
然后在for循环中,我会:

if (answers[i] == choice )
  correctlyAnswered++;
注意==不= 最后,您可以输出:

cout << "You answered " << correctlyAnswered << " questions correctly...
计算错误答案:

错误回答=20-正确回答

更新 为了正确存储问题和答案,我将声明一个布尔数组:

int correctlyAnswered = 0;
bool correct[20];
然后,如果:

if (answers[i] == choice ) {
  correctlyAnswered++;
  correct[i] = true;
} else {
  correct[i] = false;
}
然后打印出结果:

cout << "You answered " << correctlyAnswered << " questions correctly"<<endl;
for( int i=0; i<20; i++ ) {
   count << "Your answer to question " << i+1 << " is ";
   if ( correct[i] )
      cout << "correct" << endl;
   else 
      cout << "wrong" << endl;
}

我想这不是stackoverflow的真正问题,尽管我想我们都是来帮忙的。你的问题是一个非常基本的问题:

if (answers[i] = studentAnswers[i])

由于赋值和比较存在差异,C++使用了不同的操作符。你必须习惯它,而不是使用一个等号,比较是一个双等号==

在本例中,您正在测试作业。因此,您指定学生回答,然后检查指定的内容是否与false不同,或者在本例中为“\0”

我不知道您使用的是哪种编译器和IDE,但我的编译器和IDE给出了一个警告:使用赋值结果作为不带括号的条件


也就是说,请停止写C。STL有数组和向量的容器。结合基于范围的算法。。。这段代码更容易理解。

首先,必须使用“==”而不是“=”。第一个是比较运算符,用于计算两个声明是否相等,第二个是赋值运算符,用于将一个变量的值赋给另一个变量

其次,在评估正确答案时,必须交换顺序。而不是:

if (answers[i] = studentAnswers[i])
{
    studentAnswers[i] = correctlyAnswered[i];
}
else
{
    studentAnswers[i] = falselyAnswered[i];
}
你必须这样做:

if (answers[i] = studentAnswers[i])
{
    correctlyAnswered[i] = studentAnswers[i];
}
else
{
     falselyAnswered[i] = studentAnswers[i];
}
第三,语句sizeofcorrectlyAnswered[20]将始终输出80,这是因为sizeof从其参数返回以字节为单位的大小,在本例中为80

好吧,那就行了

现在,如果您想展示好的答案,您应该添加以下内容:

int correctNumbers[20] = {};//this initializes the 20 numbers with 0
然后在if语句中:

if (answers[i] = studentAnswers[i])
{
    correctlyAnswered[i] = studentAnswers[i];
    correctNumbers[i] = i + 1;//stores the number of the good answeded                                                                                                                 //question  
}
最后显示:

cout << "You answeded well the next questions:\n"
for( i = 0; i < 20; ++i)
    if(correctNumber[i] != 0)
        cout << correctNumber[i] << ' ';

这是可行的,有一个更好的方法来解决问题,但这对您试图解决的问题来说效果很好:

具体来说,您遇到了什么问题或错误?其次,如果答案[I]=studentAnswers[I],我怀疑您是否想使用该语句,因为=是赋值,您可能正在寻找等式检查==。对不起,我应该指定更多。我希望能够将所有正确和不正确的答案保存到两个单独的数组中,然后将它们输出给用户查看。我对设置这些数组的大小感到困惑,因为每次程序运行时回答的正确/不正确的问题数量可能会改变。是否需要将答案保留在数组中?考虑使用STD::MAP从一个问题号映射到一个结构,该结构包含用户给出的正确答案和答案。我认为这更接近你的意图。不,唯一需要的数组是原始的正确答案和用户输入的答案。这是我能想到的最简单的方法,可以将正确和错误的答案设置为输出。我会试试你的方法,谢谢!一次发生的错误太多了。请从简单的开始!谢谢你的帮助!我想我对这样一个事实感到困惑:每次运行代码时,正确答案和错误答案的数量都会发生变化,因此我不确定将正确答案和错误答案数组的大小设置为什么。我想我可以使用一个变量,因为它的大小在每次运行代码时都会被修改,尽管我不完全确定如何去做。谢谢你的帮助。在社区大学的课堂上,这是唯一的方法
到目前为止,我已经了解到,我为代码混乱表示歉意。我将根据您的建议进行改进,再次感谢!有没有一种方法可以让我用你的方法输出哪些问题被遗漏或猜对了?我最初使用数组来表示正确答案和错误答案的原因是为了在代码末尾输出它们。
if (answers[i] = studentAnswers[i])
{
    correctlyAnswered[i] = studentAnswers[i];
    correctNumbers[i] = i + 1;//stores the number of the good answeded                                                                                                                 //question  
}
cout << "You answeded well the next questions:\n"
for( i = 0; i < 20; ++i)
    if(correctNumber[i] != 0)
        cout << correctNumber[i] << ' ';