Cod sursa(job #1249315)

Utilizator refugiatBoni Daniel Stefan refugiat Data 26 octombrie 2014 20:00:41
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.64 kb
#include<fstream>
#include<iostream>
#include<stack>
using namespace std;
int x[100000];
int c[100000];
int main()
{
    ifstream si;
    si.open("evaluare.in");
    ofstream so;
    so.open("evaluare.out");
    string s="(";
    char a;
    while(si>>a)
        s+=a;
    s+=')';
    int n=s.length(),z;
    int i,d,e,f,m=0,p=0;
    for(i=0;i<n;++i)
    {
        if('0'<=s[i]&&s[i]<='9')
        {
            z=0;
            while('0'<=s[i]&&s[i]<='9')
            {
                z=z*10+s[i]-'0';
                ++i;
            }
            --i;
            x[m]=z;
            ++m;
        }
        else
        {
            if(s[i]!=')')
            {
                c[p]=s[i];
                ++p;
            }
            else
            {
                --p;
                while(c[p]!='(')
                {
                    a=c[p];
                    --p;
                    --m;
                    d=x[m];
                    --m;
                    e=x[m];
                    if(c[p]=='*')
                    {
                        --p;
                        --m;
                        f=x[m];
                        switch(a)
                        {
                            case '+': x[m]=f*e+d;++m;break;
                            case '-': x[m]=f*e-d;++m;break;
                            case '*': x[m]=f*e*d;++m;break;
                            case '/': x[m]=f*e/d;++m;break;
                        }
                    }
                    else
                    {
                        if(c[p]=='/')
                        {
                            --p;
                            --m;
                            f=x[m];
                            switch(a)
                            {
                                case '+': x[m]=f/e+d;++m;break;
                                case '-': x[m]=f/e-d;++m;break;
                                case '*': x[m]=f/e*d;++m;break;
                                case '/': x[m]=f/e/d;++m;break;
                            }
                        }
                        else
                        {
                            switch(a)
                            {
                                case '+': x[m]=e+d;++m;break;
                                case '-': x[m]=e-d;++m;break;
                                case '*': x[m]=e*d;++m;break;
                                case '/': x[m]=e/d;++m;break;
                            }
                        }
                    }
                }
                --p;
            }
        }
    }
    so<<x[0];
}