Pagini recente » Cod sursa (job #1749952) | Cod sursa (job #1383156) | Cod sursa (job #2382491) | Cod sursa (job #403129) | Cod sursa (job #1881575)
#include <stdio.h>
#include <stdlib.h>
char first;
int Expr(), Term(), Fact(), Int();
FILE *fin, *fout;
int Expr(){// Expr() este functia care analizeaza o expresie aritmetica
int val=Term();// expresia este formata din termeni, pe care ii citim conform gramaticii
while(first=='+' || first=='-'){
if(first=='+'){// ajustam rezultatul conform semnelor
first=fgetc(fin);
val+=Term();
} else{
first=fgetc(fin);
val-=Term();
}
}
return val;// si returnam valoarea finala
}
int Term(){// Term() este functia pentru termeni
int val=Fact();// fiecare termen, conform gramaticii, este alcatuit din mai multi factori
while(first=='*' || first=='/'){
if(first=='*'){// schimbam valoarea in conformitate cu semnul citit
first=fgetc(fin);
val*=Fact();
} else{
first=fgetc(fin);
val/=Fact();
}
}
return val;
}
int Fact(){// Fact() este functia pentru factori
int val;// un factor poate sa fie un numar intreg (daca are semn in fata lui, se va reapela functia)
if('0'<=first && first<='9')// sau o subexpresie aritmetica
val=Int();// cazul in care avem un numar fara semn
else if(first=='+' || first=='-'){// cazul in care este un semn in fata factorului
if(first=='+'){// semnul plus
first=fgetc(fin);
val=Fact();
} else{// sau minus
first=fgetc(fin);
val=-Fact();
}
} else if(first=='('){// sau cazul in care se continua cu o subexpresie
first=fgetc(fin);
val=Expr();// dupa evaluare, cursorul a ramas pe paranteza inchisa, asa ca putem trece peste acest
first=fgetc(fin);// caracter
}
return val;
}
int Int(){// functia Int() returneaza numarul format din cifrele 0, 1, 2, ... , 9
int val=0;
while('0'<=first && first<='9'){
val=10*val+first-'0';
first=fgetc(fin);
}
return val;
}
int main()
{
fin=fopen("evaluare.in", "r");
first=fgetc(fin);
fout=fopen("evaluare.out", "w");
fprintf(fout, "%d\n", Expr());//afisam rezultatul
fclose(fin);
fclose(fout);
return 0;
}