#c #string #class
#c #строка #класс
Вопрос:
Я пытался создать программу для преобразования римских цифр в арабские цифры, но по какой-то причине, когда он переходит к функции setNumeri, вводимый текст очень сильно перепутывается еще до того, как он сможет добраться до части преобразования.
Проблема заключается в функции setNumeri, вы можете игнорировать все остальное, потому что я вставил все, чтобы быть уверенным, что ничего не упустил.
Я приношу извинения за то, что некоторые переменные указаны на итальянском языке, но это должно быть довольно просто.
Вот код:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
class IX{
public:
void setNumeri(string rom);
void setArabo();
int getArabo();
private:
int length;
int Arabo;
int Numeri[];
};
void IX::setNumeri(string rom){
length = rom.length();
for(int i = length - 1; i >= 0; i--) {
cout << rom.at(i) << endl;
switch (rom.at(i)){
case 'I':
Numeri[i] = 1;
break;
case 'V':
Numeri[i] = 5;
break;
case 'X':
Numeri[i] = 10;
break;
case 'L':
Numeri[i] = 50;
break;
case 'C':
Numeri[i] = 100;
break;
case 'D':
Numeri[i] = 500;
break;
case 'M':
Numeri[i] = 1000;
break;
}
}
}
void IX::setArabo(){
int counter = Numeri[length];
for(int i = length - 1; i >= 0; i--){
if(Numeri[i] == 0) {
counter = counter Numeri[i];
} else if(Numeri[i] > Numeri[i-1]) {
counter = counter - Numeri[i-1];
i--;
} else if(Numeri[i] <= Numeri[i-1]) {
counter = counter Numeri[i-1];
}
}
Arabo = counter;
}
int IX::getArabo(){
return Arabo;
}
int main(){
IX lol;
string hellothere;
cout << "Roman numeral:" << endl << endl;
cin >> hellothere;
lol.setNumeri(hellothere);
cout << lol.getArabo() << endl;
return 0;
}
Когда я ввожу XIII, на выходе получается:
I
I
□
-107362937
Это последнее зловещее число является результатом преобразования, в то время как первые 3 символа (один отсутствует в действии, а один вообще не распознается) выводятся с помощью string.at () это, как вы можете видеть, проделало замечательную работу по правильному набору строковых символов. Попробовал вместо этого использовать string[], но безуспешно.
Что еще более странно, так это тот факт, что однажды я удалил весь случай переключения string.at () возвращает правильную строку, похоже, что строка каким-то образом запутывается во время переключения. То же самое происходит с использованием оператора if вместо переключателя.
Заранее спасибо.
Комментарии:
1. Это был сломанный код или что-то в этом роде. Возможно, это было вызвано ведущим комментарием, который у вас был в той же строке. Отступ на четыре пробела (с помощью
{}
кнопки) работает лучше всего.2. Не похоже, что для вашего массива была выделена какая-либо память? Попробуйте заменить
int Numeri[];
наint Numeri[100];
3. Вы имеете в виду тот факт, что часть объяснения была внутри кода, верно? Спасибо за совет! @Carcigenicate
4. @StephenQuan спасибо, это исправлено! Я думал, что выделение памяти происходит автоматически, когда внутри скобок ничего нет. Раньше это выдавало мне ошибки (гибкий элемент массива не в конце класса), но перемещение его в конец класса исправило это. Теперь я должен разобраться со всем остальным.
Ответ №1:
попробуйте следующий код, он работает отлично.
#include <cstdlib>
#include <string>
using namespace std;
class IX{
public:
void setNumeri(string rom);
int getArabo();
private:
int length;
int Numeri[100];
};
void IX::setNumeri(string rom){
length = rom.length();
for (int i = 0; i < 100; i )
{
Numeri[i]=-1;
}
for(int i = length - 1; i >= 0; i--) {
cout << rom.at(i) << endl;
switch (rom.at(i)){
case 'I':
Numeri[i] = 1;
break;
case 'V':
Numeri[i] = 5;
break;
case 'X':
Numeri[i] = 10;
break;
case 'L':
Numeri[i] = 50;
break;
case 'C':
Numeri[i] = 100;
break;
case 'D':
Numeri[i] = 500;
break;
case 'M':
Numeri[i] = 1000;
break;
}
}
}
int IX::getArabo(){
int sum=0;
for (int i = 0; i < 100; i )
{
if (Numeri[i]==-1)
{
return sum;
}
else
{
sum =Numeri[i];
}
}
}
int main(){
IX lol;
string hellothere;
cout << "Roman numeral:" << endl << endl;
cin >> hellothere;
lol.setNumeri(hellothere);
cout << lol.getArabo() << endl;
return 0;
}