C++ c++;罗马加法形式转换
我在一个从罗马到十进制的程序中工作。我必须验证两件事:一件是输入的字符是M或D或C或L或X或V或I,换句话说,对处理有效 第二,我必须确保先输入较大的字符值,如果不打印错误消息,则让用户再试一次(这是我遇到的问题) 例如,如果我想输入9和输入IX,它应该显示一条错误消息,因为它不在。应该是VIIII。我如何对其进行编码,使其比较字符,以了解较大的字母值是否在第一位,依此类推 我不断得到错误的验证。C++ c++;罗马加法形式转换,c++,string,roman-numerals,C++,String,Roman Numerals,我在一个从罗马到十进制的程序中工作。我必须验证两件事:一件是输入的字符是M或D或C或L或X或V或I,换句话说,对处理有效 第二,我必须确保先输入较大的字符值,如果不打印错误消息,则让用户再试一次(这是我遇到的问题) 例如,如果我想输入9和输入IX,它应该显示一条错误消息,因为它不在。应该是VIIII。我如何对其进行编码,使其比较字符,以了解较大的字母值是否在第一位,依此类推 我不断得到错误的验证。 有没有办法给字符串中的字母赋值?我考虑将它们作为int值进行比较,我知道如何验证输入格式 void
有没有办法给字符串中的字母赋值?我考虑将它们作为int值进行比较,我知道如何验证输入格式
void RomanNum::setRomanNumber() //get input and calculate decimal equivalent
{
//I 1, V 5, X 10, L 50, C 100, D 500, M 1000
int value = 0;
string input;
char current, next;
enum validationData { M, D, C, L, X, V, I };
bool validationCharacters = true;
//bool validationAdditiveForm = true;
getline(cin, input, '\n');
for (int i = 0; i < input.length(); i++) //calculate each Roman letter at a time
{
current = input[i];
next = current + 1;
if (current >= validationData(next))
{
switch (input[i])
{
case 'M':
value += 1000;
break;
case 'D':
value += 500;
break;
case 'C':
value += 100;
break;
case 'L':
value += 50;
break;
case 'X':
value += 10;
break;
case 'V':
value += 5;
break;
case 'I':
value += 1;
break;
default:
validationCharacters = false;
break;
}
}
else
{
cout << "\nInvalid order. Bigger values go first\n";
}
}
}
void RomanNum::setRomanNumber()//获取输入并计算十进制等效值
{
//I 1,V 5,X 10,L 50,C 100,D 500,M 1000
int值=0;
字符串输入;
当前字符,下一个;
枚举验证数据{M,D,C,L,X,V,I};
bool validationCharacters=true;
//bool validationAdditiveForm=true;
getline(cin,输入“\n”);
对于(int i=0;i=验证数据(下一个))
{
开关(输入[i])
{
案例“M”:
数值+=1000;
打破
案例“D”:
数值+=500;
打破
案例“C”:
数值+=100;
打破
案例“L”:
数值+=50;
打破
案例“X”:
数值+=10;
打破
案例“V”:
数值+=5;
打破
案例“I”:
数值+=1;
打破
违约:
validationCharacters=false;
打破
}
}
其他的
{
cout我建议使用std::map
来保存letetr和值之间的映射
使用映射,您可以将输入字符串(一个字符序列)转换为一个值序列(std::vector
)。从那时起,只需一次检查向量是否已排序,以及一次函数调用即可将所有值相加。(我将把查找正确的函数作为家庭作业)别忘了IX或IV是有效的罗马数字。祝你好运!是的,但我的老师希望它按后代顺序排列。这就是@Docteur Docteur这里的内容,正如Docteur所说:“祝你好运”。你需要尝试自己想出一个解决方案。如果你对你的一个想法有问题,来这里询问。如果你想知道哪一个是最优雅的,请在codereview姐妹网站上询问。到目前为止,已经尝试了2个小时,但没有成功…我尝试在切换前用第二个for循环验证它,但我不断出错。应该吗我上传那个版本了吗?@stefan一种方法是将字符转换成所需的顺序,例如enum-romadigit{I,V,X,L,C,d,M}然后你就可以测试最后一个数字是否等于这个数字了。如果你按照顺序1)读取输入,2)验证输入,3)执行实际计算,4)输出结果,你很可能会遇到更少的麻烦。我做了另一件事,效率很低,时间很长,因为我还没有学会如何使用map还没有。谢谢你的提示。你确实可以写if(character='D')vec.push_back(1000);否则if(character='C'…
。