Проверка ошибок римских цифр с учетом набора правил

Так что для моего класса Comp Sci мне было поручено сложение, вычитание, деление и умножение римских цифр, если они соответствуют 12 правилам, которые мне дали.

Я создал логический массив из 13 элементов, чтобы отслеживать, какие правила были нарушены. Я создал функцию под названием checkErrors, который вызывает каждую из 12 функций проверки правил. Я называю checkErrors чтобы проверить каждую римскую цифру, прежде чем вычисление будет выполнено, и распечатать, какая из ошибок является неправильной (если есть), но вместо того, чтобы просто распечатать ошибки, она печатает каждую.

Ниже приведен фрагмент из checkErrors что одинаково для каждого правила (checkErrorOne, checkErrorTwo … и т. д.). Если правило нарушено, errors[0] устанавливается в false, чтобы показать, что вся римская цифра не является законной.

`bool checkErrors(string romanNumeral, bool * errors) {
if (checkErrorOne(romanNumeral) == false) {
errors[1] = false;
errors[0] = false;
}
if (checkErrorTwo(romanNumeral) == false) {
errors[2] = false;
errors[0] = false;
}
if (checkErrorThree(romanNumeral) == false) {
errors[3] = false;
errors[0] = false;
}
if (checkErrorFour(romanNumeral) == false) {
errors[4] = false;
errors[0] = false;
}
if (checkErrorFive(romanNumeral) == false) {
errors[5] = false;
errors[0] = false;
}
if (checkErrorSix(romanNumeral) == false) {
errors[6] = false;
errors[0] = false;
}
if (checkErrorSeven(romanNumeral) == false) {
errors[7] = false;
errors[0] = false;
}
if (checkErrorEight(romanNumeral) == false) {
errors[8] = false;
errors[0] = false;
}
if (checkErrorNine(romanNumeral) == false) {
errors[9] = false;
errors[0] = false;
}
if (checkErrorTen(romanNumeral) == false) {
errors[10] = false;
errors[0] = false;
}
if (checkErrorEleven(romanNumeral) == false) {
errors[11] = false;
errors[0] = false;
}
if (checkErrorTwelve(romanNumeral) == false) {
errors[12] = false;
errors[0] = false;
}

if (errors[0] == true)
return true;
else if (errors[0] == false)
return false;

}
`

вернуть значение первого элемента, чтобы сказать, если это законно.

После этого, когда я иду печатать каждое нарушенное правило, я использую следующее:

void printFunction(string romanNumeral1, string romanNumeral2, string mathOperator, bool errors[]){
if (checkErrors(romanNumeral1, errors) == false && checkErrors(romanNumeral2, errors) == true){

cout << romanNumeral1 << " is illegal becasue" << endl;
if (errors[1] == false)
cout << "Contains a letter that is not M, D, C, L, X, V, or I;" << endl;
if (errors[2] == false)
cout << "I is not followed by I, V, or X;" << endl;
if (errors[3] == false)
cout << "X is not followed by I, V, X, L, or C;" << endl;

для каждого из 12 правил. Это распечатывает каждую ошибку, а не каждую ошибку.

Если бы кто-то мог помочь с моей логикой, это было бы очень ценно.

void printFunction(string romanNumeral1, string romanNumeral2, string mathOperator, bool errors[]){
if (checkErrors(romanNumeral1, errors) == false && checkErrors(romanNumeral2, errors) == true){

cout << romanNumeral1 << " is illegal becasue" << endl;
if (errors[1] == false)
cout << "Contains a letter that is not M, D, C, L, X, V, or I;" << endl;
if (errors[2] == false)
cout << "I is not followed by I, V, or X;" << endl;
if (errors[3] == false)
cout << "X is not followed by I, V, X, L, or C;" << endl;

Изменить: Почему код, который я написал, распечатывает каждую из 12 ошибок, которые я создал, вместо того, чтобы распечатывать только те, которые были нарушены?

Спасибо

-3

Решение

Не по теме: ваша программа может быть упрощена с помощью массива сообщений об ошибках.

if Лестница оператора будет заменена на цикл:

for (unsigned int i = 0U; i < MAXIMUM_ERROR_TYPES; ++i)
{
if (errors[i])
{
std::cout << error_messages[i];
}
}

Поскольку кода меньше, вероятность появления дефектов будет меньше.

3

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

Хорошо, во-первых, вы не опубликовали свой checkErrors код, так что я предполагаю здесь.
Я думаю, что вы определили как

bool checkErrors(string, bool errors[13]){

Это означает, что он принимает не указатель, а копию 13 логических значений. Таким образом, они изменяются внутри вашей функции, но не за ее пределами. Измените это на:

bool checkErrors(string, bool* errors){

пс. В следующий раз подумайте, как люди, не знающие о вашей проблеме, поймут это. Спасает тебя от злости;)

0

По вопросам рекламы [email protected]