Сравнение элементов массива членов класса и основных элементов

Я пытаюсь сравнить свои элементы массива, но когда я его компилирую, массив членов класса не показывает значения, которые я скопировал в массив из моего исходного массива в главном «ключе»,
но массив из main, «answer», сохраняет введенные мной значения, и я написал тестовый цикл после запуска программы, просто чтобы посмотреть, что находится внутри массива членов класса «canswers», и это фактические переменные, которые я скопировал в массив из основного «ключа». Я пытаюсь сравнить два массива («canswers» и «answer») в функции класса «grade», но я не знаю, что я делаю неправильно. Каждый раз, когда я сравниваю их через цикл for, с Если заявление, оно не работает, и появляются случайные символы. Я написал тестовый цикл в самом конце массива, чтобы показать содержимое массива членов класса «canswers», и он имеет все правильные значения, которые я скопировал из main, но он не показывает или не работает, когда я сравниваю два. Я старался сохранить код как можно более чистым, чтобы вы, ребята, могли легко его прочитать.

#include<iostream>
#include<string>

using namespace std;

class TestGrade
{
public:
void setKey(char []);
void grade(char []);
char canswers[];
void display();
};void TestGrade::setKey(char answers[]) //setting values from "key" array in main
{
for(int index = 0; index < 19; index++)
{
canswers[index] = answers[index];
}
}

void TestGrade::grade(char answer[])  //comparing elements in array, here's where the
{                                     //trouble begins
for(int index = 0; index < 19; index++)
{
cout << canswers[index] << " " << answer[index] << endl;
if(canswers[index] == answer[index])
{ cout << "The values are equal" << endl;}
}
}

void TestGrade::display()       //testing the values after the loop i had trouble with
{
for(int index = 0; index < 19;index++)
{
cout << canswers[index] << endl;
}
}int main()
{
const char SIZE = 20;
char answer[SIZE];
char key[20] = {'B', 'D', 'A', 'A',
'C', 'A', 'B', 'A',
'C', 'D', 'B', 'C',
'D', 'A', 'D', 'C',
'C', 'B', 'D', 'A'};

TestGrade test1,test2;

test1.setKey(key);

cout << "Welcome to the written portion of the DMV exam. \n";
cout << "You may only enter capital A, B, C, or D for your answers.\n\n" << endl;

for (int index = 0; index < SIZE; index++)
{
cout << "Enter your answer for question " << index+1 << endl;
cin >> answer[index];

while (answer[index] != 'A'
&& answer[index] != 'B'
&& answer[index] != 'C'
&& answer[index] != 'D')
{
cout << "ERROR: you must input capital A,B,C, or D" << endl;
cin >> answer[index];
}
}

test2.grade(answer); // comparing the values of canswer[] and answer[]

test1.display();  //test loop testing contents of canswers[] class member array

system("pause");
return 0;
}

0

Решение

Вы никогда не устанавливаете ключ для test2. Это означает, что canswers массив в test2 не инициализирован, вы сделали это только в test1. Как вы обнаружили, когда переменная в c ++ не инициализируется в c ++, она содержит случайные значения. Вы хотите изменить test2.grade(answer) в test1.grade(answer) и это должно работать нормально.

Если вы хотите, чтобы ключ ответа был одинаковым во всех тестах, сделайте так, чтобы ответы были статическими:

static char canswers[]
1

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

Ваш canswers член не является действительной декларацией. Вероятно, используется расширение, предоставляемое вашим компилятором для поддержки C член гибкого массива. Это будет действовать как 0 размер массива, и ваш доступ к canswers переменные, таким образом, читают и пишут за пределами объекта, приводя к неопределенному поведению.

Вы должны либо объявить canswers с правильным размером массива, или позволить ему быть vector<char> или же array<char, 20> вместо. За vector<char>:

class TestGrade
{
public:
void setKey(char []);
void grade(char []);
std::vector<char> canswers;
void display();
};

Если вы используете vector<char>, вам нужно будет изменить способ реализации setKey(),

void TestGrade::setKey(char answers[]) //setting values from "key" array in main
{
canswers.clear();
canswers.insert(canswers.begin(), answers, answers+20);
}

В вашем main() код, который вы используете test2 без инициализации canswers с призывом к setKey() в теме.

test2.setKey(key);
test2.grade(answer); // comparing the values of canswer[] and answer[]
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector