Cod sursa(job #473911)

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

char sir[100001], semne[10001], semn = 'a';
long long  numere[1001];
int n, i, j, k;
int sn, par;
long long nr_semn, nr, nr2;

int main ()
{
    FILE *f = fopen ("evaluare.in","r");
    FILE *g = fopen ("evaluare.out","w");
    fscanf (f,"%s", sir);
    //printf (sir);
    n = nr = 0;
    i = 0;
    while (sir[i] != '\0')
    {
        if (sir[i] >= '0' && sir[i] <= '9' && !par)
            nr = nr * 10 + sir[i] - '0';
        else if (sir[i] >= '0' && sir[i] <= '9' && par)
        {
            if (semn == 'a')
                nr_semn = nr_semn * 10 + sir[i] - '0';
            else
            {
                while (sir[i] >= '0' && sir[i] <= '9' && par)
                {
                    nr2 = nr2 * 10 + sir[i] - '0';
                    i ++;
                }
                i --;
                if (semn == '+')
                    nr_semn += nr2;
                else if (semn == '-')
                    nr_semn -= nr2;
                else if (semn == '*')
                    nr_semn *= nr2;
                else if (semn == '/')
                    nr_semn /= nr2;
                nr2 = 0;
            }
            semn = 'a';
        }
        else if (sir[i] == '(')
            par = 1;
        else if (sir[i] == ')')
        {
            n ++;
            numere[n] = nr_semn;
            nr_semn = 0;
            par = 0;
        }
        else if ((sir[i] == '+' || sir[i] == '-' || sir[i] == '*' || sir[i] == '/') && par)
            semn = sir[i];
        else if ((sir[i] == '+' || sir[i] == '-' || sir[i] == '*' || sir[i] == '/') && !par)
        {
            if (nr)
            {
                n ++;
                numere[n] = nr;
                nr = 0;
            }
            if (sir[i] == '/' || sir[i] == '*')
            {
                semn = sir[i];
                i ++;
                while (sir[i] >= '0' && sir[i] <= '9' )
                {
                    nr2 = nr2 * 10 + sir[i] - '0';
                    i ++;
                }
                i --;
                if (semn == '*')
                    numere[n] *=  nr2;
                else if (semn == '/')
                    numere[n] /= nr2;
                nr2 = 0;
                semn = 'a';
            }
            else
            {
                sn ++;
                semne[sn] = sir[i];
            }

        }
        i ++;
    }
    if (nr)
    {
        n ++;
        numere[n] = nr;
        nr = 0;
    }

    for (i=1; i<=sn; ++i)
    {
        if (semne[i] == '+')
            numere[1] += numere[i+1];
        else if (semne[i] == '-')
            numere[1] -= numere[i+1];
        else if (semne[i] == '*')
            numere[1] *= numere[i+1];
        else if (semne[i] == '/')
            numere[1] /= numere[i+1];
    }

    fprintf (g, "%lld", numere[1]);

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