Cod sursa(job #875774)

Utilizator Viva12Ferentz Sergiu Viva12 Data 10 februarie 2013 19:34:14
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.63 kb
#include <cstdio>
#include <cstring>
using namespace std;
FILE *inFile = fopen("evaluare.in","r");
FILE *outFile = fopen("evaluare.out","w");

void citire();
char exp[100000];
struct nod
{
    nod* left;
    nod* right;
    char info[255];
}*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];
            char aux[255];
            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];
            char aux[255];
            strncpy(aux,exp,i);
            aux[i] = 0;
            eval(aux,r->left);
            strcpy(aux,exp+i+1);
            eval(aux,r->right);
            return;
        }
    }

    char num[255];
    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);

}

int getNumber(nod *r)
{
    char s[255];
    strcpy(s,r->info);
    int x = 0;
    int p =1;
    for(int i = 0 ;i <strlen(s); i++)
    {
        x = r->info[i]-'0' + x * 10;

    }
    return x;
}
int resultat(nod *r)
{
    if(r==NULL)
    return 0;

    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");
    fprintf(outFile,"%d",resultat(r));
    return 0;
}

void citire(){

    fgets(exp,255,inFile);
    exp[strlen(exp)-1] = 0;
    for(int i = 0; i < strlen(exp);i++)
        if(exp[i] == ' ')
    {
        strcpy(exp+i, exp+i+1);
    }
}