c ++罗马添加剂表格转换

时间:2015-04-14 07:24:47

标签: c++ string roman-numerals

我正在使用从Roman转换为Decimal的程序。我必须验证两件事:输入的字符是M或D或C或L或X或V或I,换句话说有效处理。

第二,我必须确保更大的字符值先行,如果没有打印和错误消息,让用户再试一次(这是我被卡住的部分)

例如,如果我想输入9并输入IX,则应显示错误消息,因为它不在Additive form中。它应该是VIIII。我该如何编码,以便比较字符以了解更大的字母值是否是第一个等等?

我一直得到不正确的验证 有没有办法为字符串中的字母赋值?我正在考虑将它们作为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 first\n";
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

使用地图,您可以将输入字符串(字符序列)转换为值序列(std::vector<int>)。从那以后,它只是一次检查以查看向量是否已排序,以及单个函数调用以将所有值相加。 (我将把正确的功能留给家庭作业)