Cod sursa(job #2692280)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 2 ianuarie 2021 01:13:03
Problema Evaluarea unei expresii Scor 60
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <ctype.h>

FILE *fin, *fout;

int first;

int expr();
int term();
int fact();
int fgetint();

int expr(){
  int retval = term();
  
  while( first == '+' || first == '-' ){
    if( first == '+' ){
      first = fgetc(fin);
      retval += term();
    }else{
      first = fgetc(fin);
      retval -= term();
    }
  }

  return retval;
}

int term(){
  int retval = fact();
  
  while( first == '*' || first == '/' ){
    if( first == '*' ){
      first = fgetc(fin);
      retval *= term();
    }else{
      first = fgetc(fin);
      retval /= term();
    }
  }

  return retval;
}

int fact(){
  int retval;
  
  if( first == '(' ){
    first = fgetc(fin);
    retval = expr();
    first = fgetc(fin);
  }else
    retval = fgetint();

  return retval;
}

int fgetint(){
  int n = 0, semn = 1;

  if( first == '-' ){
    first = fgetc(fin);
    semn = -1;
  }

  while( isdigit(first) ){
    n = n * 10 + first - '0';
    first = fgetc(fin);
  }

  return n * semn;
}

int main(){
  fin  = fopen("evaluare.in",  "r");
  fout = fopen("evaluare.out", "w");

  first = fgetc(fin);
  fprintf(fout, "%d\n", expr());

  fclose(fin);
  fclose(fout);
  return 0;
}