LINUX.ORG.RU
ФорумTalks

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

 ,


0

1

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

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

★★

Задать от того, сколько функций надо реализовать. Если базовые математические, которые есть в std, то где-то день.

Weres ★★★
()

man обратная польская запись

deep-purple ★★★★★
()

Если простые формулы, как ты написал - день через обратную польскую запись.

Norgat ★★★★★
()

Неделю, с unit-тестами, внедрением CI, прогоном через статические анализаторы кода, valgrind и другие профилировщики.

anonymous00 ★★
()

Быстро точно не будет. Пока соберемся, обсудим функционал и дизайн, пока с вашей стороны выделят бюджет, а с нашей - ресурсы, пока заключим договор... Потом пойдут спринты, потом тестирование, потом сертификация... Короче, года в полтора уложимся, а быстрее - никак. Это я вам как профессионал говорю.

Deleted
()

Прямо вспомнилось подобное задание на автомат по какому-то предмету в универе. Правда, там надо было собрать калькулятор в железе / на симуляторе. Я, помню, тогда прикрутил LCD-экран к микроконтроллеру и реализовал всё в софте, не заморачиваясь рассыпной логикой.

Sadler ★★★
()

deep-purple, Norgat

Спасибо за ответы, я решил за 2 дня без обратной польской записи. Сейчас попробую написать используя ОПЗ.

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

день через обратную польскую запись

Калькулятор с польской записью калькулятору с польской записью рознь. На Си можно написать в чуть больше чем 50 строк: https://github.com/saahriktu/ecalc/blob/master/ecalc.c
Но, это без переменных, да.

$ ./ecalc <<< " 20+ 10+ 100l* 10l/="
2.302585,60.000000

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

На собеседовании дали такое задание.

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

Использование скриптовых языков

Все современные реализации CL компилируют: на выходе машинный код.

или вызовов консольных программ не рассматривается

gcc — консольная программа?

Oxdeadbeef ★★★
()

Пол дня.

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

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

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от neon1ks

На собеседовании дали такое задание.

Использование скриптовых языков или вызовов консольных программ не рассматривается

А помощь всея LOR'а рассматривается? :)

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

Если только в совете. В расширении кругозора.

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

Неделю, с unit-тестами, внедрением CI, прогоном через статические анализаторы кода, valgrind и другие профилировщики.

И три месяца с написанием подробного ТЗ, созданием плана работ, занесением проекта в задачник, написанием подробных комментариев и документации

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

И как мне относиться к yacc (bison) и flex, если даже примеры не компилируются.

y.tab.c: In function ‘int yyparse()’:
y.tab.c:1143:23: error: ‘yylex’ was not declared in this scope
       yychar = yylex ();
neon1ks ★★
() автор топика
Ответ на: комментарий от neon1ks
bool is_math_function(const std::string &str)
{
    bool status = false;

    if (str.compare("sin") == 0) {
        status = true;
    }
    else if (str.compare("cos") == 0) {
        status = true;
    }
    else if (str.compare("tan") == 0) {
        status = true;
    }
    else if (str.compare("lg") == 0) {
        status = true;
    }
    else if (str.compare("ln") == 0) {
        status = true;
    }

    return status;
}

double calc_function(const std::string &funcStr, const double &number)
{
    double d;

    if (funcStr.compare("sin") == 0) {
        d = sin(number);
    }
    else if (funcStr.compare("cos") == 0) {
        d = cos(number);
    }
    else if (funcStr.compare("tan") == 0) {
        d = tan(number);
    }
    else if (funcStr.compare("lg") == 0) {
        d = log10(number);
    }
    else if (funcStr.compare("ln") == 0) {
        d = log(number);
    }

    return d;
}

--->

const std::map<std::string, double (*)(double)> functionMap
{
	{ "sin", sin },
	{ "cos", cos },
	{ "tan", tan },
	{ "lg", log10 },
	{ "ln", log },
};

bool is_math_function(const std::string &str)
{
	return functionMap.find(str) != functionMap.end();
}

double calc_function(const std::string &funcStr, double number)
{
	return functionMap.at(funcStr)(number);
}
Nietzsche
()

Хороший программист это программист с опытом. Опыт бывает разный. Если ты уже писал парсера - пару часов. Если нет, то надо сначала изучить матчасть, и тут всё сильно зависит от кучи других навыков.

pon4ik ★★★★★
()

На JavaScript-е за неделю можно гуевый состряпать, с возможностью ручного ввода прямо в циферблат.

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

Что бы не быть голословным, пруф. (понятно, что тут есть доля рекламы).

Ну и я парсера пишу не очень часто, однако кастомную грамматику (очень похожую на арифметику, но таки с отличиями) я на тех же плюсах часа за 4ре сделал и ещё столько же отлаживал и тестировал.

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

Классно. И намного проще добавлять функции. Респект!

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

Россия, Иркутск (Сибирь, возле Байкала) - мои ожидания 20-25 тысяч и буду рад, если больше - счастлив. Дальше работать и накапливать опыт. Моя позиция на пару лет.

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

Задача решена уже 100500 раз

cvs-255 ★★★★★
()

gcalctool 3.24.0 ©1986–2016 The Calculator authors.

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

Поиск по вектору работает быстрее на малом количестве элементов.

Nietzsche
()
Ответ на: комментарий от theNamelessOne

Давай, замени.

Сколько плотишь? :P

А вообще, я знаю, что глупость сморозил, но при большом желании можно и на регулярках накостылить -> https://habrahabr.ru/post/271285/

Nietzsche
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.