Cod sursa(job #1295988)

Utilizator bence21Bako Bence bence21 Data 20 decembrie 2014 14:58:51
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include<fstream>
#include<string.h>
using namespace std;
char s[100000];
long i,n,j,d;
double szamol(long& e,long v)
{
    double x=0;
    for(i=e;i<=v;i++)
    {
        if(s[i]=='(')
        {
            j=i;
            bool jo=1;
            d=0;
            while(jo)
            {
                j++;
                if(s[j]=='(')
                    d++;
                else if(s[j]==')')
                {
                    if(d==0)
                        jo=0;
                    else d--;
                }
            }
            j--;
            i++;
            x+=szamol(i,j);
        }
        else if(strchr("0123456789",s[i])!=NULL)
        {
            while(strchr("0123456789",s[i])!=NULL&&i<=v)
            {
                x=x*10+s[i]-'0';
                i++;
            }
            i--;
            if(i==v)
                return x;
        }
        else if(s[i]=='+')
        {
            i++;
            return x+=szamol(i,v);
        }
        else if(s[i]=='-')
        {
            i++;
            return x-=szamol(i,v);
        }
        else if(s[i]=='*'){
            j=i;
            bool jo=1;
            d=0;
            while(jo)
            {
                j++;
                if(s[j]=='(')
                    d++;
                else if(s[j]==')')
                {
                    if(d==0)
                        jo=0;
                    else d--;
                }
                else if((s[j]=='+'||s[j]=='-'||j==v)&&d==0)
                {
                    i++;
                    if(j!=v)
                        x=x*szamol(i,j-1);
                    else return x*=szamol(i,j);
                    jo=0;
                }
            }
        }
        else if(s[i]=='/'){
            j=i;
            bool jo=1;
            d=0;
            while(jo)
            {
                j++;
                if(s[j]=='(')
                    d++;
                else if(s[j]==')')
                {
                    if(d==0)
                        jo=0;
                    else d--;
                }
                else if((s[j]=='+'||s[j]=='-'||j==v)&&d==0)
                {
                    i++;
                    if(j!=v)
                        x=x/szamol(i,j-1);
                    else return x/=szamol(i,j);
                    jo=0;
                }
            }
        }
        if(i==v)
            return x;
    }
}
int main()
{
    ifstream f("evaluare.in");
    ofstream g("evaluare.out");
    f>>s;
    n=strlen(s);
    long i=0;
    g<<szamol(i,n-1);
    f.close();
    g.close();
    return 0;
}