//Changing Roman Numerals to Decimal notation project #include #include #include #include using namespace std; int apply(int n1, char op, int n2); int romanToDec(string rn); bool isRomanDigit(char rd); bool GTE(char rd1, char rd2); string decToRoman(int dec); const string RDIGITS = "IVXLCDM"; int main(){ string rn1, rn2; int n1, n2, result; char op; //prompt and read roman numeral cout << "Enter an expression with roman numerals: "; cin >> rn1 >> op >> rn2; while(cin){ n1 = romanToDec(rn1); n2 = romanToDec(rn2); result = apply(n1, op, n2); cout << rn1 << " (" << n1 << ") " << op << " " << rn2 << " (" << n2 << ") = " << decToRoman(result) << " (" << result << ")" << endl; //prompt and read roman numeral cout << "Enter an expression with roman numerals: "; cin >> rn1 >> op >> rn2; } cout << endl << "Exiting.." << endl; } //romanToDec()---------------------------------------------------------- int romanToDec(string rn){ int i = 0, sum = 0; while((i < rn.length()) && (isRomanDigit(rn[i])) && (GTE(rn[i], rn[i+1]))){ if(rn[i] == 'I') sum += 1; else if (rn[i] == 'V') sum += 5; else if (rn[i] == 'X') sum += 10; else if (rn[i] == 'L') sum += 50; else if (rn[i] == 'C') sum += 100; else if (rn[i] == 'D') sum += 500; else if (rn[i] == 'M') sum += 1000; ++i; } return sum; } //isRomanDigit()--------------------------------------------------------- bool isRomanDigit(char rd){ if((rd == 'I') || (rd == 'V') || (rd == 'X') || (rd == 'L') || (rd == 'C') || (rd == 'D') || (rd == 'M')) return true; else { cerr << "Error -- unknown digit: " << rd << endl; return false; } } /* GTE() ------------------------------------------------------ * >= for Roman Digits * returns true if rd1 >= rd2 * used to verify additive notation for Roman Numbers */ bool GTE(char rd1, char rd2){ int i, j; i = RDIGITS.find(rd1, 0); j = RDIGITS.find(rd2, 0); if(i >= j) return true; else{ cerr << "***ERROR*** not additive notation: " << rd1 << rd2 << endl; return false; } } // apply()-------------------------------------------------------- int apply(int n1, char op, int n2){ if(op == '+') return n1 + n2; else if(op == '-') return n1 - n2; else if(op == '^') return (int)pow((double)n1, (double)n2); else if(op == '/') return n1 / n2; else if(op == '*') return n1 * n2; else if(op == '%') return n1 % n2; else{ cerr << "Error -- illegal operator: " << op << endl; exit(0); } } /* decToRoman() ------------------------------------------------ * for decimals to roman */ string decToRoman(int dec){ string result = ""; int remainingDecimalNumber = dec; while(remainingDecimalNumber >= 1000){ remainingDecimalNumber -= 1000; result += "M"; } while(remainingDecimalNumber >= 500){ remainingDecimalNumber -= 500; result += "D"; } while(remainingDecimalNumber >= 100){ remainingDecimalNumber -= 100; result += "C"; } while(remainingDecimalNumber >= 50){ remainingDecimalNumber -= 50; result += "L"; } while(remainingDecimalNumber >= 10){ remainingDecimalNumber -= 10; result += "X"; } while(remainingDecimalNumber >= 5){ remainingDecimalNumber -= 5; result += "V"; } while(remainingDecimalNumber >= 1){ remainingDecimalNumber -= 1; result += "I"; } return result; }//Changing Roman Numerals to Decimal notation project