Cod sursa(job #875820)

Utilizator Viva12Ferentz Sergiu Viva12 Data 10 februarie 2013 20:27:44
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 3.67 kb
#include <cstdio>
#include <fstream>
#include <cstring>
using namespace std;
FILE *inFile = fopen("evaluare.in","r");
FILE *outFile = fopen("evaluare.out","w");
ifstream fin("evaluare.in");
void citire();
char exp[100002];
char aux[100002];
struct nod
{
    nod* left;
    nod* right;
    char info[2000];
}*r;
void eval(char exp[],nod *&r)
{
    if(exp[0] =='(' && exp[strlen(exp)-1] == ')')
    {
                int nrP =0;
        for(int i =0 ; i < strlen(exp); i++)
        {
            if(exp[i] == '(')
                nrP ++;
            if(exp[i] == ')')
                nrP--;
            if(nrP == 0 && i != strlen(exp)-1)
                break;

            else
                if( nrP == 0 )
                {
                exp[strlen(exp)-1] =0;
                eval(exp+1,r);
                return;
                }

        }

    }
    int nrP = 0;
    for(int i = strlen(exp)-1; i > 0; i--)
    {
        if(exp[i] == '(')
            nrP ++;
        if(exp[i] == ')')
            nrP--;
        if((exp[i] == '+' || exp[i] == '-') && nrP == 0)
        {
            r = new nod();
            r->left = NULL;
            r->right = NULL;
            r->info[0] = exp[i];

            strncpy(aux,exp,i);
            aux[i] = 0;
            eval(aux,r->left);
            strcpy(aux,exp+i+1);
            eval(aux,r->right);
            return;
        }
    }
    nrP = 0;
    for(int i = strlen(exp)-1; i > 0; i--)
    {
        if(exp[i] == '(')
            nrP ++;
        if(exp[i] == ')')
            nrP--;
        if((exp[i] == '*' || exp[i] == '/') && nrP == 0)
        {
            r = new nod();
            r->left = NULL;
            r->right = NULL;
            r->info[0] = exp[i];

            strncpy(aux,exp,i);
            aux[i] = 0;
            eval(aux,r->left);
            strcpy(aux,exp+i+1);
            eval(aux,r->right);
            return;
        }
    }

    char num[100002];
    strcpy(num,exp);
    r = new nod();
    strcpy(r->info,num);
    r->left = NULL;
    r->right = NULL;
    return;

}

void inFix(nod *r)
{
    printf("%s",exp);

}

void preFix(nod *r)
{
    if(r==NULL)
        return;

    printf("%s",r->info);
    preFix(r->left);
    preFix(r->right);

}

void postFix(nod *r)
{
    if(r==NULL)
        return;

    postFix(r->left);
    postFix(r->right);
    printf("%s",r->info);

}

long long getNumber(nod *r)
{
    char s[100002];
    strcpy(s,r->info);
    long long x = 0;

    for(int i = 0 ;i <strlen(s); i++)
    {
        x = r->info[i]-'0' + x * 10;

    }
    return x;
}
long long resultat(nod *r)
{
    if(!strchr("+-/*",r->info[0]))
        return getNumber(r);

    if(strcmp(r->info,"+") == 0 && r->left != NULL && r->right != NULL)
    return resultat(r->left) + resultat(r->right);
    if(strcmp(r->info,"-") == 0 && r->left != NULL && r->right != NULL)
    return resultat(r->left) - resultat(r->right);
    if(strcmp(r->info,"*") == 0 && r->left != NULL && r->right != NULL)
    return resultat(r->left) * resultat(r->right);
    if(strcmp(r->info,"/") == 0 && r->left != NULL && r->right != NULL)
    return resultat(r->left) / resultat(r->right);
}
int main(){
    citire();
    eval(exp,r);
    //inFix(r);
    //printf("\n");
    //preFix(r);
    //printf("\n");
    //postFix(r);
    //printf("\n");
    printf("%lld",resultat(r));
    fprintf(outFile,"%lld",resultat(r));

    return 0;
}

void citire(){

    fscanf(inFile,"%s",exp);
    //printf("%s",exp);
    for(int i = 0; i < strlen(exp);i++)
        if(exp[i] == ' ')
    {
        strcpy(exp+i, exp+i+1);
    }
}