Cod sursa(job #2788979)

Utilizator Mihai.MocanuMihai mmm Mihai.Mocanu Data 26 octombrie 2021 18:58:22
Problema Bool Scor 70
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#include <stdlib.h>
#define LEXP 1000

char v[LEXP];
char v2[256];
FILE *fin,*fout;
int Index;

int Citire(){
  int i;
  char a,b;
  i=0;
  a=fgetc(fin);
  b=0;
  while(a!='\n' && b!='\n'){
    if(a!=' '){
      if(a==')' || a=='('){
        v[i]=a;
        i++;
      }else{
        b=fgetc(fin);
        if(b==' ' || b==')' || b=='(' || b=='\n'){
          v[i]=a;
          i++;
          if(b==')' || b=='('){
            v[i]=b;
            i++;
          }
        }else{
          switch(a){
            case 'N':{
              v[i]='!';
              i++;
              fgetc(fin);
              break;
            }
            case 'A':{
              v[i]='&';
              i++;
              fgetc(fin);
              break;
            }
            case 'O':{
              v[i]='|';
              i++;
              break;
            }
            case 'T':{
              v[i]=1;
              i++;
              fgetc(fin);
              fgetc(fin);
              break;
            }
            case 'F':{
              v[i]=0;
              i++;
              fgetc(fin);
              fgetc(fin);
              break;
            }
          }
        }
      }
    }
    if(b!='\n'){
      a=fgetc(fin);
    }
  }
  return i;
}

int Or();

int Factor(){
  int num;

  if(v[Index]=='('){
    Index++;
    num=Or();
    Index++;
  }else{
    num=0;
    if(v[Index]==0 || v[Index]==1){
      num=v[Index];
    }else{
      num=v2[v[Index]];
    }
    Index++;
  }
  return num;
}

int Not(){
  int rez;

  if(v[Index]=='!'){
    Index++;
    rez=1-Factor();
  }else{
    rez=Factor();
  }
  return rez;
}

int And(){
  int rez;

  rez=Not();
  while(v[Index]=='&'){
    Index++;
    rez*=Not();
  }
  return rez;
}

int Or(){
  int rez,x;

  rez=And();
  while(v[Index]=='|'){
    Index++;
    x=And();
    if(x+rez>=1){
      rez=1;
    }
  }
  return rez;
}

int main(){
  int n,m,i;
  char a;
  fin=fopen("bool.in","r");
  fout=fopen("bool.out","w");

  n=Citire();
  fscanf(fin,"%d ",&m);

  for(i=0;i<m;i++){
    a=fgetc(fin);
    v2[a]=1-v2[a];
    Index=0;
    fprintf(fout,"%d",Or());
  }

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