Pagini recente » Cod sursa (job #584331) | Cod sursa (job #2287174) | Cod sursa (job #1636036) | Cod sursa (job #1954285) | Cod sursa (job #256821)
Cod sursa(job #256821)
//evaluarea unei expresii artimetice date
#include <stdio.h>
#include <string.h>
#define NMAX 100001
int p[NMAX],n;
struct ind {long v; char c;}e[NMAX];
long s;
struct Nod {ind op; Nod *as,*ad;};
void citire()
{ int pri; char ch;
FILE *fin=fopen("evaluare.in","r");
pri=0; n=0; e[0].c=0; int i;
char expresie[NMAX];
fscanf(fin,"%s",&expresie); int l=strlen(expresie);
for (i=0;i<l;i++)
{
ch=expresie[i];
if (('0'<=ch&&ch<='9')||(ch==')')||(ch=='(')||(ch=='*')||(ch=='-')||(ch=='+')||(ch=='/'))
{
switch (ch)
{
case '(': {pri+=10;break;}
case ')': {pri-=10;break;}
case '+': { e[++n].c=ch;p[n]=pri+1;break;}
case '-': { e[++n].c=ch;p[n]=pri+1;break;}
case '*': { e[++n].c=ch;p[n]=pri+10;break;}
case '/': { e[++n].c=ch;p[n]=pri+10;break; }
default : {
if (e[n].c==0&&n>0) e[n].v=e[n].v*10+(ch-'0');
else {e[++n].v=ch-'0';p[n]=1000;}
}
}
}
}
fclose(fin);
}
Nod *arb(int li, int ls)
{
Nod *cc;
int i,j,min;
min=p[ls];
i=ls;
for (j=ls;j>=li;j--)
if (p[j]<min) {min=p[j]; i=j;}
cc=new Nod;
cc->op=e[i];
if (li==ls) {cc->as=cc->ad=0;}
else
{
cc->as=arb(li,i-1);
cc->ad=arb(i+1,ls);
}
return cc;
}
long parc(Nod *cc)
{
if (cc)
{
if (cc->op.c)
{
switch (cc->op.c)
{
case '+': {return (parc(cc->as)+parc(cc->ad));}
case '-': {return (parc(cc->as)-parc(cc->ad));}
case '*': {return (parc(cc->as)*parc(cc->ad));}
case '/': {return (parc(cc->as)/parc(cc->ad));}
}
}
else return cc->op.v;
}
return 0;
}
void afisare()
{
FILE *fout=fopen("evaluare.out","w");
fprintf(fout,"%ld\n",s);
fclose(fout);
}
int main()
{
citire();
Nod *C=arb(1,n);
s=parc(C);
afisare();
return 0;
}