Guest User

Roman Numeral Calculator

a guest
Oct 10th, 2012
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. /********************************************************
  2. *                                                       *
  3. *                   Roman Numeral Calc                  *
  4. *                   Author: wmays                       *
  5. *                                                       *
  6. *           This was my first attempt to make a program *
  7. *           that would use Roman Numerals.              *
  8. *                                                       *
  9. *********************************************************/
  10.  
  11. #include <string>
  12. #include <iostream>
  13. //Definitions for messages (We don't want instructions for Latin math in English, do we?)
  14. #define ENTER_MSG "Ingressus operator et numero: "
  15. #define WRONG_FORMAT "Omnes numeros oportet esse Numeris Romanis."
  16. #define RESULT "Exitu: "
  17.  
  18. using namespace std;
  19. // All the values for Roman Numerals
  20. char numerals[] = {'I','V','X','L','C','D','M'};
  21. short int values[] = {1,5,10,50,100,500,1000};
  22. //Just a useful function to find a letter's location in the array
  23. int indIn(char ch){
  24.     int ret = -1;
  25.     for(int j = 0; j < sizeof(numerals); j++){
  26.         if(ch == numerals[j]){
  27.             ret = j;
  28.             break;
  29.         }
  30.     }
  31. }
  32. // Detects if a string is a valid Roman Numeral
  33. bool isRNum(string str){
  34.     for(int i = 0; i < str.length(); i++){
  35.         bool worked = false;
  36.         for(int j = 0; j < sizeof(numerals); j++){
  37.             if(numerals[j] == str[i]){
  38.                 worked = true;
  39.             }
  40.         }
  41.         if(!worked)
  42.             return(false);
  43.     }
  44.     return(true);
  45. }
  46.  
  47. // Roman Numeral Parser
  48. int pNum(string stri){
  49.     int ret = 0;
  50.     for(int i = 0; i < stri.length(); i++){
  51.         char cur = stri[i];
  52.         int cval = values[indIn(cur)];
  53.         for(int j = i+1; j < stri.length(); j++){
  54.             char cchar = stri[j];
  55.             if(indIn(cchar) > indIn(cur)){
  56.                 cval *= -1;
  57.                 break;
  58.             }
  59.         }
  60.         ret += cval;
  61.     }
  62.     return(ret);
  63. }
  64. // Convert from integers to Roman Numerals
  65. string tNum(int n){
  66.     int t = n;
  67.     string ret = "";
  68.     for(int i = sizeof(numerals)-1; i >= 0; i--){
  69.         while(true){
  70.             if(t >= values[i]){
  71.                 t -= values[i];
  72.                 ret += numerals[i];
  73.             }else{
  74.                 if(i > 0){
  75.                     if(i > 1){
  76.                         if(t >= values[i] - values[i-2]){
  77.                             t -= (values[i] - values[i-2]);
  78.                             ret += numerals[i-2];
  79.                             ret += numerals[i];
  80.                             break;
  81.                         }
  82.                     }else if(t >= values[i] - values[i-1]){
  83.                         t -= (values[i] - values[i-1]);
  84.                         ret += numerals[i-1];
  85.                         ret += numerals[i];
  86.                     }
  87.                 }
  88.                 break;
  89.             }
  90.         }
  91.     }
  92.     return(ret);
  93. }
  94.  
  95. char oper = ' ';
  96. string numer = "";
  97. int temp = 0;
  98. int main(){
  99.     while(true){
  100.         cout <<ENTER_MSG;
  101.         cin >> oper >> numer;
  102.         if(isRNum(numer)){
  103.             switch(oper){
  104.                 case '+':
  105.                     temp += pNum(numer);
  106.                     break;
  107.                 case '-':
  108.                     temp -= pNum(numer);
  109.                     break;
  110.                 case '*':
  111.                     temp *= pNum(numer);
  112.                     break;
  113.                 case '/':
  114.                     temp /= pNum(numer);
  115.                 default:
  116.                     break;
  117.             }
  118.             cout << RESULT << tNum(temp) << '\n';
  119.         }else{
  120.             cout << WRONG_FORMAT << '\n';
  121.         }
  122.     }
  123.     return(0);
  124. }
Advertisement
Add Comment
Please, Sign In to add comment