Pagini recente » Cod sursa (job #160383) | Cod sursa (job #2442896) | Cod sursa (job #1781) | Cod sursa (job #2317813) | Cod sursa (job #1887351)
// traiasca sublime text 3
// traiasca macOS si toate macbook-urile mai vechi de 2011 (who needs a touchbar anyway)
// daca sfintii ar fi programatori, ar indenta la 2 spatii
#include <cstdio>
#include <cstdlib>
#define MAXN 100000
using namespace std;
// declarare
char s[MAXN + 5];
int expr( );
int term( );
int fact( );
bool cif( char c );
int i;
// main
int main( ){
freopen( "evaluare.in", "r", stdin );
freopen( "evaluare.out", "w", stdout );
i = 0;
char c;
c = fgetc( stdin );
while( c != '\n' && c != EOF ) { // citeste sirul
s[i] = c;
c = fgetc( stdin );
i++;
}
i = 0;
printf( "%d", expr( ) ); // afiseaza rezultatul expresiei
return 0;
}
// functii
bool cif( char c ) { // testeaza daca un caracter e cifra
if( c >= '0' && c <= '9' )
return true;
return false;
}
int expr( ) { // evalueaza o expresie
int rez = term( );
while( s[i] == '+' || s[i] == '-' ) {
if( s[i] == '+' )
i++, rez += term( ); // cauta termenul cu care trebuie sa adune rezultatul
else
i++, rez -= term( ); // cauta termenul care trebuie scazut din rezultat
}
return rez;
}
int term( ) { // inmulteste un termen cu un factor (daca acesta exista; daca nu exista, termenul isi pastreaza valoarea initiala si se revine in functia expr( ), unde este scazut din rezultat
int rez = fact( );
while( s[i] == '*' || s[i] == '/' ) {
if( s[i] == '*' )
i++, rez *= fact( ); // inmulteste termenul cu factorul gasit
else
i++, rez /= fact( ); // imparte termenul la factorul gasit
}
return rez;
}
int fact( ) { // gaseste factorul cu care trebuie inmultit termenul (daca termenul trebuie inmultit cu vreun factor, acesta se cauta. daca trebuie inmultit cu o paranteza, se evalueaza paranteza apoi se inmulteste cu rezultatul acesteia)
int rez = 0;
if( s[i] == '(' ) { // daca in loc de factor intalneste o expresie
i++; // trece peste paranteza deschisa...
rez = expr( ); // rezolva paranteza
i++; // trece peste paranteza inchisa...
} else {
while( cif( s[i] ) == true ) { // transforma factorul din char in int
rez = rez * 10 + s[i] - '0';
i++;
}
}
return rez;
}