Pagini recente » Cod sursa (job #1741067) | Cod sursa (job #527886) | Cod sursa (job #1067034) | Cod sursa (job #2959037) | Cod sursa (job #1979227)
#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;
}