Cod sursa(job #146527)

Utilizator recviemAlexandru Pana recviem Data 1 martie 2008 20:58:05
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define in "evaluare.in"
#define out "evaluare.out"
#define lgt 100500

    char exp[lgt];

void citire()
{
	freopen(in,"r",stdin);
    fgets(exp,lgt,stdin);
	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 2; 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;
    }
    if (prioritate(exp[pos]) == 3)
        return 0;
    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);
    }
}

long long 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];
    //left = new char;
    //right = new char;
    if (k>0) // exp e expresie
    {
        strncpy(left,exp,k);//strncat(left,exp,k); // Partea dreapta a semnului
        left[k]='\0';
        strcpy(right,exp+k+1);//strcat(right,exp+k+1); // Partea stanga a semnului
        right[strlen(exp)-(k+1)]='\0';
        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
    return atoi(exp);
}

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