Cod sursa(job #1000688)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 23 septembrie 2013 16:33:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<iostream>
#include<fstream>
#include<string.h>
#include<math.h>
using namespace std;

#define NMAX 100001
#define TYPE long

class Expresie {
	char c[NMAX],*p;
	TYPE x;
	public :
		Expresie ();
		void citeste(ifstream &);
		TYPE rez(TYPE);
		TYPE evalueaza();
		TYPE termen();
		TYPE put();
		TYPE factor();
};

Expresie :: Expresie ()
{
	p=c;
	x=0;
}

void Expresie :: citeste(ifstream &f)
{
	f.get(c,NMAX-1);
	p=c;
}

TYPE Expresie :: rez(TYPE val)
{
	x=val;
	return evalueaza();
}

TYPE Expresie :: evalueaza()
{
	TYPE r;
	r=termen();
	while(*p=='+' || *p=='-') 
		if(*p=='+') {
			p++;
			r=(TYPE)r+termen();
		}
		else {
			p++;
			r=(TYPE)r-termen();
		}
	return r;
}

TYPE Expresie :: termen()
{
	TYPE r;
	r=factor();
	while(*p=='*' || *p=='/') 
		if(*p=='*') {
			p++;
			r=(TYPE)r*put();
		}
		else {
			p++;
			r=(TYPE)r/put();
		}
	return r;
}

TYPE Expresie :: put()
{
	TYPE r;
	r=factor();
	while(*p=='^') {
		p++;
		r=pow(r,factor());
	}
	return r;
}

TYPE Expresie :: factor()
{
	TYPE r;
	if(*p=='(') {
		++p;
		r=evalueaza();
		++p;
	}
	else if(*p=='x') {
		r=x;
		p++;
	}
	else if(*p>='0' && *p<='9') {
		r=0;
		while(*p>='0' && *p<='9') {
			r=r*10+(*p)-'0';
			p++;
		}
	}
	else {
		while(*p!='(')
			p++;
		r=sin(evalueaza());
		p++;
	}
	return r;
}

int main ()
{
	Expresie S;
	ifstream f("evaluare.in");
	ofstream g("evaluare.out");
	S.citeste(f);
	f.close();
	g<<S.rez(4);
	g.close();
	return 0;
}