Closed
Solved
Progreamming Converting Arabic numbers to Roman
hk3008
ok I am baffle maybe I am in the wrong class but I have
#include <string>
#include <iostream>
using namespace std;
std string numerals = "1 5 10 50 100 500 1000";
int main()
{
int roman_numeral = 0;
char arabic_numeral;
cout << "Enter the Number : ";
while(cin.get(roman_Numeral))
{
if(arabic_Numeral == '1000')
roman_Numeral = roman_Numeral + M;
else if(arabic_Numeral == '500')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 5) != std::string::npos)
{
roman_Numeral = roman_Numeral  D;
continue;
}
else
{
roman_Numeral = roman_Numeral + D;
continue;
}
}
else if(arabic_Numeral == '100')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 4) != std::string::npos)
{
roman_Numeral = roman_Numeral  C;
continue;
}
else
{
roman_Numeral = roman_Numeral + C;
continue;
}
}
else if(arabic_numeral == '50')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 3) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  L;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + L;
continue;
}
}
else if(arabic_Numeral == '10')
{
roman_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 2) != std::string::npos)
{
roman_Numeral = roman_Numeral  X;
continue;
}
else
{
roman_Numeral = roman_Numeral + X;
continue;
}
}
else if(arabic_Numeral == '5')
{
roman_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 1) != std::string::npos)
{
roman_Numeral = roman_Numeral  V;
continue;
}
else
{
roman_Numeral = roman_Numeral + V;
continue;
}
}
else if(arabic_Numeral == '1')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral) != std::string::npos)
{
roman_Numeral = roman_Numeral  I;
continue;
}
else
{
roman_Numeral = roman_Numeral + I;
continue;
}
}
else
break;
}
cout << roman_Numeral << endl;
return 0;
}
so far but it is not working I definitly need help with this if anyone has any tips or can maybe spot the error I dont know if the math is wrong on it or maybe you cant do the algorithms like you can with arabic numbers
#include <string>
#include <iostream>
using namespace std;
std string numerals = "1 5 10 50 100 500 1000";
int main()
{
int roman_numeral = 0;
char arabic_numeral;
cout << "Enter the Number : ";
while(cin.get(roman_Numeral))
{
if(arabic_Numeral == '1000')
roman_Numeral = roman_Numeral + M;
else if(arabic_Numeral == '500')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 5) != std::string::npos)
{
roman_Numeral = roman_Numeral  D;
continue;
}
else
{
roman_Numeral = roman_Numeral + D;
continue;
}
}
else if(arabic_Numeral == '100')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 4) != std::string::npos)
{
roman_Numeral = roman_Numeral  C;
continue;
}
else
{
roman_Numeral = roman_Numeral + C;
continue;
}
}
else if(arabic_numeral == '50')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 3) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  L;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + L;
continue;
}
}
else if(arabic_Numeral == '10')
{
roman_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 2) != std::string::npos)
{
roman_Numeral = roman_Numeral  X;
continue;
}
else
{
roman_Numeral = roman_Numeral + X;
continue;
}
}
else if(arabic_Numeral == '5')
{
roman_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 1) != std::string::npos)
{
roman_Numeral = roman_Numeral  V;
continue;
}
else
{
roman_Numeral = roman_Numeral + V;
continue;
}
}
else if(arabic_Numeral == '1')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral) != std::string::npos)
{
roman_Numeral = roman_Numeral  I;
continue;
}
else
{
roman_Numeral = roman_Numeral + I;
continue;
}
}
else
break;
}
cout << roman_Numeral << endl;
return 0;
}
so far but it is not working I definitly need help with this if anyone has any tips or can maybe spot the error I dont know if the math is wrong on it or maybe you cant do the algorithms like you can with arabic numbers
13
answers
Last reply
Best Answer
More about progreamming converting arabic numbers roman

