Pagini recente » Cod sursa (job #2706460) | Cod sursa (job #2264439) | Cod sursa (job #1311735) | Cod sursa (job #1223240) | Cod sursa (job #1700197)
#include <stdio.h>
FILE *fin , *fout;
char cursor;
void nextChar() {
cursor = fgetc( fin );
}
//calculeaza un factor care poate fi un numar sau o expresie
/*
Gramatica: fact = ( ('0' | '1' | ... | '9' )+ ) / expr
*/
int fact() {
int nr;
nr = 0;
if( '0' <= cursor && cursor <= '9' ) {//caracterul curent este o cifra,deci tb calculat
//un numar
while( '0' <= cursor && cursor <= '9' ) {
nr = nr * 10 + cursor - '0';
nextChar();
}
} else if( cursor == '(' ) {//caracterul curent este o paranteza, deci tb calculata o expresie
nextChar();
nr = expr();
nextChar();
}
return nr;
}
//calculeaza un termen care poate fi un produs
/*
Gramatica : term = fact + ( '*' / '/' + fact )*
*/
int term() {
int p , b;
char semn;
p = fact();
while( cursor == '*' || cursor == '/' ) {
semn = cursor;
nextChar();
b = fact();
if( semn == '*' )
p *= b;
else
p /= b;
}
return p;
}
//calculeaza o suma, o expresie
/*
Gramatica : expr = ( term ( '+' / '-' term )* )
*/
int expr( ) {
int b , s;
char semn;
//initializez suma
s = term( );
//citesc fiecare termen in parte
while( cursor != '\n' && cursor != ')' ) {
semn = cursor;
nextChar();
b = term();
if( semn == '+' )
s += b;
else
s -= b;
}
return s;
}
int main(){
fin = fopen( "evaluare.in" , "r" );
fout = fopen( "evaluare.out" , "w" );
cursor = fgetc( fin );
fprintf( fout , "%d" , expr( ) );
fclose( fin );
fclose( fout );
return 0;
}