Cod sursa(job #2047474)

Utilizator Marina23Oprea Marina Marina23 Data 24 octombrie 2017 21:12:09
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <fstream>
#include <string.h>

using namespace std;

int Calcul(int X,int Y,char Op)
{
    if(Op=='+')
        return X+Y;
    if(Op=='-')
        return X-Y;
    if(Op=='*')
        return X*Y;
    return X/Y;
}

int N,i,j,Vf1,Vf2,Termeni[100000],Nr;
char Sir[100005],Operatori[100005],Prioritate[260];

int main()
{
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");

    fin.get(Sir,100001,'\n');
    N=strlen(Sir);
    Vf1=0;
    Vf2=0;
    Prioritate['+']=1;
    Prioritate['-']=1;
    Prioritate['*']=2;
    Prioritate['/']=2;
    for(i=0;i<N;i++)
        if(Sir[i]=='(')
        {
            Vf1++;
            Operatori[Vf1]='(';
        }//if
        else
            if(Sir[i]==')')
            {
                while(Vf1>0 and Operatori[Vf1]!='(')
                {
                    Nr=Calcul(Termeni[Vf2-1],Termeni[Vf2],Operatori[Vf1]);
                    Vf1--;
                    Vf2--;
                    Termeni[Vf2]=Nr;
                }//while
                Vf1--;//sar (
            }//if
            else
                if(Sir[i]>='0' and Sir[i]<='9')
                {
                    Nr=0;
                    j=i;
                    while(j<N and Sir[j]>='0' and Sir[j]<='9')
                    {
                        Nr=Nr*10+(Sir[j]-'0');
                        j++;
                    }//while
                    if(i==1 and Sir[i-1]=='-')
                        Nr=-Nr;
                    Vf2++;
                    Termeni[Vf2]=Nr;
                    i=j-1;
                }//if
                else
                {
                    while(Vf1>0 and Prioritate[Sir[i]]<=Prioritate[Operatori[Vf1]])
                    {
                        Nr=Calcul(Termeni[Vf2-1],Termeni[Vf2],Operatori[Vf1]);
                        Vf1--;
                        Vf2--;
                        Termeni[Vf2]=Nr;
                    }//while
                    Vf1++;
                    Operatori[Vf1]=Sir[i];
                }//else
    while(Vf1>0)
    {
        Nr=Calcul(Termeni[Vf2-1],Termeni[Vf2],Operatori[Vf1]);
        Vf1--;
        Vf2--;
        Termeni[Vf2]=Nr;
    }//while
    fout<<Termeni[1];

    fin.close ();
    fout.close();
    return 0;
}