Pagini recente » Cod sursa (job #2954695) | Cod sursa (job #2118754) | Cod sursa (job #118011) | Cod sursa (job #1600307) | Cod sursa (job #2672554)
/*
* 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;
}