Cod sursa(job #2338339)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 7 februarie 2019 12:30:51
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.77 kb
#include <iostream>
#include <stdio.h>
#include <cstring>
#define adun -3
#define scad -4
#define inm -5
#define imp -6
using namespace std;
FILE *f,*g;
char v[100002];
int st[100002];
int lg,s;
void read()
{
    fscanf(f,"%s",&v);
    lg=strlen(v);
}
void solve()
{   int vf=0,nr,s2,j,jcop,vffake,icop;
    for(int i=0; i<lg; i++)
    {
        if(v[i]=='(')
            st[++vf]=-1;
        else if(v[i]>='0' && v[i]<='9')
        {   nr=0;
            while(v[i]>='0' && v[i]<='9')
            {
                nr=nr*10+v[i]-'0';
                i++;
            }
            st[++vf]=nr;
            i--;
        }
        else if(v[i]=='+')
            st[++vf]=adun;
        else if(v[i]=='-')
            st[++vf]=scad;
        else if(v[i]=='*')
            st[++vf]=inm;
        else if(v[i]=='/')
            st[++vf]=imp;
        else
        {
            for(j=vf; st[j]!=-1; j--){}
            vffake=j;
            s=st[++j];
            j++;                                             //aici tre sa vad daca ii cv de forma (-21+3)
            for( ; j<=vf; j+=2)
            {
                if(st[j]==adun && (st[j+2]!=inm && st[j+2]!=imp))
                    s+=st[j+1];
                else if(st[j]==scad && (st[j+2]!=inm && st[j+2]!=imp))
                    s-=st[j+1];
                else
                {   jcop=j;
                    s2=st[j+1];
                    j+=2;
                    while(st[j]==inm || st[j]==imp)
                    {
                        if(st[j]==inm)
                            s2*=st[j+1];
                        else
                            s2/=st[j+1];
                        j+=2;
                    }
                    if(jcop==scad)
                        s-=s2;
                    else
                        s+=s2;
                }
            }
            vf=vffake;
            st[vffake]=s;
        }
    }
    s=0;
    for(int i=1; i<=vf; i++)
    {
        if(st[i]==adun && (st[i+2]!=inm && st[i+1]!=imp))
            s+=st[i+1];
        else if(st[i]==scad && (st[i+2]!=inm && st[i+2]!=imp))
            s-=st[i+1];
        else
        {   icop=i;
            s2=st[i];
            i++;
            while(st[i]==inm || st[i]==imp)
            {
                if(st[i]==inm)
                    s2*=st[i+1];
                else
                    s2/=st[i+1];
                i+=2;
            }
            if(icop==scad)
                s-=s2;
            else
                s+=s2;
        }
    }
}
void write()
{
    fprintf(g,"%d",s);
    cout<<s;
}
int main()
{
    f=fopen("evaluare.in","r");
    g=fopen("evaluare.out","w");
    read();
    solve();
    write();
    fclose(f);
    fclose(g);
    return 0;
}