Cod sursa(job #1303587)

Utilizator refugiatBoni Daniel Stefan refugiat Data 28 decembrie 2014 09:24:47
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.28 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<bitset>
#include<string>
using namespace std;
string s;
int i;
int parant(int n)
{
    long long a=0;
    //i=0;
    ++i;
    if(s[i]!='(')
    {
        while(s[i]>='0'&&s[i]<='9')
        {
            a=a*10+s[i]-'0';
            ++i;
        }
    }
    else
    {
        a=parant(n);
    }
    if(s[i]==')')
    {
        ++i;
        return a;
    }
    char o1;
    o1=s[i];
    ++i;
    long long b=0;
    if(s[i]!='(')
    {
        while(s[i]>='0'&&s[i]<='9'&&i<n)
        {
            b=b*10+s[i]-'0';
            ++i;
        }
    }
    else
    {
        b=parant(n);
    }
    char o2;
    long long c;
    for(;i<n&&s[i]!=')';)
    {
        o2=s[i];
        ++i;
        if(s[i]!='(')
        {
            c=0;
            while(s[i]>='0'&&s[i]<='9'&&i<n)
            {
                c=c*10+s[i]-'0';
                ++i;
            }
        }
        else
        {
            c=parant(n);
        }
        if(o1=='*')
        {
            a=a*b;
            b=c;
            o1=o2;
        }
        else
            if(o1=='/')
            {
                a=a/b;
                b=c;
                o1=o2;
            }
            else
            {
                if(o1=='+'&&(o2=='+'||o2=='-'))
                {
                    a=a+b;
                    b=c;
                    o1=o2;
                }
                else
                {
                    if(o1=='-'&&(o2=='+'||o2=='-'))
                    {
                        a=a-b;
                        b=c;
                        o1=o2;
                    }
                    else
                    {
                        if(o2=='*')
                        {
                            b=b*c;
                        }
                        else
                            b=b/c;
                    }
                }
            }
    }
    ++i;
    switch(o1)
    {
        case '+':a=a+b; break;
        case '-':a=a-b; break;
        case '*':a=a*b; break;
        case '/':a=a/b; break;
    }
    return a;
}
int main()
{
    ifstream si;
    si.open("evaluare.in");
    FILE* so=fopen("evaluare.out","w");
  //  string s;
    si>>s;
    //int i;
    long long n=s.length();
    long long a=0;
    //i=0;
    if(s[i]!='(')
    {
        while(s[i]>='0'&&s[i]<='9')
        {
            a=a*10+s[i]-'0';
            ++i;
        }
    }
    else
    {
        a=parant(n);
    }
    char o1;
    o1=s[i];
    ++i;
    long long b=0;
    if(s[i]!='(')
    {
        while(s[i]>='0'&&s[i]<='9'&&i<n)
        {
            b=b*10+s[i]-'0';
            ++i;
        }
    }
    else
    {
        b=parant(n);
    }
    char o2;
    long long c;
    for(;i<n;)
    {
        o2=s[i];
        ++i;
        if(s[i]!='(')
        {
            c=0;
            while(s[i]>='0'&&s[i]<='9'&&i<n)
            {
                c=c*10+s[i]-'0';
                ++i;
            }
        }
        else
        {
            c=parant(n);
        }
        if(o1=='*')
        {
            a=a*b;
            b=c;
            o1=o2;
        }
        else
            if(o1=='/')
            {
                a=a/b;
                b=c;
                o1=o2;
            }
            else
            {
                if(o1=='+'&&(o2=='+'||o2=='-'))
                {
                    a=a+b;
                    b=c;
                    o1=o2;
                }
                else
                {
                    if(o1=='-'&&(o2=='+'||o2=='-'))
                    {
                        a=a-b;
                        b=c;
                        o1=o2;
                    }
                    else
                    {
                        if(o2=='*')
                        {
                            b=b*c;
                        }
                        else
                            b=b/c;
                    }
                }
            }
    }
    switch(o1)
    {
        case '+':a=a+b; break;
        case '-':a=a-b; break;
        case '*':a=a*b; break;
        case '/':a=a/b; break;
    }
    fprintf(so,"%i\n",a);
}