Я работаю в программе, которая конвертирует из римских в десятичные. Я должен подтвердить две вещи: одна, что введенные символы являются 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";
}
}
}
Я бы порекомендовал std::map<char, int>
провести отображение между буквами и значениями.
С помощью карты вы можете преобразовать входную строку (последовательность символов) в последовательность значений (std::vector<int>
). С этого момента, это просто одна проверка, чтобы увидеть, отсортирован ли вектор, и один вызов функции, чтобы сложить все значения. (Я оставлю поиск правильной функции в качестве домашней работы)