Cod sursa(job #2324536)

Utilizator BaraianTudorBaraian Tudor Stefan BaraianTudor Data 20 ianuarie 2019 22:21:11
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
char c[100005];
int nr(int & st)
{
    int a=c[st]-'0';
    while('0'<=c[st+1] && c[st+1]<='9' && st<=strlen(c))
    {
        ++st;
        a=a*10+(c[st]-'0');
    }
    return a;
}
int prod(int & st,int a)
{
    ++st;
    while((c[st]=='*' || c[st]=='/') && st<=strlen(c) && c[st+1]!='(')
    {
        if(c[st]=='/')
        {
            ++st;
            a=a/nr(st);
        }
        if(c[st]=='*')
        {
            ++st;
            a=a*nr(st);
        }
        st++;
    }
    st--;
    return a;
}
int evaluare(int & st)
{
    int a=0;
    int s=0;
    while(c[st+1]!=')')
    {
        ++st;
        if(c[st]=='(')
        {
            a=evaluare(st);
            ++st;
            a=prod(st,a);
            if(c[st+1]=='+' || c[st+1]=='-' || c[st+1]==')')
            {
                s+=a;
            }
        }
        else if(c[st]>='0' && c[st]<='9')
        {
            a=nr(st);
            a=prod(st,a);
            if(c[st+1]=='+' || c[st+1]=='-' || c[st+1]==')')
            {
                s+=a;
            }
            else if(c[st+2]=='(')
            {
                if(c[st+1]=='*')
                {
                    st+=2;
                    a*=evaluare(st);
                    st++;
                }
                else if(c[st+1]=='/')
                {
                    st+=2;
                    a/=evaluare(st);
                    st++;
                }
                s+=a;
            }
        }
    }
    return s;
}

int main()
{
    in.getline(c+1,100005);
    c[0]='(';
    c[strlen(c)]=')';
    int z=0;
    out<<evaluare(z);
    return 0;
}