Code only partially does what it's supposed to

Oct 6, 2011 at 12:17am
Here is the code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<string>
using namespace std;
class romanType
{ 
      public:
             
             romanType (string="");
             void setRoman (string);
             void convertToDecimal ();
             void printRoman ();
             void printDecimal ();
            
             
      private:
           
              string roman;
              int decimal;
}; //End Class definition of romanType

#include <iostream>

using namespace std;

romanType::romanType (string myRoman)
{
               roman=myRoman;
               decimal=0;
} //End Constructor romanType

void romanType::setRoman (string myRoman)
{
               roman=myRoman;
               decimal=0;
} //End Function setRoman

void romanType::convertToDecimal ()
{
               char romans[7]={'M', 'D', 'C', 'L', 'X', 'V', 'I'};
              int decimals[7]={1000, 500, 100, 50, 10, 5, 1};
             
               int j, pos;
               
               size_t len=roman.length();
               
               //Process the Numeral
               for (unsigned int i=0; i<1; i++)
               {
                    //Find the Roman Letter
                    for (pos=0; pos<7; pos++)
                         if (roman.at(i)==romans[pos])
                             break;
               //Check for Validity of the Roman Letter
               if (pos<7)
               {
                     //Check the next Roman Letter's value
                     for (j=0; j<pos; j++)
                         if (roman.at(i+1)==romans[j])
                            break;
               
               //add or substract the decimal value
               //according to the values of j and pos
               if (j==pos)
                  decimal+=decimals[pos];
               else
                   decimal-=decimals[pos];
                   }
                   }//end for
               
               //Process the last numeral value
               for (j=0; j<7; j++)
                   if (roman.at(len-1)==romans[j])
                      break;
               
               //Add the decimal value of Roman Letter to the Decimal number
               decimal+=decimals[j];
               }//End Function convertToDecimal
void romanType::printRoman()
{
     cout<<"\n\n\tThe roman numeral is "<<roman;
     } //End Function printRoman

void romanType::printDecimal()
{
     cout<<"\n\tThe decimal equivalent of the given Roman numeral is "<<decimal;
}//End Function printDecimal

//Main Program

#include<iostream>
#include<string>

using namespace std;

int main () //Begins Program
{
    string rnumeral;
    romanType r;
    //Information about the program
    cout<<"\n\n\tProgram that converts Roman Numerals into Decimal form." ;
    
    cout<<"Please enter a Roman Numeral"<<endl;
    cin>>rnumeral;
    
    
    for (int i=0; i<3; i++)
    {
        //Set the Roman Numeral String
        r.setRoman (rnumeral);
        
        //Convert the Roman Numeral into Decimal Form
        r.convertToDecimal ();
        
        //Print the Roman Numeral
        r.printRoman ();
        
        //Print the Decimal form of Numeral
        r.printDecimal ();
        } //End for
        
        cout<<"\n\n\t";
        system("pause");
        return 0; //Indicates program executed successfully
}//end of function main 



Here's the problem: It's supposed to convert roman numerals to decimals. It only partially works. It tells me the numbers for things like IV, II, XV, however, for M it says 2000, for any of the other letters by themselves like D, it crashes. If I input something like, MCXIV (which is supposed to be 1114 actually comes out as 1005. I really don't know why it partially works and partially doesn't. Anything extremely simple or a little more complicated and it messes up.
Last edited on Oct 6, 2011 at 1:06am
Oct 6, 2011 at 12:57am
That's much too hard to read. Use code tags and indent your code.
Oct 6, 2011 at 2:33am
made it easier to read
Topic archived. No new replies allowed.