Cod sursa(job #1757543)

Utilizator DobosDobos Paul Dobos Data 15 septembrie 2016 12:17:01
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("apel.in");
ofstream fout("apel.out");
typedef  long long int var;
char s[255], *p = s;
string sa,S[28];
int V[28][12],v[28],po;
int tr(const char &a){
    return a - 'a' + 1;
}
int Tr(const char &A){
    return A - 'A' + 1;
}
var Imultire(int l);
var Numar(int l);

var Adunare(int l){
    var x = Imultire(l);
    while(S[l][po] == '+' || S[l][po] == '-'){
        if(S[l][po] == '+')
            po++, x += Imultire(l);
        else
            po++, x -= Imultire(l);
    }
    return x;
}
var Imultire(int l){

    var x = Numar(l);
    while(S[l][po] == '*' ){
        if(S[l][po] == '*')
            po++, x *= Numar(l);
    }
    return x;
}
var Numar(int l){

    var x = 0;
    if(S[l][po] == '('){
        po++;
        x = Adunare(l);
        po++;
    }
    for(;isdigit(S[l][po]);po++)
        x = x * 10 + S[l][po] - '0';
    if(S[l][po] <= 'z' && S[l][po] >= 'a')
        x = V[l][tr(S[l][po])],po++;

    return x;
}
var Recurs(){

    int n = 0,l = Tr(*p);
    for(int i = 1; i <= 10; i++)
        V[l][i] = 0;
    while(*p != ')'){
        *p++;
        if(isdigit(*p)){
            n++;
            for(;isdigit(*p);*p++)
                V[l][n] = V[l][n]*10 + *p - '0';
        }
        if(*p <= 'z' && *p >= 'a')
            n++ , V[l][n] = v[tr(*p)];
        if(*p <= 'Z' && *p >= 'A')
            n++ , V[l][n] = Recurs();
    }
    *p++;
    po = 2 * n + 3;
   return Adunare(l);
}

int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);

    fin >> s;
    do{
        sa.clear();
        fin >> sa;
        for(int i = 2; isdigit(sa[i]); i++)
            v[tr(sa[0])] = v[tr(sa[0])] * 10 + sa[i] - '0';

    }while(sa[0] <= 'z' && sa[0] >= 'a');

    do{
        S[Tr(sa[0])] = sa;
    } while(fin >> sa);

    int n = 0,l = Tr(s[0]);
    while(*p != ')'){
        *p++;
        if(isdigit(*p)){
            n++;
            for(;isdigit(*p);*p++)
                V[l][n] = V[l][n]*10 + *p - '0';
        }
        if(*p <= 'z' && *p >= 'a')
            n++ , V[l][n] = v[tr(*p)];
        if(*p <= 'Z' && *p >= 'A')
            n++ , V[l][n] = Recurs();

    }
    po = 2 * n + 3;
    fout << Adunare(l);


    return 0;
}