Cod sursa(job #1338113)

Utilizator horiainfoTurcuman Horia horiainfo Data 9 februarie 2015 19:58:18
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#include <fstream>
#include <cstring>
#define NR 150005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char a[NR],op[NR/2],k[NR];
int v[NR/2];
void trag(int v[],int lg)
{
    for(int i=0;i<lg;i++)
        v[i]=v[i+1];
}
int calc(char b[])
{
    int lg=0,d=strlen(b);
    char aux[lg];

    for(int i=0;i<d;i++)
        if(b[i]>='0' && b[i]<='9')
            v[lg]=v[lg]*10+b[i]-'0';
        else
            op[++lg]=b[i],v[lg]=0;

    for(int i=2;i<=lg;i++)
        if(op[i]=='*')
        {
            v[i-1]=v[i-1]*v[i];
            strcpy(aux,op+i+1);
            op[i]='\0';
            strcat(op,aux);
            trag(v+i,lg);
            lg--; i--;
        }
        else
            if(op[i]=='/')
            {
                v[i-1]=v[i-1]/v[i];
                strcpy(aux,op+i+1);
                op[i]='\0';
                strcat(op,aux);
                trag(v+i,lg);
                lg--; i--;
            }
    long long s=0;
    for(int i=1;i<=lg;i++)
    {
        if(op[i]=='+')
            s=s+v[i];
        else
            s=s-v[i];
    }
    return s;
}
void convert(int n,char aux[])
{
    int p=0,var;
    if(n<0) n=-n;
    while(n!=0)
        aux[p++]=(n%10)+'0',n=n/10;
    aux[p]='\0';
    for(int i=0;i<=(p-1)/2;i++)
        var=aux[i],aux[i]=aux[p-1-i],aux[p-1-i]=var;
}
int cautP(int poz,char b[],int d)
{
    int ok=1,j;
    for(j=poz+1;j<d;j++)
        if(b[j]=='(') ok++;
        else
            if(b[j]==')')
            {
                ok--;
                if(ok==0) break;
            }
    b[j]='\0';
    strcpy(k,b+poz+1);
    b[j]=')';
    return j;
}
int changeP(char b[])
{
    char aux[20];
    int ok,j,d=strlen(b),n;
    for(int i=0;i<d;i++)
        if(b[i]=='(')
        {
            j=cautP(i,b,d);
            n=changeP(k);
            convert(n,aux);
            //
            strcpy(k,b+j+1);
            b[i]='\0';
            strcat(b,aux);
            strcat(b,k);
            d=strlen(b);
            //
            if(n<0)
            {
                for(j=i-1;j>=0;j--)
                    if(b[j]=='-')
                        {b[j]='+'; break;}
                    else
                    if(b[j]=='+')
                        {b[j]='-'; break;}
            }
            i--;
        }
    return calc(b);
}
void refac(char a[])
{
    int d=strlen(a),lg=0;
    if(a[0]!='-')   k[lg++]='+';
    for(int i=0;i<d;i++)
    {
        if(a[i-1]=='(')
            if(a[i]!='-') k[lg++]='+';
        k[lg++]=a[i];
    }
    strcpy(a,k);
    op[0]='N';
}
int main()
{
    fin.getline(a,NR);
    refac(a);
    fout<<changeP(a)<<'\n';
    return 0;
}