Оцените решение
От: Useverlo  
Дата: 04.09.10 17:04
Оценка:
Уважаемые форумчане, оцените пожалуйста грамотность решения задания. Имеется ввиду правильно ли спроектировано приложение, грамотно ли использовались используемые библиотеки, а также укажите на наличие "грязи" в решении. То есть, хочется услышать все "ляпы", которые допущены при выполнении задания. А также как бы Вы сами сделали бы такое задание, если бы пришлось его решать.
Само решение(проект и скомпилированный экзешник) выложил здесь
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
Re: Оцените решение
От: batu Украина  
Дата: 04.09.10 17:32
Оценка:
Здравствуйте, Useverlo, Вы писали:

U>Уважаемые форумчане, оцените пожалуйста грамотность решения задания. Имеется ввиду правильно ли спроектировано приложение, грамотно ли использовались используемые библиотеки, а также укажите на наличие "грязи" в решении. То есть, хочется услышать все "ляпы", которые допущены при выполнении задания. А также как бы Вы сами сделали бы такое задание, если бы пришлось его решать.

U>Само решение(проект и скомпилированный экзешник) выложил здесь
U>http://files.rsdn.ru/93750/test.rar

U>Тестовое задание следующее:


U>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.


U>Вводим: 131

U>Выводим:
U>сто тридцать один в десятичной системе;
U>двести три в восьмеричной системе.

А род анализируешь? Один рубль, Одна копейка. Тоже в текст по разному формируется
Re: Оцените решение
От: uzhas Ниоткуда  
Дата: 04.09.10 18:52
Оценка:
Здравствуйте, Useverlo, Вы писали:

все не читал
тыкнул пару файлов
вот перл нашел:
bool Translator_eng::Erase()
{

  this->result_eng->erase(this->result_eng->begin(), this->result_eng->end());
  this->valueDec->erase(this->valueDec->begin(), this->valueDec->end());
  this->valueOct->erase(this->valueOct->begin(), this->valueOct->end());

...
}

typedef vector<int> vectInt;

class Translator_eng: public Translator_base
{
...
private:
    boost::shared_ptr<vectInt> valueDec;
    boost::shared_ptr<vectInt> valueOct;
    boost::shared_ptr<Dictionary_eng> dict;
    boost::shared_ptr<vectStr> result_eng;
};


я помню, что делал аналогичную задачку при поступлении в Акронис
Re: Оцените решение
От: SpaceConscience  
Дата: 04.09.10 22:14
Оценка: +2
Все очень плохо — решение задачи, архитектурно, по стилю, технически. Конкретно расписывать лень, так как, в принципе, все надо переделать.

Уровень — Junior Developer / стажер.
Собрался ставить минус? Да сам иди в жопу!

































































.
Re: Оцените решение
От: Shellac  
Дата: 04.09.10 23:23
Оценка: +1
Здравствуйте, Useverlo, Вы писали:

Акронис?
Re: Оцените решение
От: Centaur Россия  
Дата: 05.09.10 01:33
Оценка: +1
Здравствуйте, Useverlo, Вы писали:

U>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.


U>Вводим: 131

U>Выводим:
U>сто тридцать один в десятичной системе;
U>двести три в восьмеричной системе.

Дальше задание можно не читать. 131 десятичное — это всегда сто тридцать один. Двести три — это всегда 203_10. В системах счисления с базой, отличной от 10, числа читаются поразрядно: «два ноль три восьмеричное».
Re: Оцените решение
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 05.09.10 08:15
Оценка:
Здравствуйте, Useverlo, Вы писали:

U>Также использовался механизм исключений для отслеживания исключительных ситуаций и их корректной обработки.

U>В программе использовались библиотеки STL, Boost и среда разработки VS2008.

К чему было городить столько классов, буст, исключения.
Достаточно одной небольшой функции, цикл по три разряда, результат складывать в std::string.
Векторы там нафиг не нужны.
Перегружать решение простой задачи модными технологиями это плохо.

