LINUX.ORG.RU
ФорумTalks

Сколько нужно времени, чтобы написать консольный калькулятор?

 ,


0

1

Задание: написать консольный калькулятор на С++: В качестве параметра принимает некоторую формулу с переменными. Затем читает значения переменных из stdin и выводит результат в stdout Например: ./calc "(X + 10) * lg(Y)" ввод: 20 100 вывод: 60

Сколько времени потребуется хорошему программисту для решения этой задачи?

★★
Ответ на: комментарий от DELIRIUM

Как сказал товарищ выше - до 10к элементов обычно даже поиск по rbt оказывается примерно на два порядка быстрее чем по хэш таблице. С 10к элементов разрыв начинает достаточно линейно сокращаться. Ну это я замерял на плюсах и на определённом железе, но порядок думаю должен сохраниться. А до 100 элементов вполне может дешевле оказаться сортировать вектор и искать в нём(ощущение есть, что где то я видел такую оптимизацию даже в живую).

pon4ik ★★★★★
()
Ответ на: комментарий от neon1ks

Ну так разберись что там в примере не так. Этих примеров в сети туча. Классическая задача.

Генерация парсера для контекстно-свободных языков - решенная задача.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)

Зависит от того какие инструменты можно применять и какие знания уже есть. У нас в универе было такое задание, я недели три говнокодил на базе «своих» алгоритмов, и всё равно толком не работало.

А щас я знаю про pratt parser, так что задача сводится к написанию парсера, а всё остальное за пару часов делается.

true_admin ★★★★★
()

Из примера не особо понятно, насколько фичастым должен быть калькулятор, так что разброс где-то от 20 минут до нескольких часов. Но не больше одного дня. Это если одному. Если командой, то месяц, не меньше :D

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Значит вы хороший программист. Писали подобный уже код. Ничего навороченного не требуется.

neon1ks ★★
() автор топика
Ответ на: комментарий от invy

Пару часов на запись грамматики и генерацию парсера и ещё пара часов на оформление.

Те кто руками пишут парсеры - двоечники.

«Не всё так очевидно», как говорила дочь автора ANTLR.

Хорошо написанный «ручной парсер», лучше чем грамматика в которой чёрт ногу сломит.

И дебажить написанные кем-то грамматики, в случае проблем, – это ещё то удовольствие.

mono ★★★★★
()
Ответ на: комментарий от invy

Решенная, то решенная. Но эти инструменты еще нужно освоить. К тебе претензий нету)

neon1ks ★★
() автор топика

Хорошему программисту требуется более детальное ТЗ, чтобы сказать время. В нем должны быть:

  • функции, которые должен уметь считать калькулятор. Если там есть какие-либо интегралы и производные задача очень резко усложняется
  • диапазон в котором надо уметь считать (если он требует больших чисел все становится несколько печальнее)

Ну а так в зависимости от того, писал он парсер или нет. Если нет, то сначала читать и разбираться с написанием парсера, сама работа где-то от 1 дня до 3-ех, если нет пунктов из списка выше. Если есть первый пункт, то затрудняюсь сказать, как долго.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Задачу дали на собеседовании на дом (была одной из 3 задач). Цель - посмотреть как я программирую, владею инструментами разработки. Собеседование уже полностью завершилось и успешно для меня.

Интегралы в таком калькуляторе - это слишком круто. Переполнение можно не учитывать, я надеюсь.

Просто стало интересно оценить свой уровень. Понравилась статья в блоге Yandex на HabraHabr - у них 2-4 часа на простой калькулятор, и коды приведены. Посложнее, с функциями и с переменными, - 1-3 дня, думаю это реальные цифры. Конечно, народ может и за день написать.

На днях не спеша изучу обратную польскую запись и реализую в калькуляторе уже для себя. Остальное может со временем.

neon1ks ★★
() автор топика
Ответ на: комментарий от invy

Генерация парсера для контекстно-свободных языков - решенная задача.

Звучит пафосно.

Есть стандартизованное представление для грамматик - https://tools.ietf.org/html/rfc5234 . Если генерация парсеров — решенная задача, то где скачать генерилку, которой в один конец пихаешь произвольную rfc5234-грамматику, а из другого конца безотказно вылезает годный парсер? И чтобы парсер на некорректном вводе выдавал внятную диагностику (в терминах исходной грамматики)?

Ну и раз тред про c++, то пусть сгенерированный парсер тоже будет на c++.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)

