Cod sursa(job #430612)

Utilizator juniorOvidiu Rosca junior Data 31 martie 2010 10:46:35
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 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 <fstream>

using namespace std;

const long MAX = 100010;
string s;
int i;
ifstream fi ("evaluare.in");
ofstream fo ("evaluare.out");

long termen();
long factor();

/* 
 * Functia eval() va "aduna" toti termenii unei expresii/subexpresii.
 */
long eval() {
	long r = termen();
	while (s[i] == '+' || s[i] == '-') {
		switch (s[i]) {
			case '+':
				i++;						// trecem peste semnul "+"
				r += termen(); 
				break;
			case '-':
				i++;						// trecem peste semnul "-"
				r -= termen();
				break;
		}
	}
	return r;
}

/*
 * Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul 
 * lui din factori inmultiti.
 */
long termen() {
	long r = factor();
	while (s[i] =='*' || s[i] == '/') {
		switch (s[i]) {
			case '*' :
				i++;
				r *= factor();
				break;
			case '/':
				i++;
				r /= factor();
				break;
		}
	}
	return r;
}

/*
 * Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie
 * sau un numar natural
 */
long factor() {
  long r=0;  
  if (s[i] == '(') {		// avem o subexpresie
    i++;								// trecem peste '('
    r = eval(); 
    i++;					    	// trecem peste ')'
  } 
  else 
    while (s[i] >= '0' && s[i] <= '9')  {		// avem un numar
      r = r*10+s[i]-'0'; i++;
    }
  return r;
}

int main() { 
    fi >> s;  
    fo << eval();  
    return 0;
}