Pagini recente » Cod sursa (job #498020) | Cod sursa (job #2298787) | Cod sursa (job #179707) | Cod sursa (job #2480699) | Cod sursa (job #658449)
Cod sursa(job #658449)
#include <stdio.h>
#include <string.h>
#define maxn 100010
char buffer[maxn];
int numere[maxn/2],ind=-1;
char operatori[maxn];
int indop=-1;
char precedenta[]="(-+*/)";//6 operatori
int main(){
FILE *fin=fopen("evaluare.in","r");
fgets(buffer,maxn,fin);
int n=strlen(buffer);
if(buffer[n-1]=='\n'){
buffer[n-1]=0;
n--;
}
//printf("%s",buffer);
int i=0;
int nr;
char *aux;
while(i<n){
//printf("i=%d\n",i);
//daca caracterul al i-lea e cifra=>parte dintr-un operand
if(buffer[i]<='9' && buffer[i]>='0'){ //daca e numar, citesc tot numarul
nr=0;
while(buffer[i]<='9' && buffer[i]>='0' && i<n){
nr*=10;
nr+=buffer[i]-'0';
i++;
}
numere[++ind]=nr;
//printf("am citit un numar: %d\n",nr);
}else{
//daca e operator
if(buffer[i]==')'){
while(operatori[indop]!='('){
switch(operatori[indop]){
case '+':numere[ind-1]+=numere[ind];ind--;break;
case '-':numere[ind-1]-=numere[ind];ind--;break;
case '*':numere[ind-1]*=numere[ind];ind--;break;
case '/':numere[ind-1]/=numere[ind];ind--;break;
}
indop--;
}
//acum e '(', trebuie stearsa si ea
indop--;
}else{
aux=strchr(precedenta,buffer[i]);
if(buffer[i]!='('){
while(aux<strchr(precedenta,operatori[indop]) && indop>=0){//cat timp ce adaug are precedenta mai mica ca ce e inainte
switch(operatori[indop]){
case '+':numere[ind-1]+=numere[ind];ind--;break;
case '-':numere[ind-1]-=numere[ind];ind--;break;
case '*':numere[ind-1]*=numere[ind];ind--;break;
case '/':numere[ind-1]/=numere[ind];ind--;break;
}
indop--;
}
}
operatori[++indop]=buffer[i];
}//else: caracterul curent e operator, dar nu e ')'
i++;
}//else e caracter, nu cifra
}//while dupa buffer
//acum calculez
while(indop>=0){
switch(operatori[indop]){
case '+':numere[ind-1]+=numere[ind];ind--;break;
case '-':numere[ind-1]-=numere[ind];ind--;break;
case '*':numere[ind-1]*=numere[ind];ind--;break;
case '/':numere[ind-1]/=numere[ind];ind--;break;
}
indop--;
}
FILE *fout=fopen("evaluare.out","w");
fprintf(fout,"%d\n",numere[0]);
return 0;
}