0

I'm trying to convert Roman Numerals into Decimal numbers but I keep encountering this error every time I enter a Roman Numeral. I've tried editing the code numerous times but so far I haven't been able to figure out what's going on.

Here's my code:

Header:

#include <string>
using namespace std;

class romanNumeralType
{
public: 
string setNumeral() const;

string getNumeral();

int convert(string romanNumber);

int getDecimal();

void printRoman() const;

void printDecimal() const;

private:

string romanNumber; 

int englishNumbers;

};

Implementation:

string romanNumeralType::setNumeral() const
{
string romanNumber;
cout << "Please enter the Roman Numeral you wish to use: ";

cin >> romanNumber;
cout << endl;   

return romanNumber;
}

string romanNumeralType::getNumeral()
{
return romanNumber;
}

int romanNumeralType::convert(string romanNumber)
{
englishNumbers = 0;

for (size_t i = 0; i < romanNumber.length(); i++ ) 
{
    switch (romanNumber[i]) 
    {
        case 'm':
        case 'M': 
            if (romanNumber[i] == 'M')
            {
            englishNumbers += 1000;
            }
            break;
        case 'd':
        case 'D': 
            if(romanNumber[i+1] == 'M')
                {
                    englishNumbers += 500;
                }
            else if(romanNumber[i-1] == 'M')
                {
                    englishNumbers -= 500;
                }
            break;
        case 'c':
        case 'C': 
            if(romanNumber[i+1] == 'M' || romanNumber[i+1] == 'D')
            {
                englishNumbers += 100;
            }
            else if(romanNumber[i-1] == 'M' || romanNumber[i-1] == 'D')
            {
                englishNumbers += 100;
            }
            break;
        case 'l':   
        case 'L': 
            if(romanNumber[i+1] == 'M' || romanNumber[i+1] == 'D' || romanNumber[i+1] == 'C')
            {
                englishNumbers -= 50;
            }
            else if(romanNumber[i-1] == 'M' || romanNumber[i-1] == 'D' || romanNumber[i-1] == 'C')
            {
                englishNumbers += 50;
            }
            break;
        case 'x':
        case 'X':
            if(romanNumber[i+1] == 'M' || romanNumber[i+1] == 'D' || romanNumber[i+1] == 'C' || romanNumber[i+1] == 'L')
            {
                englishNumbers -= 10;
            }
            else if(romanNumber[i-1] == 'M' || romanNumber[i-1] == 'D' || romanNumber[i-1] == 'C' || romanNumber[i-1] == 'L')
            {
                englishNumbers += 10;
            }
            break;
        case 'v':
        case 'V': 
            if(romanNumber[i+1] == 'M' || romanNumber[i+1] == 'D' || romanNumber[i+1] == 'C' || romanNumber[i+1] == 'L' || romanNumber[i+1] == 'X')
            {
                englishNumbers -= 5;
            }
            else if(romanNumber[i-1] == 'M' || romanNumber[i-1] == 'D' || romanNumber[i-1] == 'C' || romanNumber[i-1] == 'L' || romanNumber[i-1] == 'X')
            {
                englishNumbers += 5; 
            }
            break;
        case 'i':
        case 'I':
            if(romanNumber[i+1] == 'M' || romanNumber[i+1] == 'D' || romanNumber[i+1] == 'C' || romanNumber[i+1] == 'L' || romanNumber[i+1] == 'X' || romanNumber[i+1] == 'V')
            {
                englishNumbers -= 5;
            }
            else if(romanNumber[i-1] == 'M' || romanNumber[i-1] == 'D' || romanNumber[i-1] == 'C' || romanNumber[i-1] == 'L' || romanNumber[i-1] == 'X' || romanNumber[i-1] == 'V')
            {
                englishNumbers += 1;
            }   
            break;
        default: 
            return 0;
    }//end switch
}//end for
return englishNumbers;
}

int romanNumeralType::getDecimal()
{
return englishNumbers;
}

void romanNumeralType::printRoman() const
{
cout << "The Roman Numeral is: " << romanNumber;
}

void romanNumeralType::printDecimal() const
{
cout << "The Decimal is: " << englishNumbers;
}

Any help at all would be greatly appreciated!

Chad P.
  • 17
  • 4
  • 1
    What is the input and what is the outcome ? (which line has the error ?) – Dani Jun 14 '14 at 09:18
  • It is pretty obviously because of how i goes from 0 to size-1; but you're tinkering with the (i+1)th index which for size-1 becomes size which is outside the range. – EpicPandaForce Jun 14 '14 at 09:20
  • The input is romanNumber (which I have been entering as MCXIV) and the outcome is supposed to be englishNumbers. I think the error is at the beginning of the for loop. [This is what pops up when I get the error](http://i.imgur.com/LJoUbkf.png) – Chad P. Jun 14 '14 at 09:23

2 Answers2

0

I think this is happening because some of your code looks at array indexes ahead of the current index, e.g. i+1. When the end of the array is reached, i+1 will not be a valid element of the array, giving you an error.

ChrisC
  • 2,461
  • 1
  • 16
  • 25
0

We have 0 <= i < romanNumber.length(), but you are getting access to romanNumber[i-1] and romanNumber[i+1]. So it is possible to try to get access to romanNumber[-1] or to romanNumber[romanNumber.length()] - it is forbidden.

So, you have to add checks. For example, before if(romanNumber[i+1] == 'M') it is necessary to check that i+1<romanNumber.length(). And before if(romanNumber[i-1] == 'M') it is necessary to check that i > 0.

Ilya
  • 4,583
  • 4
  • 26
  • 51