Еще одна функция конвертирует в восьмеричное представление. Английское произношение не нужно было делать.
К тому же, насколько помню, thousands и прочие это неправильно.
Число читается порциями по два разряда, старшие нули в паре читаются как "оу"
(Если соврал, знатоки поправят).
Re[2]: Оцените решение
От: Hayabusa Россия  
Дата: 06.09.10 08:25
Оценка:
Здравствуйте, Shellac, Вы писали:

S>Здравствуйте, Useverlo, Вы писали:


S>Акронис?


Ага
Re[2]: Оцените решение
От: Vamp Россия  
Дата: 07.09.10 12:39
Оценка:
ROP>К тому же, насколько помню, thousands и прочие это неправильно.
Ну, не столько неправильно, сколько не используется. Как правило, четырехзанчные числа произносятся в сотнях, напримерЖ
1234 — twelve hanudered thirty four.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Оцените решение
От: Useverlo  
Дата: 08.09.10 06:49
Оценка:
Здравствуйте, batu, Вы писали:

B>Здравствуйте, Useverlo, Вы писали:


U>>Уважаемые форумчане, оцените пожалуйста грамотность решения задания. Имеется ввиду правильно ли спроектировано приложение, грамотно ли использовались используемые библиотеки, а также укажите на наличие "грязи" в решении. То есть, хочется услышать все "ляпы", которые допущены при выполнении задания. А также как бы Вы сами сделали бы такое задание, если бы пришлось его решать.

U>>Само решение(проект и скомпилированный экзешник) выложил здесь
U>>http://files.rsdn.ru/93750/test.rar

U>>Тестовое задание следующее:


U>>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.


U>>Вводим: 131

U>>Выводим:
U>>сто тридцать один в десятичной системе;
U>>двести три в восьмеричной системе.

B>А род анализируешь? Один рубль, Одна копейка. Тоже в текст по разному формируется


Род анализирую. См. код, функция TranslateImpl
Re[2]: Оцените решение
От: Useverlo  
Дата: 08.09.10 06:51
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Useverlo, Вы писали:


U>все не читал

U>тыкнул пару файлов
U>вот перл нашел:
U>
U>bool Translator_eng::Erase()
U>{
U>
  this->>result_eng->erase(this->result_eng->begin(), this->result_eng->end());
  this->>valueDec->erase(this->valueDec->begin(), this->valueDec->end());
  this->>valueOct->erase(this->valueOct->begin(), this->valueOct->end());
U>
U>...
U>}

U>typedef vector<int> vectInt;

U>class Translator_eng: public Translator_base
U>{
U>...
U>private:
U>    boost::shared_ptr<vectInt> valueDec;
U>    boost::shared_ptr<vectInt> valueOct;
U>    boost::shared_ptr<Dictionary_eng> dict;
U>    boost::shared_ptr<vectStr> result_eng;
U>};

U>


U>я помню, что делал аналогичную задачку при поступлении в Акронис


1. Поясните плз, в чем здесь перл
2. Если Вы делали эту задачку и Вас взяли в Акронис на работу, порекомендуйте как правильно выстроить иерархию классов.
Re[2]: Оцените решение
От: Useverlo  
Дата: 08.09.10 06:53
Оценка:
Здравствуйте, SpaceConscience, Вы писали:

SC>Все очень плохо — решение задачи, архитектурно, по стилю, технически. Конкретно расписывать лень, так как, в принципе, все надо переделать.


SC>Уровень — Junior Developer / стажер.


догадываюсь, что все плохо. Именно поэтому к грамотным специалистам и обратился, чтобы подсказали, как правильно спроектировать и выстроить иерархию классов.
Re[2]: Оцените решение
От: Useverlo  
Дата: 08.09.10 06:54
Оценка: 1 (1)
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, Useverlo, Вы писали:


U>>Задание: необходимо вывести введенное 10-тичное число словами на русском языке в 8-ми и 10-ной системах. Например.


U>>Вводим: 131

U>>Выводим:
U>>сто тридцать один в десятичной системе;
U>>двести три в восьмеричной системе.

C>Дальше задание можно не читать. 131 десятичное — это всегда сто тридцать один. Двести три — это всегда 203_10. В системах счисления с базой, отличной от 10, числа читаются поразрядно: «два ноль три восьмеричное».


