Cod sursa(job #430633)

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

string s;
int i;
ifstream fi ("evaluare.in");
ofstream fo ("evaluare.out");

long termen(); // Declaratii ale unor functii care vor fi definite mai tarziu in sursa.
long factor(); // Aici doar spunem ca vor exista aceste functii. Altfel avem eroare la compilare.
/* 
 * Functia expresie() va "aduna" toti termenii unei expresii/subexpresii.
 */
long expresie() {
	long r = termen();
  
	while (s[i] == '+' || s[i] == '-') {
		if (s[i] == '+') {
      i++;						// trecem peste semnul "+"
      r += termen(); 
    }
    else {
      i++;						// trecem peste semnul "-"
      r -= termen();
		}
	}
	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] == '/') {
		if (s[i] == '*') {
      i++;
      r *= factor();
    }
    else {
      i++;
      r /= factor();
		}
	}
	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 = expresie(); 
    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 << expresie();  
    return 0;
}