Cod sursa(job #1314831)

Utilizator cella.florescuCella Florescu cella.florescu Data 12 ianuarie 2015 14:17:27
Problema Evaluarea unei expresii Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>
#include <stdlib.h>
char first;
int Expr(), Term(), Fact(), Int();
FILE *fin, *fout;

int Expr(){// Expr() este functia care analizeaza o expresie aritmetica
  int val=Term();// expresia este formata din termeni, pe care ii citim conform gramaticii
  while(first=='+' || first=='-'){
    if(first=='+'){// ajustam rezultatul conform semnelor
      first=fgetc(fin);
      val+=Term();
    } else{
      first=fgetc(fin);
      val-=Term();
    }
  }
  return val;// si returnam valoarea finala
}

int Term(){// Term() este functia pentru termeni
  int val=Fact();// fiecare termen, conform gramaticii, este alcatuit din mai multi factori
  while(first=='*' || first=='/'){
    if(first=='*'){// schimbam valoarea in conformitate cu semnul citit
      first=fgetc(fin);
      val*=Fact();
    } else{
      first=fgetc(fin);
      val/=Fact();
    }
  }
  return val;
}

int Fact(){// Fact() este functia pentru factori
  int val;// un factor poate sa fie un numar intreg (daca are semn in fata lui, se va reapela functia)
  if('0'<=first && first<='9')// sau o subexpresie aritmetica
    val=Int();// cazul in care avem un numar fara semn
  else if(first=='+' || first=='-'){// cazul in care este un semn in fata factorului
    if(first=='+'){// semnul plus
      first=fgetc(fin);
      val=Fact();
    } else{// sau minus
      first=fgetc(fin);
      val=-Fact();
    }
  } else if(first=='('){// sau cazul in care se continua cu o subexpresie
    first=fgetc(fin);
    val=Expr();// dupa evaluare, cursorul a ramas pe paranteza inchisa, asa ca putem trece peste acest
    first=fgetc(fin);// caracter
  }
  return val;
}

int Int(){// functia Int() returneaza numarul format din cifrele 0, 1, 2, ... , 9
  int val=0;
  while('0'<=first && first<='9'){
    val=10*val+first-'0';
    first=fgetc(fin);
  }
  return val;
}

int main()
{
  fin=fopen("expr.in", "r");
  first=fgetc(fin);
  fout=fopen("expr.out", "w");
  fprintf(fout, "%d\n", Expr());//afisam rezultatul
  fclose(fin);
  fclose(fout);
  return 0;
}