Cod sursa(job #1724277)

Utilizator refugiatBoni Daniel Stefan refugiat Data 2 iulie 2016 18:18:47
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
ifstream si("evaluare.in");
ofstream so("evaluare.out");
string s;
int poz,n;
int parant();
int numar();
int numar()
{
    if(s[poz]=='(')
    {
        ++poz;
        return parant();
    }
    int val=0;
    while(s[poz]>='0'&&s[poz]<='9'&&poz<n)
    {
        val=val*10+s[poz]-'0';
        ++poz;
    }
    return val;
}
inline int ec(int a,int b,char s)
{
    switch(s)
    {
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':return a/b;

    }
}
int parant()
{
    int a,b,c;
    char s1,s2;
    a=numar();
    if(poz==n||s[poz]==')')
    {
        ++poz;
        return a;
    }
    s1=s[poz];
    ++poz;
    b=numar();
    if(poz==n||s[poz]==')')
    {
        ++poz;
        return ec(a,b,s1);
    }
    while(poz!=n&&s[poz]!=')')
    {
        s2=s[poz];
        ++poz;
        c=numar();
        if(s1=='*'||s1=='/')
        {
            a=ec(a,b,s1);
            b=c;
            s1=s2;
        }
        else
        {
            if(s2=='*'||s2=='/')
            {
                b=ec(b,c,s2);
            }
            else
            {
                a=ec(a,b,s1);
                b=c;
                s1=s2;
            }
        }
    }
    a=ec(a,b,s1);
    ++poz;
    return a;
}

int main()
{
    si>>s;
    n=s.size();
    so<<parant();
    so.close();
    return 0;
}