Pagini recente » Cod sursa (job #58683) | Cod sursa (job #1882363) | Cod sursa (job #1908010) | Cod sursa (job #806327) | Cod sursa (job #1000688)
#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;
}