Pagini recente » Cod sursa (job #3266366) | Cod sursa (job #3216060) | Cod sursa (job #717447) | Cod sursa (job #1911537) | Cod sursa (job #248585)
Cod sursa(job #248585)
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char const op1[]="+-", op2[]="*/", op[]="+/-*()", tot[]="0123456789+-/*()";
struct nod{int info; nod *s,*d;};
char e[1000],ch, *c;
long q[1000],p[1000],v;
int n;
nod *rad;
void vsd(nod *i)
{if (i)
{if (e[i->info])
fout<<e[i->info];
else
fout<<q[i->info];
vsd(i->s);
vsd(i->d);
}
}
int calc(nod *i)
{int as,ad;
if (!i->s) return (q[i->info]);
as=calc(i->s);
ad=calc(i->d);
if (e[i->info]=='+') return as+ad;
if (e[i->info]=='-') return as-ad;
if (e[i->info]=='*') return as*ad;
return as/ad;
}
nod *polon(int li, int ls)
{int i,k;
nod *d;
long min=30000;
d=new nod;
for (i=li;i<=ls;i++)
if (p[i]<min)
{min=p[i]; k=i;}
d->info=k;
if (li==ls) {d->s=0; d->d=0;}
else {d->s=polon(li,k-1);
d->d=polon(k+1,ls);}
return d;
}
int main()
{int i,m,sw;
n=-1;
v=0;
sw=1;
fin.get(ch);;
while (sw)
if (strchr(op1,ch)) //operator de prioritate mica
{n++;
e[n]=ch;
p[n]=v+1;
fin.get(ch);;
if(!strchr(tot,ch)) sw=0;
}
else
if (strchr(op2,ch)) //operator de prioritate mare
{n++;
e[n]=ch;
p[n]=v+10;
fin.get(ch);;
if(!strchr(tot,ch)) sw=0;
}
else
if (ch=='(') //p. deschisa -> crestem v
{v+=10; fin.get(ch);;
if(!strchr(tot,ch)) sw=0;}
else
if (ch==')') //p. inchisa -> descrestem v
{v-=10; fin.get(ch);;
if(!strchr(tot,ch)) sw=0;}
else //NUMAR
{n++;
while (!strchr(op,ch) && sw)
{c=&ch;
q[n]=q[n]*10+atoi(c);
fin.get(ch);;
if(!strchr(tot,ch)) sw=0;
}
p[n]=v+1000;
}
rad=polon(0,n);
fout<<calc(rad);
fout.close();
return 0;
}