Pagini recente » Cod sursa (job #1435592) | Cod sursa (job #981110) | Cod sursa (job #2609952) | Cod sursa (job #907137) | Cod sursa (job #887742)
Cod sursa(job #887742)
/* Pentru a rezolva problema avem nevoie de trei functi si un vector de tip char ce trebuie sa aiba cel putin 100000 de poziti.
Vom lucra cu un pointer ce va creste mereu cand trecem peste un caracter din sir.
In functia evaluator vom efectua doar operatiile cu + si - cu termeni.
Consideram termen tot ce este intre doua semne + sau -, adica daca intalnim *,/ sau ( le vom trata separat
Pana ce ajungem din nou la + sau - si astfel formam un termen.
Daca intalnim mai multe cifre pe poziti consecutive in sir atunci vom calcula numarul in functia numar
Daca intalnim semnul ( calculam valoarea parantezei pentru a rezuma totul la un numar
*/
#include<fstream>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
#define N 100005
char expresie[N];
char *p=expresie;
int termen();
int numar();
int evaluator()
{
long long r=termen();
while(*p=='+' || *p=='-')
{
if(*p=='+')
{
p++;
r+=termen();
}
else
{
p++;
r-=termen();
}
}
return r;
}
int termen()
{
long long r=numar();
while(*p=='*' || *p=='/')
{
if(*p=='*')
{
p++;
r*=numar();
}
else
{
p++;
r/=numar();
}
}
return r;
}
int numar()
{
long long r=0;
if(*p=='(')
{
p++;
r=evaluator();
p++;
}
else while(*p>='0' && *p<='9')
{
r=r*10+(*p-'0');
p++;
}
return r;
}
int main()
{
in.get(expresie,100005);// citim tot sirul
out << evaluator();//apelam functia evaluator si afisam rezultatul
in.close();
out.close();
// Sper ca ati inteles :D
}