hk3008 said:ok I am baffle maybe I am in the wrong class but I have
#include <string>
#include <iostream>
using namespace std;
std string numerals = "1 5 10 50 100 500 1000";
int main()
{
int roman_numeral = 0;
char arabic_numeral;
cout << "Enter the Number : ";
while(cin.get(roman_Numeral))
{
if(arabic_Numeral == '1000')
roman_Numeral = roman_Numeral + M;
else if(arabic_Numeral == '500')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 5) != std::string::npos)
{
roman_Numeral = roman_Numeral  D;
continue;
}
else
{
roman_Numeral = roman_Numeral + D;
continue;
}
}
else if(arabic_Numeral == '100')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 4) != std::string::npos)
{
roman_Numeral = roman_Numeral  C;
continue;
}
else
{
roman_Numeral = roman_Numeral + C;
continue;
}
}
else if(arabic_numeral == '50')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 3) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  L;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + L;
continue;
}
}
else if(arabic_Numeral == '10')
{
roman_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 2) != std::string::npos)
{
roman_Numeral = roman_Numeral  X;
continue;
}
else
{
roman_Numeral = roman_Numeral + X;
continue;
}
}
else if(arabic_Numeral == '5')
{
roman_Numeral = cin.peek();
if(numerals.find(arabic_Numeral, 1) != std::string::npos)
{
roman_Numeral = roman_Numeral  V;
continue;
}
else
{
roman_Numeral = roman_Numeral + V;
continue;
}
}
else if(arabic_Numeral == '1')
{
arabic_Numeral = cin.peek();
if(numerals.find(arabic_Numeral) != std::string::npos)
{
roman_Numeral = roman_Numeral  I;
continue;
}
else
{
roman_Numeral = roman_Numeral + I;
continue;
}
}
else
break;
}
cout << roman_Numeral << endl;
return 0;
}
so far but it is not working I definitly need help with this if anyone has any tips or can maybe spot the error I dont know if the math is wrong on it or maybe you cant do the algorithms like you can with arabic numbers
A lot of things is wrong here:
1. you need a char array or a string, not a single char or worst an int for a roman number
2. you can't add or do any operation with another not initialized and worst of all unspecified variable
3. do you even know how this algorithm works? because you are way off with this implementation. Here I can't even tell what are you converting to what...
4. why do you need iostream and numerals string?
Couple of tips:
1. define the variables correct(there is no way to make it the way you started!)
2. handle user input correct (put it all into a single variable so you can work with it!)
3. work out the algorithm on paper first as a workflow diagram. try it for yourself to convert an arabic number to roman 
ok this is what I had then I tried to change all the values so that I could input a number and get a roman numeral
#include <string>
#include <iostream>
using namespace std;
std::string numerals = "VXLCDM";
int main()
{
char roman_Numeral;
int arabic_Numeral = 0;
cout << "Enter the Roman Numeral in Capital letters (e.g. CCXIX) : ";
while(cin.get(roman_Numeral))
{
if(roman_Numeral == 'M')
arabic_Numeral = arabic_Numeral + 1000;
else if(roman_Numeral == 'D')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 5) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  500;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 500;
continue;
}
}
else if(roman_Numeral == 'C')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 4) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  100;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 100;
continue;
}
}
else if(roman_Numeral == 'L')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 3) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  50;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 50;
continue;
}
}
else if(roman_Numeral == 'X')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 2) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  10;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 10;
continue;
}
}
else if(roman_Numeral == 'V')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral, 1) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  5;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 5;
continue;
}
}
else if(roman_Numeral == 'I')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  1;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 1;
continue;
}
}
else
break;
}
cout << arabic_Numeral << endl;
return 0;
}
which apperently I converted incorecctly, 
cin.peek is for reading the last inputed character wothour removing it from the stream. cin.get reads it, sotres it in the variable in the brackets and removes it from the stream.
This last code will compile, but are you sure it's correct? As I see it, the alorithm is not correct (example it would not correctly convert CM to 900 or VC or IX).
I suggest you input the whole number before the conversion. Arabic number read to an int (cin>>arabic_Numeral;) and roman to a string(string roman_Numeral;cin>>roman_Numeral;), that way it will be easier to manipulate. 
ok so maybe the smilies are throwing me off wanna give me a small example I tried to play around putting cin >> arabic_Numeral; in a few places but cant seem to get it to work as well with my coding that I have it ask for the roman numeral but after you put it in and hit enter it just closes dos out so I am lost