Вводим: 131
Выводим:
сто тридцать один в десятичной системе;
двести три в восьмеричной системе.

эта фраза из задания. поэтому дальнейшие рассуждения о том, как нужно читать те или иные числа считаю не обоснованными. Есть пример как нужно сделать, так и делаю.
Re[2]: Оцените решение
От: Useverlo  
Дата: 08.09.10 07:06
Оценка:
Здравствуйте, 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

я как-то писал для акрониса вот это
Автор: Faust
Дата: 11.12.09
. пытался набрать очки расширяемой локализацией (ru_lower_locale_tag, ru_upper_locale_tag, и т.д.). их не впечатлило...
Re[3]: Оцените решение
От: Centaur Россия  
Дата: 08.09.10 09:51
Оценка: :)
Здравствуйте, Useverlo, Вы писали:

U>эта фраза из задания. поэтому дальнейшие рассуждения о том, как нужно читать те или иные числа считаю не обоснованными. Есть пример как нужно сделать, так и делаю.


Ну тогда вот ещё вариант задания. Требуется ввести два числа и посчитать их произведение. Например, 6*6 = 11, 8*8 = 3 (пруфлинк).
Re[3]: Оцените решение
От: szag  
Дата: 08.09.10 10:52
Оценка:
Здравствуйте, Useverlo, Вы писали:

U>1. Поясните плз, в чем здесь перл

U>2. Если Вы делали эту задачку и Вас взяли в Акронис на работу, порекомендуйте как правильно выстроить иерархию классов.

1. у любого контейнера есть функция clear().
2. Вы задаёте вопросы из разряда "научите меня программировать". Решение Вы сильно перенасытили технологиями. Решение не кроссплатформенное. Большие функции, все в глобальном неймспейсе, использование шаблонных классов без тайпдефов, где-то stl и буст "во всю", а где-то
char* tmp = new char[it->size() + 1];
. Решение должно быть таким, чтобы при добавлении языков Вам надо было внести как можно меньше изменений в код. Я бы, например, вообще грузил словари из xml. И тогда код можно было бы "в идеале" вообще не менять для любых языков. Но как тестовое задание (т.е. за бесплатно) я бы такое никогда делать не стал
3. оффтоп: и дался вам этот акронис — там работать заставляют, не ходите туда
Re[4]: Оцените решение
От: Useverlo  
Дата: 08.09.10 12:24
Оценка:
Здравствуйте, szag, Вы писали:

S>Здравствуйте, Useverlo, Вы писали:


U>>1. Поясните плз, в чем здесь перл

U>>2. Если Вы делали эту задачку и Вас взяли в Акронис на работу, порекомендуйте как правильно выстроить иерархию классов.

S>1. у любого контейнера есть функция clear().

S>2. Вы задаёте вопросы из разряда "научите меня программировать". Решение Вы сильно перенасытили технологиями. Решение не кроссплатформенное. Большие функции, все в глобальном неймспейсе, использование шаблонных классов без тайпдефов, где-то stl и буст "во всю", а где-то
char* tmp = new char[it->size() + 1];
. Решение должно быть таким, чтобы при добавлении языков Вам надо было внести как можно меньше изменений в код. Я бы, например, вообще грузил словари из xml. И тогда код можно было бы "в идеале" вообще не менять для любых языков. Но как тестовое задание (т.е. за бесплатно) я бы такое никогда делать не стал

S>3. оффтоп: и дался вам этот акронис — там работать заставляют, не ходите туда

а Вы знаете места где работать не заставляют? и при приеме на работу не дают тестовых заданий и при этом хорошо платят?
Re[5]: Оцените решение
От: szag  
Дата: 08.09.10 13:38
Оценка:
Здравствуйте, Useverlo, Вы писали:

U>а Вы знаете места где работать не заставляют? и при приеме на работу не дают тестовых заданий и при этом хорошо платят?

полно адекватных контор, где не просят сделать тестовые задания и платят не меньше, а то и больше. Акронис сейчас предлагает 78500 — 120000 гросс, если я не ошибаюсь. ИМХО, это средние зп по мск, так что выбор большой. Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.