Cod sursa(job #2672554)

Utilizator gafton13andreeaGafton Andreea gafton13andreea Data 14 noiembrie 2020 10:45:44
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 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 <cstdio>



const long MAX = 100010;

char S[MAX],s[MAX];
int i = 0;

int numar()
{
    int nr=0;
    while(s[i]>='0' && s[i]<='9')
    {
        nr=nr*10+s[i]-'0';
        ++i;
    }
    return nr;
}

long termen();

long factor();



/*

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

 */

long eval() {

	long rezultat = termen();
 // printf("%d", rezultat);
	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() {
    long rezultat=factor();
    while ( s[i] =='*' || s[i]=='/' ) {

		switch ( s[i] ) {

			case '*':

				++i;

				rezultat *= factor();

				break;

			case '/':

				++i;

				rezultat /= factor();

				break;

		}

	}

	return rezultat;

}



/*

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

 * sau un numar natural

 */

long factor() {
    int nr=0;    //returnAZA VAL UNUI SINGUR FACTOR(VALOAREA EXPRESIEI SAU UN NR NAT)
   if(s[i]=='(')
   {
       i++;
       nr=eval();
       i++;
   }
   if(s[i]>='0' && s[i]<='9')
   nr=numar();
 //  printf(" %d", nr);
   return nr;
}



int main() {

    fgets(s, MAX, fopen("evaluare.in", "r"));
   //printf("%d", eval());

    fprintf(fopen("evaluare.out", "w"), "%ld\n", eval());

    return 0;

}