Хабр Курсы для всех
РЕКЛАМА
Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс!
наиболее частым тестовым заданием при собеседовании на должность разработчика является программирование калькулятора
Честно говоря, не знал, но попрошу первокурсников сильнее радоваться задачке на польскую нотацию.
высокую точность вычислений, до двух знаков после запятой.
Вот это высокая точность!
undo stress :)
В принципе, на junior тянет, "пойдёть... куры не улетять" )
Какой-то оверинженеринг для такой задачи.
Вот когда-то писал в 30 строк (без #include и main). Рекурсивного спуска, без синтаксических деревьев и пр.
#include <iostream>
#include <string>
#include <map>
#include <sstream>
#include <functional>
using namespace std;
typedef function<double(double,double)> Op;
map<char, Op> operators[] = {
{
{'+', [](double a, double b) { return a+b; } },
{'-', [](double a, double b) { return a-b; } }
},{
{'*', [](double a, double b) { return a*b; } },
{'/', [](double a, double b) { return a/b; } }
}
};
double expr(istringstream &src, int pri) {
double a, b;
if(pri >= size(operators)) {
src >> a;
return a;
}
char r;
auto op = operators[pri];
a = expr(src, pri+1);
src >> r;
while(op[r]) {
b = expr(src, pri+1);
a = op[r](a,b);
src >> r;
if(src.eof()) return a;
}
src.putback(r);
return a;
}
int main() {
istringstream src("2 + 2 * 3");
cout << src.str() << " = " << expr(src, 0) << '\n';
return 0;
}
Разработка калькулятора Miracle