Cod sursa(job #3322678)

Utilizator livliviLivia Magureanu livlivi Data 15 noiembrie 2025 10:59:00
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

int expresie(const string& s, int& p);
int termen(const string& s, int& p);
int factor(const string& s, int& p);
int numar(const string& s, int& p);

int expresie(const string& s, int& p) {
	int result = termen(s, p);
	while (p < s.size() && (s[p] == '+' || s[p] == '-')) {
		int sign = (s[p] == '+' ? 1 : -1);
		p++;
		result += sign * termen(s, p);
	}
	return result;
}

int termen(const string& s, int& p) {
	int result = factor(s, p);
	while (p < s.size() && (s[p] == '*' || s[p] == '/')) {
		bool is_div = (s[p] == '/');
		p++;
		int fact = factor(s, p);
		if (is_div) {
			result /= fact;
		} else {
			result *= fact;
		}
	}
	return result;
}

int factor(const string& s, int& p) {
	if (s[p] == '(') {
		p++;
		int result = expresie(s, p);
		p++;  // sar peste )
		return result;
	} else {
		return numar(s, p);
	}
}

int numar(const string& s, int& p) {
	int sign = 1;
	if (s[p] == '-') {
		sign = -1;
		p++;
	}

	int nr = 0;
	while (p < s.size() && isdigit(s[p])) {
		nr = nr * 10 + s[p] - '0';
		p++;
	}

	return sign * nr;
}

int main() {
	ifstream cin("evaluare.in");
	ofstream cout("evaluare.out");
	string s; cin >> s;
	int p = 0;
	cout << expresie(s, p) << "\n";
	return 0;
}