Cod sursa(job #473935)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 1 august 2010 19:16:34
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.39 kb
#include <stdio.h>
#include <string.h>
using namespace std;

char sir[100001], stack[1001], output[10001];
int stiva[101];
int prior[101];
int n, i, j, k;
int nr;
int primul, varf;

void initializare ()
{
    prior['('] = prior[')'] = 4;
    prior['+'] = prior['-'] = 1;
    prior['*'] = prior['/'] = 2;
}

int este_semn (char x)
{
    if (x == '+' || x == '-' || x == '*' || x == '/' || x == '(' || x == ')')
        return 1;
    return 0;
}

int conversie_semn (char x)
{
    if (x == '+')
        return -1;
    if (x == '-')
        return -2;
    if (x == '*')
        return -3;
    if (x == '/')
        return -4;
}

int main ()
{
    FILE *f = fopen ("evaluare.in","r");
    FILE *g = fopen ("evaluare.out","w");
    fscanf (f,"%s", sir);
    //printf (sir);

    initializare ();

    i = 0;
    while (sir[i] != '\0')
    {
        if (sir[i] >= '0' && sir[i] <= '9')
        {
            while (sir[i] >= '0' && sir[i] <= '9')
            {
                nr = nr * 10 + sir[i] - '0';
                i ++;
            }
            i --;
            n ++;
            primul ++;
            output[primul] = nr + '0';
            nr = 0;
        }
        else if (sir[i] == '(')
        {
            varf ++;
            stack[varf] = '(';
        }
        else if (sir[i] == ')')
        {
            varf;
            while (stack[varf] != '(')
            {
                if (stack[varf] != '(' && stack[varf] != ')')
                {
                    primul ++;
                    output[primul] = stack[varf];
                }
                stack[varf] = 0;
                varf --;
            }
            stack[varf] = 0;
            varf --;
        }
        else if (este_semn (sir[i]))
        {
            if (prior[sir[i]] <= prior[stack[varf]] && stack[varf] != '(' && stack[varf] != ')')
            {
                primul ++;
                output[primul] = stack[varf];
                stack[varf] = sir[i];
            }
            else
            {
                varf ++;
                stack[varf] = sir[i];
            }
        }
        i ++;
    }

    while (varf)
    {
        primul ++;
        output[primul] = stack[varf];
        varf --;
    }

    /*for (i=1; i<=primul; ++i)
        printf ("%c ", output[i]);*/

    i = 2;
    varf = 1;
    stiva[varf] = output[1] - '0';
    while (i <= primul)
    {
        if (este_semn (output[i]) )
        {
            if (output[i] == '+')
            {
                stiva[varf-1] += stiva[varf];
                stiva[varf] = 0;
                varf --;
            }
            else if (output[i] == '-')
            {
                stiva[varf-1] -= stiva[varf];
                stiva[varf] = 0;
                varf --;
            }
            else if (output[i] == '*')
            {
                stiva[varf-1] *= stiva[varf];
                stiva[varf] = 0;
                varf --;
            }
            else if (output[i] == '/')
            {
                stiva[varf-1] /= stiva[varf];
                stiva[varf] = 0;
                varf --;
            }
        }
        else
        {
            varf ++;
            stiva[varf] = output[i] - '0';
        }
        i ++;
    }

    fprintf (g, "%d", stiva[1]);

    fclose (g);
    fclose (f);
    return 0;
}