Cod sursa(job #2017421)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 1 septembrie 2017 10:22:29
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#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;
}