Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;罗马加法形式转换_C++_String_Roman Numerals - Fatal编程技术网

C++ c++;罗马加法形式转换

C++ c++;罗马加法形式转换,c++,string,roman-numerals,C++,String,Roman Numerals,我在一个从罗马到十进制的程序中工作。我必须验证两件事:一件是输入的字符是M或D或C或L或X或V或I,换句话说,对处理有效 第二,我必须确保先输入较大的字符值,如果不打印错误消息,则让用户再试一次(这是我遇到的问题) 例如,如果我想输入9和输入IX,它应该显示一条错误消息,因为它不在。应该是VIIII。我如何对其进行编码,使其比较字符,以了解较大的字母值是否在第一位,依此类推 我不断得到错误的验证。 有没有办法给字符串中的字母赋值?我考虑将它们作为int值进行比较,我知道如何验证输入格式 void

我在一个从罗马到十进制的程序中工作。我必须验证两件事:一件是输入的字符是M或D或C或L或X或V或I,换句话说,对处理有效

第二,我必须确保先输入较大的字符值,如果不打印错误消息,则让用户再试一次(这是我遇到的问题)

例如,如果我想输入9和输入IX,它应该显示一条错误消息,因为它不在。应该是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";
        }
    }
}
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'…