Pagini recente » Cod sursa (job #2983341) | Cod sursa (job #2029639) | Cod sursa (job #2988488) | Cod sursa (job #391468) | Cod sursa (job #319218)
Cod sursa(job #319218)
/*Dat fiind o expresie aritmetica corecta sa se evalueze.
Ex: 5*(3+4)/7=35/7=5*/
#include <stdio.h>
#include<cstring>
#include<cstdlib>
#define Nmax 100001
int v[Nmax],a,b;
char expresion[Nmax], form[3*Nmax],rail[Nmax],*s;
inline int priority(char c)
{
if(c=='(') return 0;
if(c=='+'||c=='-') return 2;
if(c=='*'||c=='/') return 3;
return -1;
}
int main()
{register int n,i,p,lg=-1,lg2=-1;
freopen("evaluare.in","rt",stdin);
freopen("evaluare.out","wt",stdout);
gets(expresion);
for(n=strlen(expresion),i=0;i<n;++i)
if(expresion[i]>='0'&&expresion[i]<='9')
{while((i<n&&expresion[i]>='0'&&expresion[i]<='9')||expresion[i]=='.') form[++lg]=expresion[i++];
form[++lg]='?'; --i;
}
else {
if('('==expresion[i]) rail[++lg2]=expresion[i];
else if(')'==expresion[i])
{while(lg2>=0&&rail[lg2]!='(') form[++lg]=rail[lg2--];
--lg2;
}
else {p=priority(expresion[i]);
while(lg2>=0&&p<=priority(rail[lg2])) form[++lg]=rail[lg2--];
rail[++lg2]=expresion[i];
}
}
while(lg2>=0) form[++lg]=rail[lg2--];
n=strlen(form);
for(lg=-1,i=0;i<n;++i)
if(form[i]>='0'&&form[i]<='9')
{ v[++lg]=atoi(form+i);
while(form[i]=='?') ++i;
//v[++lg]=strtold(form+i,&s);
//i=s-form;
}
else{b=v[lg--]; a=v[lg--];
switch(form[i])
{
case '+':v[++lg]=a+b;break;
case '-':v[++lg]=a-b;break;
case '*':v[++lg]=a*b;break;
case '/':v[++lg]=a/b;break;
}
}
printf("%d",v[0]);
return 0;
}