Путаница в создании теста с множественным выбором с массивами в Stack Overflow

Для класса мне поручено создать тест с несколькими вариантами ответов, в котором заранее задан набор правильных ответов. Пользователю предлагается ввести 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, хотя я не уверен, как еще обойти это. Пожалуйста помоги!

-2

Решение

Я предлагаю увеличить int каждый раз студент отвечает правильно.

Поэтому я бы изменил код объявления:

int correctlyAnswered = 0;

Тогда в for цикл я бы:

if (answers[i] == choice )
correctlyAnswered++;

(Обратите внимание, == не знак равно)
Наконец, вы можете вывести:

cout << "You answered " << correctlyAnswered << " questions correctly...

Некоторые другие предложения:
— использовать while цикл, чтобы получить ввод пользователя

while(1) {
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: ";
else
break;
}
  • вычислить ложно

    falselyAnswered = 20 - correctlyAnswered;

Обновить
Для правильного хранения ответа sutdent я бы объявил массив bool:

int correctlyAnswered = 0;
bool correct[20];

Затем измените if:

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;
}
0

Другие решения

У вашего кода есть пара проблем. Первый:

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

Это назначает answers[i] в studentAnswers[i], Вы хотите использовать == — который является оператором сравнения.

Затем,

studentAnswers[i] = correctlyAnswered[i];

На самом деле не имеет смысла. correctlyAnswered такое массив унифицированных данных, почему вы что-то читаете из него? Я полагаю, вы хотите как-то установить studentAnswers[i],

cout << "You answered " << sizeof(correctlyAnswered[20]) << "

sizeof(studentAnswersed[20]) всегда будет возвращать одно и то же значение, то есть размер char, который всегда гарантированно равен 1.

0

Я думаю, это не совсем вопрос для stackoverflow, хотя, думаю, мы все здесь, чтобы помочь. Ваша проблема очень простая:

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

Поскольку существует разница между присваиванием и сравнением, в С ++ для этого используется другой оператор. (К этому нужно привыкнуть) вместо использования одинакового равенства сравнение представляет собой двойной знак равенства ==

В этом примере вы тестируете задание. Таким образом, вы назначаете studentAnswer, чтобы ответить, чем проверять, отличается ли назначенная вещь от false (или в этом случае ‘\ 0’)

Я не знаю, какой компилятор и IDE вы используете, хотя мой выдает предупреждение об этом: использование результата присваивания в качестве условия без скобок

Тем не менее, пожалуйста, прекратите писать C. У STL есть контейнеры для массива и вектора. Вместе с алгоритмами на основе ранжирования для … этот код будет намного более понятным.

0

Во-первых, вы должны использовать «==» вместо «=». Первый — это оператор сравнения, который оценивает, если два объявления равны, второй — оператор присвоения, который присваивает значение одной переменной другой.

Во-вторых, вы должны поменять порядок, когда вы оцениваете правильные ответы. Вместо:

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];
}

В-третьих, оператор sizeof (correctAnspted [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] << ' ';

Это работает, есть лучший способ решить проблему, но это прекрасно работает для того, что вы пытаетесь решить 🙂

0

Я отформатировал окончательный код следующим образом.

#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 = 0;
bool correct[20];
int falselyAnswered[20];
for (int i = 0; i <= 19; i++)
if (answers[i] == choice )
correctlyAnswered++;
{
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;
else
break;
} else {
cout << "You answered " << correctlyAnswered << " questions correctly...
}
studentAnswers[i] = choice;
cin.sync();
if (answers[i] == choice ) {
correctlyAnswered++;
correct[i] = true;
} else {
correct[i] = false;
}

studentAnswers[i] = correctlyAnswered[i];
}
else
{
studentAnswers[i] = falselyAnswered[i];
}
falselyAnswered = 20 - correctlyAnswered;

}
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;
}

system("pause");
return 0;
0
По вопросам рекламы [email protected]