Cod sursa(job #1826526)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 10 decembrie 2016 16:01:41
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <iostream>
#include<string.h>
#include<cstdio>
#include<ctype.h>
using namespace std;
char v[1005],sec[1005];
int litere[26];
int i=0,n,p;
int expresie();
int termen();
int factor();
int expresie(){
    int val=termen();
    while(sec[i]=='|'){
      i++;
      val=val|termen();
    }
    return val;
}

int termen(){
    int val=factor();
    while(sec[i]=='&'){
      i++;
      val=val&factor();
    }
    return val;
}

int factor(){
    int val=0;
    if(sec[i]=='!'){
        i++;
        return !factor();
    }
    if(sec[i]=='('){
        i++;
        val=expresie();
        i++;
        return val;
    }
    if(sec[i]=='1'){
        i++;
        return 1;
    }
    if(sec[i]=='0'){
        i++;
        return 0;
    }
    i++;
    return litere[sec[i-1]-'A'];
}
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'){
        sec[j]='&';
        j++;
        i+=2;
      }
      else{
        if(v[i]=='O' && v[i+1]=='R'){
          sec[j]='|';
          j++;
          i++;
        }
        else{
          if(v[i]=='N' && v[i+1]=='O'){
            sec[j]='!';
            j++;
            i+=2;
          }
          else{
            if(v[i]=='T' && v[i+1]=='R'){
              sec[j]=1;
              j++;
              i+=3;
            }
            else{
              if(v[i]=='F' && v[i+1]=='A'){
                sec[j]=0;
                j++;
                i+=4;
              }
              else{
                if(v[i]!=' '){
                  sec[j]=v[i];
                  j++;
                }
              }
            }
          }
        }
      }
    }
    fscanf(fin,"%d ",&m);
    fout=fopen("bool.out","w");
    for(j=0;j<m;j++){
      c=fgetc(fin);
      litere[c-'A']=1-litere[c-'A'];
      i=0;
      rezultat=expresie();
      fprintf(fout,"%d",rezultat);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}