Cod sursa(job #1979227)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 9 mai 2017 23:22:26
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");

struct nod
{
   char info;
   int nr;
   nod *st, *dr;
}*rad;
char e[100003],C;
int i,n,sol;

void urm()
{
  C = e[i];
  i++;
}

int numar()
{
    int val = C-'0';
    bool ok = true;

    while( ok == true )
    {
        ok = false;

        switch(e[i])
        {
            case '0' : ok = true;
            case '1' : ok = true;
            case '2' : ok = true;
            case '3' : ok = true;
            case '4' : ok = true;
            case '5' : ok = true;
            case '6' : ok = true;
            case '7' : ok = true;
            case '8' : ok = true;
            case '9' : ok = true;
        }

        if( ok == true )
        {
            val = val*10 + ( e[i] - '0' );
            i++;
        }
    }
    return val;
}

int expo(int x,int y)
{
    if( y == 0 )
        return 1;
    else
        if( y % 2 == 0 )
           return expo(x,y/2)*expo(x,y/2);
        else
           return x*expo(x,y/2)*expo(x,y/2);
}

void termen(nod*& r);
void factor(nod*& r);
void putere(nod*& r);
void expresie(nod*& r);

void expresie(nod*& r)
{
    nod*p;
    termen(r);
    p = r;
    while( C == '+' || C == '-' )
    {
        r = new nod;
        r->info = C;
        r->st = p;
        termen( r->dr );
        p = r;
    }
}

void termen(nod*& r)
{
    nod*p;
    factor(r);
    p = r;
    while( C == '*' || C == '/' )
    {
        r = new nod;
        r->info = C;
        r->st = p;
        factor( r->dr );
        p = r;
    }
}

void factor(nod*& r)
{
    nod*p;
    putere(r);
    p = r;
    if( i < n )
      urm();
    while( C == '^' )
    {
        r = new nod;
        r->info = C;
        r->st = p;
        putere( r->dr );
        p = r;
        if( i < n )
         urm();
    }
}

void putere(nod* &r)
{
    urm();
    if( C == '(' )
        expresie(r);
    else
    {
        r = new nod;
        r->info = C;
        r->nr = numar();
        r->st = NULL;
        r->dr = NULL;
    }
}

int SDR(nod *r)
{
    if( r->st == NULL && r->dr == NULL )
        return r->nr;
    else
    {
        int x,y;

        x = SDR(r->st);
        y = SDR(r->dr);

        switch(r->info)
        {
           case '+': return x+y;
           case '-': return x-y;
           case '*': return x*y;
           case '/': return x/y;
           case '^': return expo(x,y);
        }
    }
    return 0;
}

int main()
{
    f>>e;
    n = strlen(e)-1;
    expresie(rad);

    g<<SDR(rad);
    return 0;
}