2014-11-12 4 views
4

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

Как исправить ошибку?

Вот мой код:

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

Вы должны использовать 'std :: string' вместо массива' char'. – Borgleader

+4

используйте отладчик. – pm100

+2

и сообщите нам, какой ввод производит то, что выдает мусор – pm100

ответ

0

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

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

@ fjardon- Спасибо за редактирование..Но все-таки я получаю значение мусора –

1

Вы не инициализирует д до 0

в обращенный пут г = 0 в начале

+0

Какая польза от повторения моего ответа? – fjardon

+1

мы оба набрали его одновременно.Почему вы повторили мой ответ :-) – pm100

+0

Lol парни, успокойтесь! Спасибо, что указали на ошибку, но я все еще получаю мусор. –

2

Мало р.о. ints:

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

Спасибо Ajay за последнее предложение! Я его реализовал. Теперь мой код работает отлично, так как теперь я был wriiten d = 0; Раньше я написал int 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 :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(); 

} 
Смежные вопросы