【发布时间】:2013-12-19 20:50:51
【问题描述】:
我必须确保输入的字母仅包含 M、D、C、L、X、V 和 I,我已经这样做了。
我的问题是它们是罗马数字,并且我还必须确保如果较低值的字符在较高值的字符之前,则它遵循罗马数字的规则:
-
M、D、C 前面可以有一个低 2 位的字符,因此
CM或DM可以,但LM不行。 -
L、X、V 前面只能有一个低 1 位的字符,所以
XL可以,但VL不行。
7个字母代表数值如下:
╔════════╦═══════╗
║ Symbol ║ Value ║
╠════════╬═══════╣
║ I ║ 1 ║
║ V ║ 5 ║
║ X ║ 10 ║
║ L ║ 50 ║
║ C ║ 100 ║
║ D ║ 500 ║
║ M ║ 1,000 ║
╚════════╩═══════╝
这是我目前所拥有的:
void romanType::storeRoman()
{
locale loc;
bool valid = true;
do
{
valid = true;
cout << "please enter a roman numeral using no spaces:" << endl;
getline(cin, rNums);
for (i = 0; i < rNums.length(); ++i)
{
rNums[i] = toupper(rNums[i], loc);
if (rNums[i] == 'M' || rNums[i] == 'D' || rNums[i] == 'C' ||
rNums[i] == 'L' || rNums[i] == 'X' || rNums[i] == 'V' ||
rNums[i] == 'I')
{
continue;
}
valid = false;
}
cout << "input error please try again\n" << endl;
} while (!valid);
/* ... */
}
只要所有字符都是罗马数字,它就可以工作,但我一生都无法弄清楚如何实现我提到的其他 2 个约束。我已经编写了程序的大部分其余部分,但我可能花了 6-7 个小时试图让这一部分也能正常工作。请帮忙。
【问题讨论】:
-
请以人们可以阅读的方式格式化您的代码。完全随机格式化似乎是所有者不理解的代码的共同特征。
-
好吧,把定义好的数字字符按正确的顺序放在一个数组中,然后匹配你输入的字符,并根据索引做一些相对比较。
-
这是一些很奇怪的要求,会不会让某些数字无法输入?
-
哈,我没想到 VL 是不正确的(而 XLV 似乎是“正确”的选择。)
-
对哞哞鸭:不,它们就是这样工作的。
标签: c++ validation input