Так что для моего класса 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 ошибок, которые я создал, вместо того, чтобы распечатывать только те, которые были нарушены?
Спасибо
Не по теме: ваша программа может быть упрощена с помощью массива сообщений об ошибках.
if
Лестница оператора будет заменена на цикл:
for (unsigned int i = 0U; i < MAXIMUM_ERROR_TYPES; ++i)
{
if (errors[i])
{
std::cout << error_messages[i];
}
}
Поскольку кода меньше, вероятность появления дефектов будет меньше.
Хорошо, во-первых, вы не опубликовали свой checkErrors
код, так что я предполагаю здесь.
Я думаю, что вы определили как
bool checkErrors(string, bool errors[13]){
Это означает, что он принимает не указатель, а копию 13 логических значений. Таким образом, они изменяются внутри вашей функции, но не за ее пределами. Измените это на:
bool checkErrors(string, bool* errors){
пс. В следующий раз подумайте, как люди, не знающие о вашей проблеме, поймут это. Спасает тебя от злости;)