Cod sursa(job #1322143)

Utilizator VictorDumitrescuDumitrescu Victor VictorDumitrescu Data 19 ianuarie 2015 20:00:06
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
FILE *f, *g;
using namespace std;
/*
A AND ((B OR NOT C) OR ((TRUE)))

A&((B|!C)|((1)))

ABCA -> 1110
*/
int k=0;
char v2[1001],v[1001],p;
bool valori[26];
void procesare(){
    int j=0, i=0;
    while(j<=k){
        int ok=0;
        if(v[j]==' '){
            j++;
            ok=1;
        }
        else if(v[j]=='('){
            v2[i]='(';
            j++;
            i++;
            ok=1;
        }
        else if(v[j]==')'){
            v2[i]=')';
            j++;
            i++;
            ok=1;
        }
        else if(v[j]=='A'&& v[j+1]=='N'){
            v2[i]='&';
            j+=3;
            i++;
            ok=1;
        }
        else if(v[j]=='O' && v[j+1]=='R'){
            v2[i]='|';
            j+=2;
            i++;
            ok=1;
        }
        else if(v[j]=='N'&& v[j+1]=='O'){
            v2[i]='!';
            j+=3;
            i++;
            ok=1;
        }
        else if(v[j]=='T'&& v[j+1]=='R'){
            v2[i]='1';
            j+=4;
            i++;
            ok=1;
        }
        else if(v[j]=='F'&& v[j+1]=='A'){
            v2[i]='0';
            j+=5;
            i++;
            ok=1;
        }
        //if(ok==0)
        else {
            v2[i]=v[j];
            j++;
            i++;
        }
    }
        return;
}

bool expresie();
bool termen();
bool factor();

bool expresie(){
    bool rez = termen();
    while(v2[p] == '|'){
        p++;
        rez = (rez || termen());
        /*
        if(rez == 1 || termen() == 1){
            rez=1;
        }else rez=0;
        */
    }
    return rez;
}

bool termen(){
    bool rez2 = factor();
    while(v2[p] == '&'){
        p++;
        if(rez2 == 1 && factor() == 1){
            rez2 = 1;
        }else rez2 = 0;
    }
    return rez2;
}

bool factor(){
    bool val,semn=1;
    while(v2[p] == '!'){
        p++;
        semn=(!semn);
    }
    if(v2[p] == '('){
        p++;
        val=expresie();
        p++;
        if(!semn) return !val;
        return val;
        /*
        if(semn==1){
            return val;
        }else return !val;
        */
    }
    if (!semn) return (!valori[v2[p]-'A']);
    return valori[v2[p]-'A'];
}


int main()
{   int n, i;
    char c;
    f=fopen("bool.in","r");
    g=fopen("bool.out","w");
    while(c!='\n'){
        c=fgetc(f);
        if(c!='\n'){
            v[k]=c;
            k++;
        }
    }
    procesare();
    fscanf(f,"%d\n",&n);
    for(i=1;i<=n;i++){
        c=fgetc(f);
        valori[c-'A']=!valori[c-'A'];
        fprintf(g,"%d",expresie());
    }
    fprintf(g,"\n");
    fclose(f);
    fclose(g);
    return 0;
}