Meeeeee
Meeeeee

Reputation: 89

c++ Roman Additive Form Conversion

I'm working in a program that converts from Roman to Decimal. I have to validate 2 things: One that the characters entered are M or D or C or L or X or V or I, in other words valid for processing.

Number two, I have to make sure that bigger characters value go first and if not to print and error message and have the user to try again (this is the part where I am stuck)

For instance, If I wanted to input 9 and I input IX it should display an error message because is not in Additive form. It should be VIIII. How can I code this so it compares characters to know whether bigger letter values are first and so on?

I keep getting incorrect validation.
Is there a way to assign a value to the letters in the string? I'm thinking in comparing them as int values which I know how to and from there validate input format.

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";
        }
    }
}

Upvotes: 0

Views: 145

Answers (1)

MSalters
MSalters

Reputation: 179991

I would recommend a std::map<char, int> to hold the mapping between letetrs and values.

With the map, you can then convert the input string (a sequence of characters) to a sequence of values (std::vector<int>). From there on, it's just a single check to see if the vector is sorted, and a single function call to add up all values. (I'll leave finding the right function as homework)

Upvotes: 2

Related Questions