Римские числа в десятичные числа, получая значение мусора

Я должен создать программу для преобразования римских цифр в десятичные числа, для которых я получаю значение мусора в качестве вывода.
Дело в том, что я дважды проверил свою логику, и это кажется правильным.

Как я могу это исправить?

Вот мой код:

#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();
}

4

Решение

Несколько баллов:

  • Не переходите непосредственно к разбору дорогих римлян. Начать с I, V, а также X только (то есть сначала цель 1–10, затем 11–20, затем 21–39, 40–99, 100–499 и т. д.)
  • Не думайте, что если I дано, дано до или после V или же X, Это может быть дано для себя (например. II — Вы еще часть предполагает что-то).
  • приписывать ценность d с нуль
  • Сделайте пошаговую отладку, посмотрите значение d и другие переменные. Если отладчик не работает или доступен, выводите значения на каждом шаге / итерации.
  • [добавлять] Вам не нужно проходить str функционировать convert, поскольку они принадлежат к одному классу, и convert может / будет читать тот же контент.
2

Другие решения

Вы не инициализировали d в 0

в конверте положить d = 0 в начале

1

Вы не инициализировали d до 0. Пожалуйста, добавьте это в верхней части вашего convert функция:

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

ОК, ребята, спасибо за помощь. Это решено сейчас. Я сделал грубую ошибку, и это снова было инициализировано d в convert (), так что он стал локальной переменной. Смотрите комментарии:

#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 :Dfor(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();

}
0
По вопросам рекламы [email protected]