Pagini recente » oni2011-scdtry | Cod sursa (job #2940343) | Cod sursa (job #3236540) | oni_2009_11-12_2 | Cod sursa (job #2875337)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <fstream>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100010], *p = s;
long evaluare();
long termen();
long factor()
{
long rez = 0;
if(*p == '(') //incepe o subexpresie care trebuie calculata apeland functia ce ia in considerare toate operatiile
{
p++; //sarim peste (
rez = evaluare();
p++; //sarim peste )
}
else{ //daca nu incepe o subexpresie, avem un singur numar ce trebuie construit
while(*p >= '0' && *p <= '9')
{
rez = rez*10 + (*p-'0');
p++;
}
}
return rez;
}
long termen()
{
long rez = factor(); //initializam rezultatul cu primul factor
while ( *p == '*' || *p == '/') //cautam toate * si / si inmultim/impartim cu rezultatul
{
if(*p == '*')
{
p++;
rez *= factor();
}
else {
p++;
rez /= factor();
}
}
return rez;
}
long evaluare()
{
long rez = termen(); //initializam rezultatul cu primul termen al adunarii/scaderii
while( *p == '+' || *p == '-') //cautam toate + si - si adunam/scadem termenii respectivi la rezultat
{
if(*p == '+')
{
p++;
rez += termen();
}
else{
p++;
rez -= termen();
}
}
return rez;
}
int main()
{
f>>s;
g<<evaluare();
return 0;
}