Cod sursa(job #1669310)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 30 martie 2016 17:14:53
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");
struct arb
{
    char info;
    int val;
    arb *st,*dr;
    arb()
    {
        this->st=NULL;
        this->dr=NULL;
    }
};

arb *rad;
int n,i,v[30];
char c,s[100];

inline void urm()
{
    c=s[i++];
}


void exp(arb *&r);
void termen(arb *&r);
void factor(arb *&r);

void exp(arb *&r)
{
    arb *p;
    termen(r);
    p=r;
    while(c=='+' || c=='-')
    {
        r=new arb;
        r->info=c;
        r->st=p;
        termen(r->dr);
        p=r;
    }
}
void termen(arb *&r)
{
    arb *p;
    factor(r);
    p=r;
    while(c=='*' || c=='/')
    {
        r=new arb;
        r->info=c;
        r->st=p;

        factor(r->dr);
        p=r;
    }
}
void factor(arb *&r)
{
    int nr=0;
    if(i<n)
        urm();
    if(c=='(')
       exp(r),urm();
    else
    {
    while(c<='9' && c>='0')
    {
        nr=nr*10+c-'0';
        urm();
    }
    r=new arb;
    r->val=nr;
    }
}
int sdr(arb *r)
{
    if(r->st!=NULL)
    {
        int a,b;
        a=sdr(r->st),b=sdr(r->dr);
        switch(r->info)
        {
        case '+':
                return a+b;
        case '-':
                return a-b;
        case '*':
                return a*b;
        case '/':
                return a/b;
        }
    }
    else
        return r->val;
}
int main()
{
    f.getline(s,100);
    n=strlen(s);
    exp(rad);
    g<<sdr(rad);
}