Cod sursa(job #362861)

Utilizator Cristi09Cristi Cristi09 Data 11 noiembrie 2009 10:38:04
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio> 
 
 
const long MAX = 100010; 
char S[MAX], *p=S; 
 
 
long termen(); 
long factor(); 
 
 
/*  
 
* Functia eval() va "aduna" toti termenii unei expresii/subexpresii. 
 
*/
long eval() { 
    
long r = termen(); 
    
while ( *p=='+' || *p=='-' ) { 

switch ( *p ) { 

case '+': 

++p;                        // trecem peste semnul "+" 

r += termen();  

break; 

case '-': 

++p;                        // 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 ( *p=='*' || *p=='/' ) { 

switch ( *p ) { 

case '*' : 

++p; 

r *= factor(); 

break; 

case '/': 

++p; 

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 ( *p == '(' ) {                      // avem o subexpresie 

++p;                                // trecem peste '(' 

r = eval();  

++p;                                // trecem peste ')' 

} else {   

while ( *p>='0' && *p<='9' )  {       // avem un numar 

r = r*10 + *p - '0';   

++p; 

} 

}   

return r; 
} 

 
int main() {  

fgets(S, MAX, fopen("evaluare.in", "r"));   

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

return 0; 
}