Pagini recente » Cod sursa (job #1116632) | Cod sursa (job #2948976) | Cod sursa (job #992568) | Cod sursa (job #3153543) | Cod sursa (job #2017421)
#include <cstdio>
#include <iostream>
using namespace std;
FILE *in,*out;
const int nmax = 100000;
char exp[nmax+ 3];
char curchar;
int pointer;
void readnextchar() {
curchar = exp[pointer];
pointer++;
}
int integer(int answer = 0) {
if('0' <= curchar && curchar <= '9') {
int digit = curchar - '0';
readnextchar();
return integer(answer * 10 + digit);
} else
return answer;
}
int suma(int answer = 0, char op = '+');
int factor() {
int answer = 0;
if(curchar == '(') {
readnextchar();
answer = suma();
readnextchar();
} else
answer = integer();
return answer;
}
//Suma = Prod +/- Prod +/- Prod + Prod + ...
//Prod = Factor */ Factor */ Factor
//Factor = Integer, (Suma)
int prod(int answer = 1, char op = '*') {
//ordine implementarii:
if(op == '*')
answer *= factor();
else if(op == '/')
answer /= factor();
if(curchar == '*' || curchar == '/') {
char savechar = curchar;
readnextchar();
return prod(answer, savechar);
} else
return answer;
}
// 1) te ocupi de asociativitatea de la stanga la dreapta
// 2) te ocupi de gramatica
int main() {
in = fopen("evaluare.in","r");
out = fopen("evaluare.out","w");
fgets(exp, nmax + 3, in);
//cout<<exp;
readnextchar();
fprintf(out,"%d",suma());
return 0;
}
int suma(int answer, char op) {
if(op == '+')
answer += prod();
else if(op == '-')
answer -= prod();
if(curchar == '+' || curchar == '-'){
char savechar = curchar;
readnextchar();
return suma(answer,savechar);
} else
return answer;
}