hk3008 said:ok so maybe the smilies are throwing me off wanna give me a small example I tried to play around putting cin >> arabic_Numeral; in a few places but cant seem to get it to work as well with my coding that I have it ask for the roman numeral but after you put it in and hit enter it just closes dos out so I am lost
I forgot that instead of ; and ) you got smilies. First of all, cin>>arabic_Numeral goes at only one place. That is after you ask for input. Try something like this:
std::string roman_Numeral;
int arabic_Numeral = 0;
while(1){
cout << "Enter the number you want to convert to roman (0 to exit) : ";
cin>>arabic_Numeral
if(arabic_Numeral==0) break;
//your conversion code here
cout<<"The roman numeral for that number is: "+roman_Numeral;
}
The code you have to convert arabic to roman has flaws. Try rewriteing you code a different way. Don't start from "M", but work your way to it from "I". In other words, start from the last digit in the arabic numeral and convert it one digit at a time.
P.S. I could post you the entire code, but that would be doing your work for you, but this way you will learn to do it yourself. 
hmm ok I dunno if I am doing this right so I put
#include <string>
#include <iostream>
using namespace std;
int main()
{
char roman_Numeral;
std::string roman_Numeral;
int arabic_Numeral = 0;
while(cin.get(roman_Numeral))
{
cout << "Enter the number you want to convert to roman (0 to exit) : ";
cin >> arabic_Numeral;
if(arabic_Numeral==0) break;
{
if(roman_Numeral == 'I')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  1;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 1;
continue;
}
}
are you saying that Ineed to get rid of the cin.get and cin.peek?
or rewrite the algorythm for the
if(roman_Numeral == 'I')
{
roman_Numeral = cin.peek();
if(numerals.find(roman_Numeral) != std::string::npos)
{
arabic_Numeral = arabic_Numeral  1;
continue;
}
else
{
arabic_Numeral = arabic_Numeral + 1;
continue;
}
} 
Best answer
I'm saying both. You can't use cin.get and cin.peek because the next inputed numeral is very important. You are missing a concept or analiseing your problem and how to deide it into steps so you can implement it.
This would be my code for converting arabic to roman:
#include<string>
#include <iostream>
using namespace std;
int main()
{
string roman_Numeral;
int arabic_Numeral;
string numerals = "IVXLCDM"; //roman numerals
int index; //index for steping throu top string
int digit; //variable for digit conversion
string roman_digit;
while(1){ //endless loop, good for seing all the input and brakeing when input is not a positive number
cout << "Enter the number you want to convert to roman (0 or negative to exit) : ";
cin>>arabic_Numeral
if(arabic_Numeral<1) break;
roman_Numeral="";
index=0;
while(arabic_Numeral!=0){ //the algoritym for conversion
digit=arabic_Numeral%10; //take the last digit
arabic_Numeral/=10; //leave all the other digits
switch(digit){ //convert digit here depending on the index we know in what range the number is.
case 0:
roman_digit="";
break;
case 1:
roman_digit=numerals[index];
break;
case 2:
roman_dgigit=numerals[index]+numerals[index];
break;
case 3:
roman_digit=numerals[index]+numerals[index]+numerals[index];
break;
case 4:
roman_digit=numerals[index]+numerals[index+1];
break;
case 5:
roman_digit=numerals[index+1];
break;
case 6:
roman_digit=numerals[index+1]+numerals[index];
break;
case 7:
roman_digit=numerals[index+1]+numerals[index]+numerals[index];
break;
case 8:
roman_digit=numerals[index+1]+numerals[index]+numerals[index]+numerals[index];
break;
case 9:
roman_digit=numerals[index]+numerals[index+2];
break;
default:
roman_digit="";
break;
}
roman_Numeral=roman_digit+roman_Numeral; //add the new digit to the previously calculated ones
index+=2; //increes the index to know where to look in the roman digit string
if(index>5){ //only will activate if number is greater than 1000
while(arabic_Numeral!=0){ //all else is just adding the correct count of 'M' in front.
roman_Numeral="M"+roman_Numeral;
arabic_Numeral;
}
}
}
cout<<"Your roman numeral is: "+roman_Numeral;
}
return 1;
}
Even if it seems like a simple conversion, you must break the process into logical parts. You can allmost never reuse the same code for backward conversion, so you will allways have to make a new algorythm (code). 
ok I understand a little better especially about the backwards conversion and having to rewrite the algorythm only small issue is when I tried to run it to see how it would go it had some simple debugging wrrors I tried to find them but no luck they seemed really simple to fix
1>Rewrite.cpp(19): error C2143: syntax error : missing ';' before 'if'
1>Rewrite.cpp(34): error C2065: 'roman_dgigit' : undeclared identifier
but that was it and I really appreciate the explanations it will make rewriting a lot more comprehendable thank you 
hk3008 said:ok I understand a little better especially about the backwards conversion and having to rewrite the algorythm only small issue is when I tried to run it to see how it would go it had some simple debugging wrrors I tried to find them but no luck they seemed really simple to fix
1>Rewrite.cpp(19): error C2143: syntax error : missing ';' before 'if'
1>Rewrite.cpp(34): error C2065: 'roman_dgigit' : undeclared identifier
but that was it and I really appreciate the explanations it will make rewriting a lot more comprehendable thank you
the errors you get are from my mistyping in the forum, so just add the ';' and the second has one 'g' too many
Related Resources
Ask a new question
Read More
Programming
Apps
Related Resources
 [Solved]Sorry too many clients in Python Postgresql code
 C# string help
 Having massive problem in making this work !!!!!!!
 Problem in java
 C++ array program
 Very Confused  JAVA
 Display not working
 Java Programming code
 Help with a C++ program please
 C programming solver
 A long string of memory errors
 Prompt for String in Batch File
 String of odd but perhaps related issues (warning: long)