Pagini recente » Cod sursa (job #147421) | Cod sursa (job #1032872) | Cod sursa (job #2793907) | Cod sursa (job #2694251) | Cod sursa (job #3148777)
#include <bits/stdc++.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
const int N = 100010;
char s[N];/// sirul de caractere continand expresia
int p;/// pozitia la care ma gasesc in s[]
int numar(),paranteza(),factor(),termen(),expresie();
int main()
{
f>>s;
g<<expresie();
return 0;
}
int numar()
{
/// p pozitionat pe prima cifra numarului
int nr=0;///valoarea numarului
while(isdigit(s[p]))
{
nr=10*nr+s[p]-'0';/// adaug cifra corespunzatoare lui s[p] la finalul nr
p++;///trec la caracterul urmator
}
/// p pozitionat dupa ultima cifra a numarului
/// nr = numarul dorit
return nr;
}
int paranteza()
{
/// p se afla pe pozitia caracterului '(' la care se deschide paranteza
p++;/// mut cursorul la dreapta - am intrat in paranteza - trebuie sa evaluez expresia din paranteza
int nr=expresie();/// se evalueaza expresia din paranteza < este treaba functiei expresie sa faca asta>
/// dupa evaluare p se va gasi la finalul expresiei unde gaseste caracterul ')' care inchide paranteza
p++;///mut cursorul la dreapta - p ajunge pe pozitia de dupa intreaga paranteza
/// nr = valoare situata in paranteza
return nr;
}
int factor()
{
if(s[p]=='(')
return paranteza();
return numar();
}
int termen()
{
int nr=factor();
while(s[p]=='*' || s[p]=='/')
{
if(s[p]=='*'){p++;nr*=factor();}
else{p++;nr/=factor();}
}
return nr;
}
int expresie()
{
int nr=termen();
while(s[p]=='+' || s[p]=='-')
{
if(s[p]=='+'){p++;nr+=termen();}
else{p++;nr-=termen();}
}
return nr;
}