Cod sursa(job #1817478)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 27 noiembrie 2016 21:30:27
Problema Eval Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <stdio.h>
#define lim 1000000
long long i,n;
char v[lim];
long long val[30];
long long expr();
long long term();
long long fact();
long long expr(){
    long long rez=0;
    rez=term();
    while(v[i]=='+'||v[i]=='-'){
        if(v[i]=='+'){
            i++;
            rez+=term();
        }
        else{
            i++;
            rez-=term();
        }
    }
    return rez;
}
long long term(){
    long long rez=0;
    rez=fact();
    while(v[i]=='*'){
        i++;
        rez*=fact();
    }
    return rez;
}
long long fact(){
    long long rez=0;
    if(v[i]=='('){
        i++;
        rez=expr();
        i++;
    }
    else{
        if(v[i]=='['){
            i++;
            rez=expr();
            rez*=rez;
            i++;
        }
        else{
            if(v[i]=='+'){
                i++;
                rez=expr();
            }
            else
                if(v[i]=='-'){
                    i++;
                    rez=expr()*(-1);
                }
                else
                    if(v[i]>='a'&&v[i]<='z'){
                        rez=val[v[i]-'a'];
                        i++;
                    }
        }
    }
    return rez;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("eval.in","r");
    fout=fopen("eval.out","w");
    long long rasp;
    char ch;
    fscanf(fin,"%lld",&n);
    for(i=0;i<n;i++)
        fscanf(fin,"%lld",&val[i]);
    ch=fgetc(fin);
    ch=fgetc(fin);
    i=0;
    while(ch!=EOF&&ch!='\n'&&ch!=' '){
        i++;
        v[i]=ch;
        ch=fgetc(fin);
    }
    n=i;
    i=1;
    rasp=expr();
    fprintf(fout,"%lld",rasp);
    fclose(fin);
    fclose(fout);
    return 0;
}