Cod sursa(job #2155293)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 7 martie 2018 19:29:19
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 5.39 kb
#include <stdio.h>
#include <cstring>

using namespace std;
FILE *f,*g;

char c[100009];
int par[50002],stiva[100009];

///'+'-> -2
///'-'-> -3
///'*'-> -4
///'/'-> -5

int adun(int a, int b)
{
    return (a+b);
}

int scad(int a, int b)
{
    return (a-b);
}

int inm(int a, int b)
{
    return (a*b);
}

int imp(int a, int b)
{
    return (a/b);
}

int cauta(int a, int b, int semn)
{
    if(semn==-2)
        return adun(a,b);
    if(semn==-3)
        return scad(a,b);
    if(semn==-4)
        return inm(a,b);
    if(semn==-5)
        return imp(a,b);
}
int main()
{
    int lg,ss=0,pp=0,ok=0,s1,s2,poz,a,b,sum;
    f=fopen("evaluare.in","r");
    g=fopen("evaluare.out","w");
    fscanf(f,"%s",&c);
    lg=strlen(c);
    int i,nr;
    for(i=0;i<lg;++i)
    {
        if(c[i]=='(')
            stiva[++ss]=-1,par[++pp]=ss;
        else
            if(c[i]=='+')
                stiva[++ss]=-2;
            else
                if(c[i]=='-')
                    stiva[++ss]=-3;
                else
                    if(c[i]=='*')
                        stiva[++ss]=-4;
                    else
                        if(c[i]=='/')
                            stiva[++ss]=-5;
                        else
                            if(c[i]>='0' && c[i]<='9')
                            {
                                nr=0;
                                while(c[i]>='0' && c[i]<='9')
                                {
                                    nr=nr*10+c[i]-'0';
                                    ++i;
                                }
                                stiva[++ss]=nr;
                                --i;
                            }
                            else
                                if(c[i]==')')
                                {
                                    s1=-4;
                                    s2=-5;
                                    ok=1;
                                    int da=0;
                                    while(ok==1)
                                    {
                                        ok=0;
                                       poz=par[pp];
                                        while((stiva[poz]!=s1&& stiva[poz]!=s2) && poz<=ss)
                                            ++poz;
                                        if(poz<=ss)
                                        {
                                            ok=1;
                                            int j;
                                            a=stiva[poz-1];
                                            b=stiva[poz+1];
                                            if(stiva[poz-2]==-1)
                                            {
                                                stiva[poz-2]=cauta(a,b,stiva[poz]);
                                                for(j=par[pp]+1;j<ss-2;++j)
                                                    stiva[j]=stiva[j+3];
                                                --pp;
                                                da=1;
                                                ss-=3;
                                            }
                                            else
                                            {
                                                stiva[poz-1]=cauta(a,b,stiva[poz]);
                                                for(j=poz;j<ss-1;++j)
                                                    stiva[j]=stiva[j+2];
                                                ss-=2;
                                            }
                                        }

                                    }
                                    if(da==0)
                                    {
                                        s1=-2;
                                        s2=-3;
                                        sum=0;
                                        poz=par[pp]+1;
                                        sum=stiva[poz];
                                        ++poz;

                                        while(poz<ss)
                                        {
                                            sum=cauta(sum,stiva[poz+1],stiva[poz]);
                                            poz+=2;
                                        }
                                        poz=par[pp];
                                        stiva[poz]=sum;
                                        ss=poz;
                                        --pp;
                                    }

                                }
    }

    s1=-4;
    s2=-5;
    ok=1;
    while(ok==1)
    {
        ok=0;
        poz=1;
        while((stiva[poz]!=-4 && stiva[poz]!=-5) && poz<=ss)
            ++poz;
        if(poz<=ss)
        {
            ok=1;
            int j;
            a=stiva[poz-1];
            b=stiva[poz+1];
            stiva[poz-1]=cauta(a,b,stiva[poz]);
            for(j=poz;j<ss-1;++j)
                stiva[j]=stiva[j+2];
            ss-=2;
        }

    }

    s1=-2;
    s2=-3;
    sum=0;
    poz=1;
    sum=stiva[poz];
    ++poz;
    while(poz<ss)
    {
        sum=cauta(sum,stiva[poz+1],stiva[poz]);
        poz+=2;
    }
    poz=1;
    stiva[poz]=sum;

        fprintf(g,"%d",stiva[1]);

    fclose(f);
    fclose(g);
    return 0;
}