Дана строка вида:
«число1, число2, число3, ..., числоN»
Необходимо написать функцию,
которая возвращает вектор с числами из этой строки.
Числа разделены запятыми, но не более, чем одной.
Разделители (пробелы, табуляция и т.д.),
между числами и разделяющими их запятыми не играют роли.
Если исходная строка имеет ошибки,
то необходимо бросить исключение std::invalid_argument(message),
где message — описание ошибки и её место в строке.
Если в строке ошибок несколько, то достаточно информации о первой из них.
Числа могут быть как положительные, так и отрицательные.
Положительные числа могут начинаться со знака «+».
Знак числа должен примыкать к числу без пробелов:
«+55» — ok
«- 55» — ошибка
В случае, если число не может вместится в тип int,
необходимо также выбросить исключение std::invalid_argument.
Использовать можно любые средства из стандартных библиотек C и C++.
Продемонстрировать использование функции на различных строках,
вывести для каждой строки получившийся вектор
или сообщение об ошибке в std::cout.
Примеры строк:
«1, 4, 5, -6, 8, 3, 1» — ok
« 5 , 6, 57, +68 , 18, 32, 4 » — ok
«77» — ok
«» — ок
« » — ок
«1, 4, 5, 6, 8, 3, 1,» — ошибка (отсутствует значение там-то там-то)
« , 6, 57, 68 , 18, 32, 4» — ошибка (отсутствует значение там-то там-то)
«5, 6, , 68, 18, 32, 4» — ошибка (отсутствует значение там-то там-то)
«5, 6, T, 68, 18, 32, 4» — ошибка (аргумент не является числом там-то там-то)
«5, 6, 34T, 68, 18, 32, 4» — ошибка (аргумент содержит не только число там-то там-то)
«5, 6, 34 55, 68, 18, 32, 4» — ошибка (аргумент содержит не только число там-то там-то)
«,» — ошибка (отсутствует значение там-то там-то)
«,,» — ошибка (отсутствует значение там-то там-то)
Функция должна иметь прототип
std::vector<int> parse(const std::string&);
Дополнительно: сделать функцию шаблоном,
чтобы работать не только с типом int,
но и с другими целочисленными типами.
На счет 10 минут, вы мне, сударь, льстите )) Тут только клавиатуру топтать не меньше 10 минут потребуется. А ещё и подумать надо, и отладить.
Что-то мне сдаётся, что новичкам не по зубам будет. Или просто, как обычно, по кустам отсидятся. Осмысленно в обсуждении примут участие три человека: два — уже понятно, третий — думаю, сам догадаешься ;)
Недавно мне как раз пришлось выполнить эту задачу.
Ушло где-то полчаса, но это с объяснением новичку
того, как работает всё это дело работает,
думаю, без объяснений ушло бы минут 10-20.
Конечно же, я использовал прелести стандартной библиотеки :)
Комментариев во коду нет, грешен, поэтому пару слов здесь. Табличка permit содержит значения для состояния. Первый индекс — текущее состояние, второй индекс — следующее состояние. Значение -1 показывает, что следующее состояние возможно. Значение => 0 — это индекс сообщения об ошибке в массиве err_msg. Остальное вроде достаточно прозрачно.
Недавно мне как раз пришлось выполнить эту задачу. [skip] без объяснений ушло бы минут 10-20. Конечно же, я использовал прелести стандартной библиотеки :)
Я STL знаю не очень хорошо, поэтому весьма любопытно.
У меня ещё была мысль использовать регулярные выражения. Если бы я писал на Perl, то скорее всего я бы использовал их. Но для C++ мне кажется, это стрельба из пушки по воробьям. Хотя может я и ошибаюсь.
А я почему то и не думал, что конечные автоматы могут применятся на практике :\
почему? Очень даже часто используются.
Например, в моем последнем проекте автоматом
валидировалась правильность пакета, пришедшего из сети (полный пакет, часть, вообще не верный и т.д.)
Ну 10-20 минут-то можно выкроить что бы повторить решение ;)
Если те самые 10-20 минут есть в наличии :)
Да и зачем повторять?
Вот, выдрал из проекта (вроде бы всё выдрал),
немного переделал под наши условия (там немного другие были).
Шаблон удалил, ибо только загромождать будет.
Тексты ошибок смешные )))
Majestio, экспресс-анализ показал, что твой код валится на больших числах. std::stoi() в этом случае выбрасывает исключение, которое ты не обрабатываешь.
Ты немного невнимательно прочитал условие задания:
Если исходная строка имеет ошибки, то необходимо бросить исключение std::invalid_argument(message),
т.е. имелось ввиду, что исключение выбрасывается внутри функции, а ловится в вызывающем коде.
К сожалению не могу сейчас покопаться в коде — инструментов нет под рукой.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Дана строка вида:
«число1, число2, число3, ..., числоN»
Необходимо написать функцию,
которая возвращает вектор с числами из этой строки.
Числа разделены запятыми, но не более, чем одной.
Разделители (пробелы, табуляция и т.д.),
между числами и разделяющими их запятыми не играют роли.
Если исходная строка имеет ошибки,
то необходимо бросить исключение
std::invalid_argument(message)
,где message — описание ошибки и её место в строке.
Если в строке ошибок несколько, то достаточно информации о первой из них.
Числа могут быть как положительные, так и отрицательные.
Положительные числа могут начинаться со знака «+».
Знак числа должен примыкать к числу без пробелов:
«+55» — ok
«- 55» — ошибка
В случае, если число не может вместится в тип int,
необходимо также выбросить исключение std::invalid_argument.
Использовать можно любые средства из стандартных библиотек C и C++.
Продемонстрировать использование функции на различных строках,
вывести для каждой строки получившийся вектор
или сообщение об ошибке в std::cout.
Примеры строк:
«1, 4, 5, -6, 8, 3, 1» — ok
« 5 , 6, 57, +68 , 18, 32, 4 » — ok
«77» — ok
«» — ок
« » — ок
«1, 4, 5, 6, 8, 3, 1,» — ошибка (отсутствует значение там-то там-то)
« , 6, 57, 68 , 18, 32, 4» — ошибка (отсутствует значение там-то там-то)
«5, 6, , 68, 18, 32, 4» — ошибка (отсутствует значение там-то там-то)
«5, 6, T, 68, 18, 32, 4» — ошибка (аргумент не является числом там-то там-то)
«5, 6, 34T, 68, 18, 32, 4» — ошибка (аргумент содержит не только число там-то там-то)
«5, 6, 34 55, 68, 18, 32, 4» — ошибка (аргумент содержит не только число там-то там-то)
«,» — ошибка (отсутствует значение там-то там-то)
«,,» — ошибка (отсутствует значение там-то там-то)
Функция должна иметь прототип
Дополнительно: сделать функцию шаблоном,
чтобы работать не только с типом int,
но и с другими целочисленными типами.
В чём подвох? ;)
В качестве параметра функция получает
const std::string&
, илиconst char *
, или простоchar *
?Вообще лучше бы ты точно указал сигнатуру функции — меньше вопросов.
Числа в строке могут быть со знаком? Если да, то знак
+
допускается?Что должно происходить, если в строке указано формально корректное число, которое приводит к переполнению?
В принципе, без разницы, но давайте остановимся на std::string.
Конечно допускаются, как же иначе-то :)
Но только не в отрыве от числа.
Хм... а давайте тоже будем кидать
исключение std::invalid_argument с нужным текстом.
Дополню первый пост.
Спасибо за замечания.
Ни в чем, почему здесь должен быть подвох?
Это же не Вам задание, а новичкам.
Думаю, вы минут за 10 такое напишите :)
На счет 10 минут, вы мне, сударь, льстите )) Тут только клавиатуру топтать не меньше 10 минут потребуется. А ещё и подумать надо, и отладить.
Что-то мне сдаётся, что новичкам не по зубам будет. Или просто, как обычно, по кустам отсидятся. Осмысленно в обсуждении примут участие три человека: два — уже понятно, третий — думаю, сам догадаешься ;)
Недавно мне как раз пришлось выполнить эту задачу.
Ушло где-то полчаса, но это с объяснением новичку
того, как работает всё это дело работает,
думаю, без объяснений ушло бы минут 10-20.
Конечно же, я использовал прелести стандартной библиотеки :)
Если они здесь вообще есть.
Ну пусть сидят, так и не научаться.
Раз никто не хочет предложить решение, то я предложу свой говнокод :)
А вот и третий.
Я угадал кто это будет )))
Вывод один — ему это тоже интересно,
человек практикуется на простеньких задачках.
Видимо больше ни кто не подключится. Значит будем соображать «на троих» ))
Я тоже накидал решение задачи. Не совсем им доволен, но, к сожалению, времени на доводку сейчас нет. Но как концепт вполне ничего.
Вариация на тему конечных автоматов, если быть более точным, на ДКА.
Комментариев во коду нет, грешен, поэтому пару слов здесь. Табличка
permit
содержит значения для состояния. Первый индекс — текущее состояние, второй индекс — следующее состояние. Значение-1
показывает, что следующее состояние возможно. Значение=> 0
— это индекс сообщения об ошибке в массивеerr_msg
. Остальное вроде достаточно прозрачно.Инетерсное решение.
А я почему то и не думал, что конечные автоматы могут применятся на практике :\
Croessmah, выкатывай свой вариант.
Я STL знаю не очень хорошо, поэтому весьма любопытно.
У меня ещё была мысль использовать регулярные выражения. Если бы я писал на Perl, то скорее всего я бы использовал их. Но для C++ мне кажется, это стрельба из пушки по воробьям. Хотя может я и ошибаюсь.
Чуть позже, сейчас до него не добраться )))
почему? Очень даже часто используются.
Например, в моем последнем проекте автоматом
валидировалась правильность пакета, пришедшего из сети (полный пакет, часть, вообще не верный и т.д.)
Ну 10-20 минут-то можно выкроить что бы повторить решение ;)
Если те самые 10-20 минут есть в наличии :)
Да и зачем повторять?
Вот, выдрал из проекта (вроде бы всё выдрал),
немного переделал под наши условия (там немного другие были).
Шаблон удалил, ибо только загромождать будет.
Тексты ошибок смешные )))
http://rextester.com/OSJO74949
Зашел к вам на огонек :)
http://ideone.com/gDLYpb
Majestio, экспресс-анализ показал, что твой код валится на больших числах.
std::stoi()
в этом случае выбрасывает исключение, которое ты не обрабатываешь.Ты немного невнимательно прочитал условие задания:
т.е. имелось ввиду, что исключение выбрасывается внутри функции, а ловится в вызывающем коде.
К сожалению не могу сейчас покопаться в коде — инструментов нет под рукой.
Согласен. Исправил. Но не суть — просто хотел показать, что парсить текст не просто удобно, а естественно, используя регулярки.
http://ideone.com/n14j5U
Четвертый! Всё, бригада )))
маэстро ошибся )))