Cod sursa(job #1538003)

Utilizator kassay_akosKassay Akos kassay_akos Data 28 noiembrie 2015 13:14:21
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
/*
* Se va folosi recursivitatea indirecta in rezolvarea problemei.
* Vom observa ca orice expresie este "impartita" in urmatoarele componente:
* 1) termeni ai unei adunari, separati de '+' sau '-'
* 2) factori ai unui produs, separati de '*' sau '/'
* 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
* Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)
* si implicit a necesitatii recursivitatii indirecte.
*/

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int nmax = 1000010;
char s[nmax] , *p = s;

long termen();
long factor();
long eval();

int main(){
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	fgets(s, nmax, stdin);
	printf("%ld\n", eval());
	fclose(stdin);
	fclose(stdout);
	return 0;
}

long eval() {
	long r = termen();
	while (*p == '+' || *p == '-') {
		if (*p == '+')		{ ++p; r += termen(); }
		else if (*p == '-') { ++p; r -= termen(); };
	}
	return r;
}

long termen() {
	long r = factor();
	while (*p == '*' || *p == '/') {
		if (*p == '*')		{ ++p; r *= factor(); }
		else if (*p == '/') { ++p; r /= factor(); };
	}
	return r;
}


long factor(){
	long r = 0;
	if (*p == '(') {
		++p;
		r = eval();
		++p;
	}
	else while ( strchr("0123456789", *p) && *p !='\0' ) {
		r = r * 10 + *(p++) - '0';
	}
	return r;
}