我正在使用从Roman转换为Decimal的程序。我必须验证两件事:输入的字符是M或D或C或L或X或V或I,换句话说有效处理。
第二,我必须确保更大的字符值先行,如果没有打印和错误消息,让用户再试一次(这是我被卡住的部分)
例如,如果我想输入9并输入IX,则应显示错误消息,因为它不在Additive form中。它应该是VIIII。我该如何编码,以便比较字符以了解更大的字母值是否是第一个等等?
我一直得到不正确的验证 有没有办法为字符串中的字母赋值?我正在考虑将它们作为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";
}
}
}
答案 0 :(得分:2)
我建议使用std::map<char, int>
来保存letetrs和值之间的映射。
使用地图,您可以将输入字符串(字符序列)转换为值序列(std::vector<int>
)。从那以后,它只是一次检查以查看向量是否已排序,以及单个函数调用以将所有值相加。 (我将把正确的功能留给家庭作业)