Cod sursa(job #2791001)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 29 octombrie 2021 22:27:41
Problema Evaluarea unei expresii Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <stdio.h>
#include <stdlib.h>
#define LMAX 100000

int s[LMAX],si,v[LMAX/2];
int nrf;

void kelement(int begin, int end){
  int b = begin, e = end, pivot = v[(begin + end)/2], aux;

  while(v[b] < pivot)
    b++;
  while(v[e] > pivot)
    e--;

  while(b<e){
    aux = v[b];
    v[b] = v[e];
    v[e] = aux;

    do{
      b++;
    } while(v[b] < pivot);

    do{
      e--;
    } while(v[e] > pivot);
  }

  if(begin < e)
    kelement (begin, e);
  if(e + 1 < end)
    kelement (e + 1, end);
}

int secvmax();
int mediana();

int factor(){
  int semn = 1,r = 0;

  if(s[si] == '-'){
    semn = -1;
    si++;
  }

  if(s[si] == '('){
    si ++;
    r = secvmax();

  } else if(s[si] == '['){
    si ++;
    r = mediana();

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

    if(s[si] == ',')
      si++;
  }

  return r * semn;
}

int secvmax(){
  int t,sum,smax;

  smax = 0;
  sum = 0;

  while(s[si] != ')'){
    t = factor();
    if(sum < 0)
      sum = t;
    else
      sum += t;

    if(sum > smax)
      smax = sum;
  }

  si ++;
  return smax;
}

int mediana(){
  int i,k;

  i=0;
  while(s[si] != ']'){
    v[i] = factor();
    i++;
  }

  si++;
  k = (i+1)/2;

//  for(int j=0;j<i;j++)
//    printf("%d ",v[j]);
//  printf("\n");

  kelement(0,i-1);

//  for(int j=0;j<i;j++)
//    printf("%d ",v[j]);
//  printf("\n");

  return v[k-1];
}

int adunare(){
  int sum,r;
  sum = 0;

  while(s[si] != '\n'){
    r = factor();
    sum += r;
  }

  return sum;
}

int main(){
  FILE *fin, *fout;
  nrf = 0;

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

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

  fout = fopen("expresie2.out","w");
  fprintf(fout,"%d\n%d\n",nrf,adunare());
  fclose(fout);
  return 0;
}