Cod sursa(job #1799672)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 6 noiembrie 2016 17:12:59
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <string>

using namespace std;

int expression(const string& expr, int& ptr);
int factor(const string& expr, int& ptr);
int term(const string& expr, int& ptr);

int expression(const string& expr, int& ptr) {
	int value = term(expr, ptr);
	while (ptr < int(expr.length()) && (expr[ptr] == '+' || expr[ptr] == '-')) {
		const char op = expr[ptr++];
		value = (op == '+') ? (value + term(expr, ptr)) : (value - term(expr, ptr));
	}
	return value;
}

int term(const string& expr, int& ptr) {
	int value = factor(expr, ptr);
	while (ptr < int(expr.length()) && (expr[ptr] == '*' || expr[ptr] == '/')) {
		const char op = expr[ptr++];
		value = (op == '*') ? (value * factor(expr, ptr)) : (value / factor(expr, ptr));
	}
	return value;
}

int factor(const string& expr, int& ptr) {
	int value;
	if (expr[ptr] == '(') {
		++ptr;
		value = expression(expr, ptr);
		++ptr;
	} else {
		int sign = 1;
		if (expr[ptr] == '-') {
			sign = -1;
			++ptr;
		}
		value = 0;
		for (; ptr < int(expr.length()) && '0' <= expr[ptr] && expr[ptr] <= '9'; ++ptr) {
			value = 10 * value + (expr[ptr] - '0');
		}
		value *= sign;
	}
	return value;
}

int evaluate(const string& expr) {
	int ptr = 0;
	return expression(expr, ptr);
}

int main() {
	ifstream in("evaluare.in");
	ofstream out("evaluare.out");
	string expr;
	in >> expr;
	out << evaluate(expr) << "\n";
	in.close();
	out.close();
	return 0;
}