Cod sursa(job #146435)

Utilizator recviemAlexandru Pana recviem Data 1 martie 2008 18:18:39
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define in "evaluare.in"
#define out "evaluare.out"
#define lgt 100000

    char exp[lgt];

void citire()
{
	freopen(in,"r",stdin);
    gets(exp);
	fclose(stdin);
}

void deparantezare(char *exp) // sterge parantezele
{
    char *x=new char;
    x = exp;
    int l=strlen(x);
    strcpy(exp,"");
    strncat(exp,x+1,l-2);
}

int prioritate(char p)
{
    switch (p)
    {
        case '+': return 0; break;
        case '-': return 0; break;
        case '/': return 1; break;
        case '*': return 1; break;
        default: return 3; break;
    }
}

int semn(char *exp)
{
    int pos=0,p=0;
    for (int i=0;i<strlen(exp);i++)
    {
        if (exp[i] == '(') p++;
        if (exp[i] == ')') p--;
        if (prioritate(exp[i])<=prioritate(exp[pos]) && p == 0)
            pos = i;
    }
    return pos;
}

void curata(char *exp)
{
    int k=0;
    if (exp[0] == '(' && exp[strlen(exp)-1] == ')')
    while (!k && strlen(exp)>2)
    {
        int p=0;
        int l=strlen(exp);
        for (int i=0;i<l-1;i++)
        {
            if (exp[i] == '(') p++;
            if (exp[i] == ')') p--;
            if (p==0 && i>0)
            {
                k=1;
                break;
            }
        }
        if (!k)
            deparantezare(exp);
    }
}

int eval(char *exp)
{
    curata(exp); // curatam expresia de paranteze
    int k = semn (exp); // se cauta semnul cu prioritate in expresie
    char left[lgt],right[lgt];
    if (k>0) // exp e expresie
    {
        strcpy(left,""); strncat(left,exp,k); // Partea dreapta a semnului
        strcpy(right,""); strcat(right,exp+k+1); // Partea stanga a semnului
        switch(exp[k])
        {
            case '+': return eval(left)+eval(right); break;
            case '-': return eval(left)-eval(right); break;
            case '/': return eval(left)/eval(right); break;
            case '*': return eval(left)*eval(right); break;
        }
    }
    // exp e numar
    //printf("%f\n",atof(exp));
    return atoi(exp);
}

int main()
{
	citire();
	freopen(out,"w",stdout);
    printf("%d",eval(exp));
    fclose(stdout);
	return 0;
}