Cod sursa(job #1816743)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 26 noiembrie 2016 20:42:07
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include<string.h>
#include<cstdio>
#include<ctype.h>
using namespace std;
char v[1005],sec[1005],sec2[1005];
int i,n,p;
void var(char c){
  for(i=0;i<n;i++){
    if(sec2[i]==c)
      sec[i]=1-sec[i];
  }
}
int expresie();
int factor();
int expresie(){
  int rez=factor(),termeni;
  while(sec[p]=='&' || sec[p]=='|'){
    if(sec[p]=='&'){
      p++;
      termeni=factor();
      if(rez==1 && termeni==1)
        rez=1;
      else
        rez=0;
    }
    else{
      p++;
      termeni=factor();
      if(rez==0 && termeni==0)
        rez=0;
      else
        rez=1;
    }
  }
  return rez;
}
int factor(){
  int val=0,semn=1;
  while(sec[p]=='!'){
    semn=1-semn;
  }
  if(sec[p]=='('){
    p++;
    val=expresie();
    p++;
    return semn*val;
  }
  val=sec[p];
  return semn*val;
}
int main()
{
    FILE*fin,*fout;
    char c;
    fin=fopen("bool.in","r");
    fgets(v,1002,fin);
    int j=0,m,rezultat;
    n=strlen(v);
    n--;
    for(i=0;i<n;i++){
      if(v[i]=='A' && v[i+1]=='N'){
        sec2[j]=sec[j]='&';
        j++;
        i+=2;
      }
      else{
        if(v[i]=='O' && v[i+1]=='R'){
          sec2[j]=sec[j]='|';
          j++;
          i++;
        }
        else{
          if(v[i]=='N' && v[i+1]=='O'){
            sec2[j]=sec[j]='!';
            j++;
            i+=2;
          }
          else{
            if(v[i]=='T' && v[i+1]=='R'){
              sec2[j]=sec[j]=1;
              j++;
              i+=3;
            }
            else{
              if(v[i]=='F' && v[i+1]=='A'){
                sec2[j]=sec[j]=0;
                j++;
                i+=4;
              }
              else{
                if(v[i]!=' '){
                  sec2[j]=v[i];
                  if(isalpha(v[i]))
                    sec[j]=0;
                  else
                    sec[j]=v[i];
                  j++;
                }
              }
            }
          }
        }
      }
    }
    fscanf(fin,"%d ",&m);
    fout=fopen("bool.out","w");
    int k;
    for(k=0;k<m;k++){
      c=fgetc(fin);
      var(c);
      rezultat=expresie();
      fprintf(fout,"%d",rezultat);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}