Cod sursa(job #381106)

Utilizator bacilaBacila Emilian bacila Data 8 ianuarie 2010 23:25:29
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#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.txt");
    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;
}