Уважаемые форумчане, оцените пожалуйста грамотность решения задания. Имеется ввиду правильно ли спроектировано приложение, грамотно ли использовались используемые библиотеки, а также укажите на наличие "грязи" в решении. То есть, хочется услышать все "ляпы", которые допущены при выполнении задания. А также как бы Вы сами сделали бы такое задание, если бы пришлось его решать.
Само решение(проект и скомпилированный экзешник) выложил здесь http://files.rsdn.ru/93750/test.rar
Тестовое задание следующее:
Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.
Вводим: 131
Выводим:
сто тридцать один в десятичной системе;
двести три в восьмеричной системе.
При проектировании подумайте о том, как ваше решение можно было бы локализовать на английский язык (тут обратите внимание, например, на цифру "двести", которая на английском будет состоять из двух слов).
Добавлю небольшой свой комментарий к решению:
Программа может переводить в текстовый формат числа на двух языках — русском и английском. А также конвертировать введеное число в восьмеричную систему счисления.
Программа спроектирована таким образом, что ее можно легко масштабировать.
Создан абстрактный класс Translate_base и от него наследуются классы перевода на разные языки — Translate_rus и Translate_eng. В каждом из этих классов создается объект словаря, который содержит только слова перевода.
Также создан отдельный класс хранения введеного и сконевертированного значения (Storage_Values), а также метод конвертации. Классы перевода являются "друзьями" по отношению к классу хранения чисел.
Максимальное количество порядков, которое может вывести программа ограничена "триллионами". При желании это ограничение можно снять или уменьшить, добавив нужные термины в словарь и в класс перевода (по крайней мере, для русского и английского языков это не составляет труда и делается точно также как и для слов "миллионов", "миллиардов" и т.д.)
Таким образом, для добавления нового языка достаточно создать новый класс словаря и описать для него обработку перевода, аналогично как это сделано для русского и английского языков. Также чтобы добавить перевод числа в другие системы счисления достаточно добавить новую функцию конвертации в класс Storage_Values.
Для использования более привычного интерфейса вывода переведенных значений в текстовом формате, был перегружен оператор <<.
Также использовался механизм исключений для отслеживания исключительных ситуаций и их корректной обработки.
В программе использовались библиотеки STL, Boost и среда разработки VS2008.
05.09.10 15:31: Перенесено модератором из 'C/C++' — Odi$$ey
Здравствуйте, Useverlo, Вы писали:
U>Уважаемые форумчане, оцените пожалуйста грамотность решения задания. Имеется ввиду правильно ли спроектировано приложение, грамотно ли использовались используемые библиотеки, а также укажите на наличие "грязи" в решении. То есть, хочется услышать все "ляпы", которые допущены при выполнении задания. А также как бы Вы сами сделали бы такое задание, если бы пришлось его решать. U>Само решение(проект и скомпилированный экзешник) выложил здесь U>http://files.rsdn.ru/93750/test.rar
U>Тестовое задание следующее:
U>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.
U>Вводим: 131 U>Выводим: U>сто тридцать один в десятичной системе; U>двести три в восьмеричной системе.
А род анализируешь? Один рубль, Одна копейка. Тоже в текст по разному формируется
Здравствуйте, Useverlo, Вы писали:
U>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.
U>Вводим: 131 U>Выводим: U>сто тридцать один в десятичной системе; U>двести три в восьмеричной системе.
Дальше задание можно не читать. 131 десятичное — это всегда сто тридцать один. Двести три — это всегда 203_10. В системах счисления с базой, отличной от 10, числа читаются поразрядно: «два ноль три восьмеричное».
Здравствуйте, Useverlo, Вы писали:
U>Также использовался механизм исключений для отслеживания исключительных ситуаций и их корректной обработки. U>В программе использовались библиотеки STL, Boost и среда разработки VS2008.
К чему было городить столько классов, буст, исключения.
Достаточно одной небольшой функции, цикл по три разряда, результат складывать в std::string.
Векторы там нафиг не нужны.
Перегружать решение простой задачи модными технологиями это плохо.
Еще одна функция конвертирует в восьмеричное представление. Английское произношение не нужно было делать.
К тому же, насколько помню, thousands и прочие это неправильно.
Число читается порциями по два разряда, старшие нули в паре читаются как "оу"
(Если соврал, знатоки поправят).
ROP>К тому же, насколько помню, thousands и прочие это неправильно.
Ну, не столько неправильно, сколько не используется. Как правило, четырехзанчные числа произносятся в сотнях, напримерЖ
1234 — twelve hanudered thirty four.
Здравствуйте, batu, Вы писали:
B>Здравствуйте, Useverlo, Вы писали:
U>>Уважаемые форумчане, оцените пожалуйста грамотность решения задания. Имеется ввиду правильно ли спроектировано приложение, грамотно ли использовались используемые библиотеки, а также укажите на наличие "грязи" в решении. То есть, хочется услышать все "ляпы", которые допущены при выполнении задания. А также как бы Вы сами сделали бы такое задание, если бы пришлось его решать. U>>Само решение(проект и скомпилированный экзешник) выложил здесь U>>http://files.rsdn.ru/93750/test.rar
U>>Тестовое задание следующее:
U>>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.
U>>Вводим: 131 U>>Выводим: U>>сто тридцать один в десятичной системе; U>>двести три в восьмеричной системе.
B>А род анализируешь? Один рубль, Одна копейка. Тоже в текст по разному формируется
U>я помню, что делал аналогичную задачку при поступлении в Акронис
1. Поясните плз, в чем здесь перл
2. Если Вы делали эту задачку и Вас взяли в Акронис на работу, порекомендуйте как правильно выстроить иерархию классов.
Здравствуйте, SpaceConscience, Вы писали:
SC>Все очень плохо — решение задачи, архитектурно, по стилю, технически. Конкретно расписывать лень, так как, в принципе, все надо переделать.
SC>Уровень — Junior Developer / стажер.
догадываюсь, что все плохо. Именно поэтому к грамотным специалистам и обратился, чтобы подсказали, как правильно спроектировать и выстроить иерархию классов.
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, Useverlo, Вы писали:
U>>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.
U>>Вводим: 131 U>>Выводим: U>>сто тридцать один в десятичной системе; U>>двести три в восьмеричной системе.
C>Дальше задание можно не читать. 131 десятичное — это всегда сто тридцать один. Двести три — это всегда 203_10. В системах счисления с базой, отличной от 10, числа читаются поразрядно: «два ноль три восьмеричное».
Вводим: 131
Выводим:
сто тридцать один в десятичной системе;
двести три в восьмеричной системе.
эта фраза из задания. поэтому дальнейшие рассуждения о том, как нужно читать те или иные числа считаю не обоснованными. Есть пример как нужно сделать, так и делаю.
Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>Здравствуйте, Useverlo, Вы писали:
U>>Также использовался механизм исключений для отслеживания исключительных ситуаций и их корректной обработки. U>>В программе использовались библиотеки STL, Boost и среда разработки VS2008.
ROP>К чему было городить столько классов, буст, исключения. ROP>Достаточно одной небольшой функции, цикл по три разряда, результат складывать в std::string. ROP>Векторы там нафиг не нужны. ROP>Перегружать решение простой задачи модными технологиями это плохо.
Сформировав такую иерархию (видимо она не самая удачная, но другой сейчас придумать не могу) я пытался сделать приложение расширяемым. Т.е. для добавления перевода на другой язык, в моем случае достаточно добавить класс словаря (где хранится нужный набор слов) и класс переводчика (все-таки считаю что логика перевода для каждого языка своя и именно по этой причине при добавления перевода по-любому придется переписывать логику перевода, как бы она ни была похожа на логику какого-то другого языка).
Если кто-то может сказать, как более грамотно создать простое и масштабируемое решение, то буду рад выслушать ваши мнения.
Как Вы и сказали, вся логика перевода действительна помещена в одну функцию TranslateImpl. Все остальные функции носят сопроводительный характер, очистка контейнеров, вывод на экран и т.д.
То что касается Boost и Stl, то использовал их исключительно для создания безопасного и устойчивого кода — векторы, умные указатели, исключения, перевод из числа в строку и т.д.
Считаю этими технологиями не модными, а современными и рекомендуемыми ведущими специалистами к использованию. Если бы речь шла о скорости выполнения кода, то наверное стоило бы задуматься. В задании, как я понимаю, нужно создать простое, но устойчивое решение и при этом продемонстрировать работодателю знания указанных технологий.
Re: Оцените решение
От:
Аноним
Дата:
08.09.10 07:44
Оценка:
Здравствуйте, Useverlo, Вы писали:
U>skip
я как-то писал для акрониса вот это
Здравствуйте, Useverlo, Вы писали:
U>эта фраза из задания. поэтому дальнейшие рассуждения о том, как нужно читать те или иные числа считаю не обоснованными. Есть пример как нужно сделать, так и делаю.
Ну тогда вот ещё вариант задания. Требуется ввести два числа и посчитать их произведение. Например, 6*6 = 11, 8*8 = 3 (пруфлинк).
Здравствуйте, Useverlo, Вы писали:
U>1. Поясните плз, в чем здесь перл U>2. Если Вы делали эту задачку и Вас взяли в Акронис на работу, порекомендуйте как правильно выстроить иерархию классов.
1. у любого контейнера есть функция clear().
2. Вы задаёте вопросы из разряда "научите меня программировать". Решение Вы сильно перенасытили технологиями. Решение не кроссплатформенное. Большие функции, все в глобальном неймспейсе, использование шаблонных классов без тайпдефов, где-то stl и буст "во всю", а где-то
char* tmp = new char[it->size() + 1];
. Решение должно быть таким, чтобы при добавлении языков Вам надо было внести как можно меньше изменений в код. Я бы, например, вообще грузил словари из xml. И тогда код можно было бы "в идеале" вообще не менять для любых языков. Но как тестовое задание (т.е. за бесплатно) я бы такое никогда делать не стал
3. оффтоп: и дался вам этот акронис — там работать заставляют, не ходите туда
Здравствуйте, szag, Вы писали:
S>Здравствуйте, Useverlo, Вы писали:
U>>1. Поясните плз, в чем здесь перл U>>2. Если Вы делали эту задачку и Вас взяли в Акронис на работу, порекомендуйте как правильно выстроить иерархию классов.
S>1. у любого контейнера есть функция clear(). S>2. Вы задаёте вопросы из разряда "научите меня программировать". Решение Вы сильно перенасытили технологиями. Решение не кроссплатформенное. Большие функции, все в глобальном неймспейсе, использование шаблонных классов без тайпдефов, где-то stl и буст "во всю", а где-то
char* tmp = new char[it->size() + 1];
. Решение должно быть таким, чтобы при добавлении языков Вам надо было внести как можно меньше изменений в код. Я бы, например, вообще грузил словари из xml. И тогда код можно было бы "в идеале" вообще не менять для любых языков. Но как тестовое задание (т.е. за бесплатно) я бы такое никогда делать не стал S>3. оффтоп: и дался вам этот акронис — там работать заставляют, не ходите туда
а Вы знаете места где работать не заставляют? и при приеме на работу не дают тестовых заданий и при этом хорошо платят?
Здравствуйте, Useverlo, Вы писали:
U>а Вы знаете места где работать не заставляют? и при приеме на работу не дают тестовых заданий и при этом хорошо платят?
полно адекватных контор, где не просят сделать тестовые задания и платят не меньше, а то и больше. Акронис сейчас предлагает 78500 — 120000 гросс, если я не ошибаюсь. ИМХО, это средние зп по мск, так что выбор большой. Удачи!