Я самообучаюсь себе, используя структуры данных Малика «Структуры данных и алгоритм разработки с использованием c ++».Первое упражнение состоит в том, чтобы создать объект типа numeralType
и включить в него все необходимые операции, чтобы получить в строке возвращаемое ей значение в системе римских цифр.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ 1: Предположим, что существуетпроверка данных и все сделано, кроме функции, которая преобразует строку в ее значение в системе римских цифр.Кроме того, я использую VS17.
Я не буду публиковать оригинальную функцию "преобразования".Вместо этого я опубликую обобщенную версию алгоритма, используемого в функции.
здесь:
#include <iostream>
#include <string>
#include<map>
int main()
{
int result = 0;
std::map<char, int> charMap = { {'f',1},{'h',2},{'x',3},{'b',4},{'l',5} };
std::string testString = "lbxhf";
for (unsigned int i = 0; i < testString.length(); i++)
{
if (charMap.at(testString.at(i)) >= charMap.at(testString.at(i + 1)))
result = charMap.at(testString.at(i)) +
charMap.at(testString.at(i + 1));
}
system("pause");
return 0;
}
Этот код автоматически вызывает abort()
, но компилируется нормально.
Используя отладчик VS, я выделил, что причина в строке, но я не знаю точно, почему.
Используя блок try / catch, я получаю ошибку invalid string position
.Вот версия try / catch:
int main()
{
int result = 0;
std::map<char, int> charMap = { {'f',1},{'h',2},{'x',3},{'b',4},{'l',5} };
std::string testString = "lbxhf";
try
{
for (unsigned int i = 0; i < testString.length(); i++)
{
if (charMap.at(testString.at(i)) >= charMap.at(testString.at(i + 1)))
result = charMap.at(testString.at(i)) + charMap.at(testString.at(i + 1));
}
}
catch(const std::out_of_range& e)
{
std::cout << e.what() << std::endl;
}
system("pause");
return 0;
}
Я целый день ломал голову над этим и хотел бы дать несколько советов, как решить эту проблему.
Снова, это общая версия алгоритма, который принимает строку римских цифр и возвращает ее значение в виде целого числа.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ 2: Этот алгоритм подразумевает только сложение, основанное на правилах сложения / вычитанияримская система счисления.ДИСКАЛИМЕР 3: для меня важно, чтобы я использовал std :: map, я знаю, что это можно сделать с использованием массива / векторного типа, но я также хочу попрактиковаться в использовании контейнеров stl.
Заранее спасибо (не надо быть ужасно подлыми парнями !!)