Cod sursa(job #599566)

Utilizator andrianAndrian andrian Data 29 iunie 2011 03:05:35
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char exp[100001];

void citire(){
    ifstream in("evaluare.in");
    in >> exp;
    in.close();
}

long expresie(int k1, int k2);
long termen(int k1, int k2);

long factor(int k1, int k2){
    if(exp[k1] == '('){
        return expresie(k1+1, k2-1);
    }else{
        long t=0;
        for(int i=k1;i<=k2;++i)
            t=t*10+exp[i]-'0';
        return t;
    };
}

long termen(int k1, int k2){
    long produs=1, x=k1;
    char c='*';
    for(int i=k1;i<=k2;++i){
        if(exp[i] == '*' || exp[i] == '/' || exp[i] == '\0' || i==k2){
            switch(c){
                case '*': produs*=factor(x, i-1);
                x=i+1;
                break;
                case '/': produs/=factor(x, i-1);
                x=i+1;
                break;
            }
            c=exp[i];
        }
    }
    return produs;
}

long expresie(int k1, int k2){
    long suma=0, x=k1;
    char c='+';
    for(int i=k1;i<=k2;++i){
        if(exp[i] == '+' || exp[i] == '-' || exp[i] == '\0' || i == k2){
            switch(c){
                case '+': suma+=termen(x, i-1);
                x=i+1;
                break;
                case '-': suma-=termen(x, i-1);
                x=i+1;
                break;
            }
            c=exp[i];
        }
    }
    return suma;
}

int main()
{
    citire();
    cout << (expresie(0,strlen(exp)-1));
    return 0;
}