C++ 罗马加法形式转换

c++ Roman Additive Form Conversion

本文关键字:转换 罗马 C++      更新时间:2023-10-16

我正在开发一个从罗马转换为十进制的程序。我必须验证两件事:一是输入的字符是 M 或 D 或 C 或 L 或 X 或 V 或 I,换句话说,对处理有效。

第二,我必须确保更大的字符值首先出现,如果不打印和错误消息并让用户重试(这是我卡住的部分)

例如,如果我想输入 9 并且输入 IX,它应该显示一条错误消息,因为不是加法形式。应该是八。我如何对此进行编码,以便它比较字符以了解较大的字母值是否在第一个等等?

我不断得到不正确的验证。
有没有办法为字符串中的字母赋值?我正在考虑将它们作为我知道如何验证输入格式的 int 值进行比较。

void RomanNum::setRomanNumber() //get input and calculate decimal equivalent
{
    //I 1, V 5, X 10, L 50, C 100, D 500, M 1000
    int value = 0;
    string input;
    char current, next;
    enum validationData { M, D, C, L, X, V, I };
    bool validationCharacters = true;
    //bool validationAdditiveForm = true;
    getline(cin, input, 'n');
    for (int i = 0; i < input.length(); i++) //calculate each Roman letter at a time
    {
        current = input[i];
        next = current + 1;
        if (current >= validationData(next))
        {
            switch (input[i])
            {
                case 'M':
                    value += 1000;
                    break;
                case 'D':
                    value += 500;
                    break;
                case 'C':
                    value += 100;
                    break;
                case 'L':
                    value += 50;
                    break;
                case 'X':
                    value += 10;
                    break;
                case 'V':
                    value += 5;
                    break;
                case 'I':
                    value += 1;
                    break;
                default:
                    validationCharacters = false;
                    break;
            }
        }
        else
        {
            cout << "nInvalid order. Bigger values go firstn";
        }
    }
}

我建议使用std::map<char, int>来保存letetrs和值之间的映射。

使用映射,您可以将输入字符串(字符序列)转换为值序列(std::vector<int>)。从那里开始,只需一次检查即可查看向量是否已排序,以及一次函数调用即可将所有值相加。(我会把找到合适的功能留作家庭作业)