Cod sursa(job #2672514)

Utilizator rARES_4Popa Rares rARES_4 Data 14 noiembrie 2020 10:08:17
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 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 <cstdio>
#include <iostream>


const long MAX = 100010;

char s[MAX];
int i = 0;



long termen();

long factor();



/*

 * Functia eval() va "aduna" toti termenii unei expresii/subexpresii.

 */

long eval() {

	long rezultat = termen();

	while ( s[i] =='+' || s[i]=='-' ) {

		switch ( s[i] ) {

			case '+':

				++i;						// trecem peste semnul "+"

				rezultat += termen();

				break;

			case '-':

				++i;						// trecem peste semnul "-"

				rezultat -= termen();

				break;

		}

	}

	return rezultat;

}



/*

 * Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul

 * lui din factori inmultiti.

 */

long termen() {
   int rezultat = factor();
   while(s[i] == '*' || s[i] == '/')
   {
       switch(s[i])
       {
           case '*':
            rezultat *=factor();
            break;
           case '/':
            rezultat /=factor();
            break;
       }
   }
   return rezultat;
}



/*

 * Functia factor() va returna valoarea unui singur factor, care poate fi o subexpresie

 * sau un numar natural

 */

long factor() {
    if(s[i] == '(')
    {
        i++;
        int rez = eval();
        i++;
        return rez;
    }
    int rez = 0;
    while(isdigit(s[i]))
    {
        rez = rez*10 + (s[i++]-'0');
    }
    return rez;
}



int main() {

    fgets(s, MAX, fopen("evaluare.in", "r"));
    fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());

    return 0;

}