Pull to refresh

Comments 7

наиболее частым тестовым заданием при собеседовании на должность разработчика является программирование калькулятора

Честно говоря, не знал, но попрошу первокурсников сильнее радоваться задачке на польскую нотацию.

высокую точность вычислений, до двух знаков после запятой.

Вот это высокая точность!

может, авторы прикалываются? квантовый переход и прочее )

UFO just landed and posted this here

В принципе, на 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;
  }

Sign up to leave a comment.

Articles