Бери учебник по написанию компиляторов (лучше дрэгонбук), читай, практикуйся, и такие задачи будешь за пару часов решать.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)

Сколько времени потребуется хорошему программисту для решения этой задачи?

21 день в общем случае.

h578b1bde ★☆
()
Ответ на: комментарий от Manhunt

Ну и раз тред про c++, то пусть сгенерированный парсер тоже будет на c++.

Он и будет на C или C++. Только генератор парсеров с ходу не освоишь. Куча примеров которые не компилируются, устарели? Надо время.

neon1ks ★★
() автор топика

полдня я думаю

dikiy ★★☆☆☆
()
Ответ на: комментарий от neon1ks

Только генератор парсеров с ходу не освоишь.

Если ты про bison (yacc), то у него есть «небольшое» ограничение — он отнюдь не в любые КС-грамматики может. Bison is a general-purpose parser generator that converts an annotated context-free grammar into a deterministic LR or generalized LR (GLR) parser employing LALR(1) parser tables.

Впрочем, для твоего калькулятора это не помеха.

Manhunt ★★★★★
()
Ответ на: комментарий от neon1ks

Нет ошибок

dem@mars:~/projects/calc$ flex vars.l dem@mars:~/projects/calc$ yacc -dtv vars.y dem@mars:~/projects/calc$ g++ -c lex.yy.c dem@mars:~/projects/calc$ g++ -c y.tab.c dem@mars:~/projects/calc$ g++ -o vars y.tab.o lex.yy.o

dmxrand
()
Ответ на: комментарий от pon4ik

Смотря, как написать хэш-функцию. У нас ограниченное заранее известное количество строк, тут можно обоптимизироваться по самые яйца.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от dmxrand

Хорошо, что за софт используешь? Какие версии? У меня обычная Ubuntu 16.04, применял flex 2.6.0-11 и bison 2:3.0.4.dfsg-1

neon1ks ★★
() автор топика
Ответ на: комментарий от saahriktu

Это не калькулятор. Это вычислитель обратной польской нотации.

Калькулятор это:

1) Парсер входной строки в обратную польскую нотацию

2) Запрос переменных

3) Собственно вычислитель

И самый гемор тут именно парсер, а не вычислитель. Вычислитель то это фигня полная, которая берётся из вики и подпиливается под себя за 15 минут.

Norgat ★★★★★
()
Ответ на: комментарий от mono

чем грамматика в которой чёрт ногу сломит.

Мда...

invy ★★★★★
()
Ответ на: комментарий от invy

Лично я пишу парсеры руками, но если нужен генератор, то с re2c хорошо сочетается lemon

annulen ★★★★★
()
Ответ на: комментарий от DELIRIUM

Можно, но интуитивно - совершенно не верю, что тут хэшмэп может обыграть даже rbt, или обычную бинарную кучу. Проверить было бы интересно конечно, но без мотивации очень сложно :)

pon4ik ★★★★★
()

Завит от того, как будешь презентовать. Если сам нажимаешь кнопочки, даешь 3 правильных ответа, день. Если даешь нажимать кнопочки девочке с обязательством не вылетать в корку при любой комбинации введенного треша, месяц.

bender ★★★★★
()
Ответ на: комментарий от next_time

Когда как. 50 строк 50-ти строкам рознь. Одно дело если всё продумано заранее и сходу завелось, а другое дело если надо на практике подгонять строку к строке, исправлять, удалять, дописывать другое в других местах,... и т.д. Но, калькулятор - это довольно простая задача.

saahriktu ★★★★★
()

В зависимости от сложности возможных формул. А вообще две ночи и много кофе примерно.

raven_cler ★★
()
Ответ на: комментарий от i-rinat

Поменять calc.exe на любой другой калькулятор с нужными функциями. Зачем пилить велосипед?)))

FatPinguin
()
Последнее исправление: FatPinguin (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Есть фирмы, но их мало, например, СКБ электротехнического приборостроения, ISPsystem.

Было бы хорошо, сделать списки фирм по городам, где работают программисты.

neon1ks ★★
() автор топика
Ответ на: комментарий от invy

Я что-то не понял. При чем тут какая-то конкретная форма записи?

Это _стандартизированная_ форма записи. Именно в этой форме записана львиная доля грамматик rfc, эту форму часто выбирают независимые проекты. Если нет генераторов, которые принимали бы её на вход, это может говорить только об одном: задача генерации парсеров контекстно-свободных языков в общем случае не решена.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.