Pagini recente » Cod sursa (job #1506961) | Cod sursa (job #2634748) | Cod sursa (job #2035137) | Cod sursa (job #2613844) | Cod sursa (job #381066)
Cod sursa(job #381066)
#include <fstream>
#include <stdlib.h>
using namespace std;
char s[100000],q[100000],*p;
long m[100000],i;
float calc(int o, int &k)
{
float nr=0,p;
if(s[o]=='-')
{strcpy(s,s+1);
nr=m[k++]*(-1);}
else if (s[o]=='(')
{nr=calc(o+1,k); o=i+1;}
else
nr=m[k++];
for(i=o;s[i];i++)
if(s[i]=='+'&&(s[i+1]=='+'||s[i+1]=='-'||s[i+1]==0||s[i+1]==')'))
nr=nr+m[k++];
else
if(s[i]=='-'&&(s[i+1]=='+'||s[i+1]=='-'||s[i+1]==0||s[i+1]==')'))
nr=nr-m[k++];
else
if(s[i]=='+'&&(s[i+1]=='*'||s[i+1]=='/'))
{p=m[k++];i++;
while(s[i+1]=='*'||s[i+1]=='/')
{if(s[i]=='*'||s[i+1]==0||s[i+1]==')')
p*=m[k++];
else
if(s[i]=='/'||s[i+1]==0||s[i+1]==')')
p=(float)p/m[k++];
i++;
}
if(s[i]=='*'&&s[i+1]!='(')
p*=m[k++];
else
if(s[i]=='*'&&s[i+1]=='(')
p*=calc(i+2,k);
if(s[i]=='/'&&s[i+1]!='(')
p=(float)p/m[k++];
else
if(s[i]=='/'&&s[i+1]=='(')
p=(float)p/calc(i+2,k);
nr+=p;}
else
if(s[i]=='-'&&(s[i+1]=='*'||s[i+1]=='/'))
{p=m[k++];i++;
while(s[i+1]=='*'||s[i+1]=='/')
{if(s[i]=='*'||s[i+1]==0||s[i+1]==')')
p*=m[k++];
if(s[i]=='/'||s[i+1]==0||s[i+1]==')')
p=(float)p/m[k++];
i++;
}
if(s[i]=='*'&&s[i+1]!='(')
p*=m[k++];
else
if(s[i]=='*'&&s[i+1]=='(')
p*=calc(i+2,k);
if(s[i]=='/'&&s[i+1]!='(')
p=(float)p/m[k++];
else
if(s[i]=='/'&&s[i+1]=='(')
p=(float)p/calc(i+2,k);
nr-=p;}
else
if(s[i]=='*'&&s[i+1]!='(')
nr*=m[k++];
else
if(s[i]=='/'&&s[i+1]!='(')
nr=(float)nr/m[k++];
else
if(s[i]=='+'&&s[i+1]=='(')
nr+=calc(i+2,k);
else
if(s[i]=='-'&&s[i+1]=='(')
nr-=calc(i+2,k);
else
if(s[i]=='*'&&s[i+1]=='(')
nr*=calc(i+2,k);
else
if(s[i]=='/'&&s[i+1]=='(')
nr=(float)nr/calc(i+2,k);
else
if(s[i]==')')
return nr;
return nr;
}
int main()
{ int a=0;
ifstream f("evaluare.in");
f.getline(q,100000);
f.close();
for(i=0;q[i];i++)
if(q[i]=='+'||q[i]=='-'||q[i]=='/'||q[i]=='*'||q[i]=='('||q[i]==')')
s[a++]=q[i];
a=0;
p=strtok(q,"+-/*()");
while(p)
{m[a++]=atol(p);
p=strtok(NULL,"+-/*()");
} a=0;
ofstream g("evaluare.out");
g<<calc(0,a);
g.close();
return 0;
}