Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********************************************************
- * *
- * Roman Numeral Calc *
- * Author: wmays *
- * *
- * This was my first attempt to make a program *
- * that would use Roman Numerals. *
- * *
- *********************************************************/
- #include <string>
- #include <iostream>
- //Definitions for messages (We don't want instructions for Latin math in English, do we?)
- #define ENTER_MSG "Ingressus operator et numero: "
- #define WRONG_FORMAT "Omnes numeros oportet esse Numeris Romanis."
- #define RESULT "Exitu: "
- using namespace std;
- // All the values for Roman Numerals
- char numerals[] = {'I','V','X','L','C','D','M'};
- short int values[] = {1,5,10,50,100,500,1000};
- //Just a useful function to find a letter's location in the array
- int indIn(char ch){
- int ret = -1;
- for(int j = 0; j < sizeof(numerals); j++){
- if(ch == numerals[j]){
- ret = j;
- break;
- }
- }
- }
- // Detects if a string is a valid Roman Numeral
- bool isRNum(string str){
- for(int i = 0; i < str.length(); i++){
- bool worked = false;
- for(int j = 0; j < sizeof(numerals); j++){
- if(numerals[j] == str[i]){
- worked = true;
- }
- }
- if(!worked)
- return(false);
- }
- return(true);
- }
- // Roman Numeral Parser
- int pNum(string stri){
- int ret = 0;
- for(int i = 0; i < stri.length(); i++){
- char cur = stri[i];
- int cval = values[indIn(cur)];
- for(int j = i+1; j < stri.length(); j++){
- char cchar = stri[j];
- if(indIn(cchar) > indIn(cur)){
- cval *= -1;
- break;
- }
- }
- ret += cval;
- }
- return(ret);
- }
- // Convert from integers to Roman Numerals
- string tNum(int n){
- int t = n;
- string ret = "";
- for(int i = sizeof(numerals)-1; i >= 0; i--){
- while(true){
- if(t >= values[i]){
- t -= values[i];
- ret += numerals[i];
- }else{
- if(i > 0){
- if(i > 1){
- if(t >= values[i] - values[i-2]){
- t -= (values[i] - values[i-2]);
- ret += numerals[i-2];
- ret += numerals[i];
- break;
- }
- }else if(t >= values[i] - values[i-1]){
- t -= (values[i] - values[i-1]);
- ret += numerals[i-1];
- ret += numerals[i];
- }
- }
- break;
- }
- }
- }
- return(ret);
- }
- char oper = ' ';
- string numer = "";
- int temp = 0;
- int main(){
- while(true){
- cout <<ENTER_MSG;
- cin >> oper >> numer;
- if(isRNum(numer)){
- switch(oper){
- case '+':
- temp += pNum(numer);
- break;
- case '-':
- temp -= pNum(numer);
- break;
- case '*':
- temp *= pNum(numer);
- break;
- case '/':
- temp /= pNum(numer);
- default:
- break;
- }
- cout << RESULT << tNum(temp) << '\n';
- }else{
- cout << WRONG_FORMAT << '\n';
- }
- }
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment