Cod sursa(job #2791002)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 29 octombrie 2021 22:29:29
Problema Evaluarea unei expresii Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXLENGTH 100000
#define MAXNR 50000
/// Ultima era sursa gresita

char s[MAXLENGTH];
int si;
int v[MAXNR],iv,io;
char o[MAXNR];

int priority(char c){
  if(c == '+' || c == '-')
    return 1;
  if(c == '*' || c == '/')
    return 2;
  if(c == '(')
    return -1;
  return 0;
}

int factor(){
  int r=0;

  while(s[si] >= '0' && s[si] <= '9'){
    r *= 10;
    r += s[si] - '0';
    si++;
  }

  return r;
}

int calcul(int a, int b, char semn){
  if(semn == '+')
    return a+b;
  if(semn == '-')
    return b-a;
  if(semn == '*')
    return a*b;
  return b/a;
}

void computeTop(){
  int a, b;
  char semn;

  a = v[iv - 1];
  b = v[iv - 2];
  semn = o[io - 1];

  v[iv - 2] = calcul(a,b,semn);
  iv --;
  io --;
}

int main(){
  FILE *fin, *fout;
  int n,i;

  fin = fopen("evaluare.in","r");
  si = 0;
  s[0] = fgetc(fin);

  while(s[si] != '\n'){
    si++;
    s[si] = fgetc(fin);
  }
  n = si;
  si = 0;
  fclose(fin);

  iv=0;
  io=0;
  while(si < n){
    if(s[si] >= '0' && s[si] <= '9'){
      v[iv] = factor();
      iv ++;

    } else if(s[si] == '('){
      o[io] = '(';
      io++;
      si++;

    } else if(s[si] == ')'){
      while(o[io-1] != '(')
        computeTop();
      io--;
      si++;

    } else if(priority(s[si]) != 0){
      while(io > 0 && priority(o[io-1]) >= priority(s[si]))
        computeTop();

      o[io] = s[si];
      io++;
      si++;
    } else
      si++;

//    printf("V: ");
//    for(i=0;i<iv;i++)
//      printf("%d ",v[i]);
//    printf("\nO: ");
//    for(i=0;i<io;i++)
//      printf("%c ",o[i]);
//    printf("\n\n");
  }

  while(io > 0)
    computeTop();

//  printf("V: ");
//  for(i=0;i<iv;i++)
//    printf("%d ",v[i]);
//  printf("\nO: ");
//  for(i=0;i<io;i++)
//    printf("%c ",o[i]);
//  printf("\n\n");

  fout = fopen("evaluare.out","w");
  fprintf(fout,"%d\n",v[0]);
  fclose(fout);
  return 0;
}