给定一组规则检查罗马数字的错误

Checking Errors of Roman Numerals Given A Set of Rules

所以对于我的 comp sci class 我的任务是对罗马数字进行加、减、除和乘,前提是它们通过了我给出的 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;

} `

到return要说的第一个元素的值是否合法。

在此之后,当我去打印每条被破坏的规则时,我使用以下内容:

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 个错误中的每一个,而不是仅打印出违反的错误?

谢谢

好的,首先,您没有 post 您的 checkErrors 代码,所以我在这里假设。 我认为您定义的是

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

这意味着,它不采用指针,而是 13 个布尔值的副本。所以它们在你的函数内被修改,而不是在它之外。将其更改为:

bool checkErrors(string, bool* errors){

ps。下一次,请想想那些不了解你的问题的人将如何理解它。为您省去很多麻烦 ;)

题外话:您的程序可以通过一系列错误消息来简化。

if 语句阶梯将被循环替换:

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

由于代码较少,因此注入缺陷的可能性较小。