Для класса мне поручено создать тест с несколькими вариантами ответов, в котором заранее задан набор правильных ответов. Пользователю предлагается ввести 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, хотя я не уверен, как еще обойти это. Пожалуйста помоги!
Я предлагаю увеличить 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;
}
У вашего кода есть пара проблем. Первый:
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.
Я думаю, это не совсем вопрос для stackoverflow, хотя, думаю, мы все здесь, чтобы помочь. Ваша проблема очень простая:
if (answers[i] = studentAnswers[i])
Поскольку существует разница между присваиванием и сравнением, в С ++ для этого используется другой оператор. (К этому нужно привыкнуть) вместо использования одинакового равенства сравнение представляет собой двойной знак равенства ==
В этом примере вы тестируете задание. Таким образом, вы назначаете studentAnswer, чтобы ответить, чем проверять, отличается ли назначенная вещь от false (или в этом случае ‘\ 0’)
Я не знаю, какой компилятор и 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];
}
В-третьих, оператор 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] << ' ';
Это работает, есть лучший способ решить проблему, но это прекрасно работает для того, что вы пытаетесь решить 🙂
Я отформатировал окончательный код следующим образом.
#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;