【问题标题】:Roman numbers to decimal numbers, getting garbage value罗马数字转十进制数字,获取垃圾值
【发布时间】:2014-11-12 15:20:41
【问题描述】:

我必须创建一个程序来将罗马数字转换为十进制数字,我将得到垃圾值作为输出。 事实是我已经仔细检查了我的逻辑,它似乎是正确的。

我该如何纠正它?

这是我的代码:

#include<iostream>
#include<cstring>
using namespace std;

class RomanType
{
  char str[10];
  int d;
public:
  void accept()
  {  
    cout<<"Enter Roman No. in capitals:"<<endl;
    cin>>str;
    convert(str);
  }

  void convert(char str1[10])
  {
    int j=0;

    for(j=0;j<strlen(str1);j++)
    {

    if( str1[j]=='I')
    {
        if(str1[j+1]=='V' || str1[j+1]=='X')
        {
            d=d-1;
            cout<<j<<endl;
        }
        else
        {
            d=d+1;
            cout<<d<<endl;
        }
    }

    if ( str1[j]=='V')
        d=d+5;

    if(str1[j]=='X')
    {
        if(str1[j+1]=='L' || str1[j+1]=='C')
            d=d-10;
        else
            d=d+10;
    }

    if(str1[j]=='L')
        d=d+50;

    if( str1[j]=='C')
    {
        if(str1[j+1]=='D' || str1[j+1]=='M')
            d=d-100;
        else
            d=d+100;
    }

    if(str1[j]=='D')
        d=d+500;

    if(str1[j]=='M')
        d=d+1000;
    }
  }

  void display()
  {
    cout<<"It's decimal equivalent is="<<d<<endl;
  }
};

main()
{
  RomanType obj;
  obj.accept();
  obj.display();
}

【问题讨论】:

  • 你应该使用std::string而不是char的数组。
  • 告诉我们什么输入产生什么垃圾输出
  • 好吧,我发现 VI 产生 -1220155669,这肯定是错误的!
  • @Borgleader- 好的,但是我将如何遍历字符串?
  • @musefan- 确实有帮助,谢谢。现在我的代码正在运行,你可以看到它。 PS-我喜欢“时间不多了”,MuseFan!

标签: c++ data-conversion garbage roman-numerals


【解决方案1】:

几点:

  • 不要直接跳到解析高价值的罗马字。仅以 IVX 开头(即先定位 1 到 10,然后定位到 11 到 20,然后再定位到 21 到 39、40 到 99、100 到 499 等)
  • 不要假设如果给出了I,那么它是在VX 之前或之后给出的。它可能是为自己提供的(例如II - 你其他部分假设了一些东西)。
  • d 的值分配
  • 进行单步调试,观察d的值和其他变量。如果调试器不好或不可用,请在每个步骤/迭代中输出值。
  • [添加]您无需将str 传递给函数convert,因为它们属于同一类,而convert 可以/将读取相同的内容。

【讨论】:

  • 感谢 Ajay 的最后建议!我实现了它。现在我的代码运行良好,因为我现在写了 d=0;以前我写过 int d=0;所以它给了我垃圾价值。
【解决方案2】:

你没有将 d 初始化为 0

在转换中将 d=0 放在开头

【讨论】:

  • 重复我的答案有什么用?
  • 我们同时输入了它。你为什么重复我的回答:-)
  • 各位大佬,冷静点!感谢您指出错误,但我仍然得到垃圾价值。
【解决方案3】:

您没有将 d 初始化为 0。请将其添加到您的 convert 函数的顶部:

void convert(char str1[10])
{
    int j=0;
    d = 0;
    . . .

【讨论】:

  • @fjardon- 感谢您的编辑..但我仍然得到垃圾值
【解决方案4】:

好的,谢谢你们的帮助。现在已经解决了。我犯了一个错误,并在 convert() 中再次初始化了 d,因此它已成为局部变量。查看 cmets:

#include<iostream>
#include<cstring>
using namespace std;

class RomanType
{
char str[10];
int d;
public:
void accept()  // UNNECESSARILY NOT PASSING ANY STRING
{
    cout<<"Enter Roman No. in capitals:"<<endl;
    cin>>str;
    convert();
}

void convert()
{
     d=0;// PREVIOUSLY WRIITEN int d=0; so that was the mistake. Yay! it's solved :D


    for(int j=0;j<10;j++)
    {

    if( str[j]=='I')
    {
        if(str[j+1]=='V' || str[j+1]=='X')
        {
            d=d-1;
           // cout<<d<<endl;
        }
        else
        {
            d=d+1;
            //cout<<d<<endl;

        }

    }

    else if ( str[j]=='V')
        d=d+5;

    else if(str[j]=='X')
    {
        if(str[j+1]=='L' || str[j+1]=='C')
            d=d-10;
        else
            d=d+10;
    }

    else if(str[j]=='L')
        d=d+50;

    else if( str[j]=='C')
    {
        if(str[j+1]=='D' || str[j+1]=='M')
            d=d-100;
        else
            d=d+100;
    }

    else if(str[j]=='D')
        d=d+500;

    else if(str[j]=='M')
        d=d+1000;
    }


}

void display()
{
    cout<<"It's decimal equivalent is="<<d<<endl;
}
};

main()
{
RomanType obj;
obj.accept();
obj.display();

}

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2023-01-17
    • 1970-01-01
    相关资源
    最近更新 更多