Cod sursa(job #1823619)

Utilizator sabinantonSabin Anton sabinanton Data 6 decembrie 2016 17:45:47
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
const int N=10001;
int n,p=0,d=0;
bool v[N];
char c[N],s[N],schimb;
bool exp();
bool fact();
void simplificare()
{

    for(int p=0; p<n; p++)
    {

        if(c[p]=='A'&&c[p+1]=='N'&&c[p+2]=='D')
        {
            s[d]='&';
            p+=2;
            d++;
        }
        else if(c[p]=='O'&&c[p+1]=='R')
        {
            s[d]='|';
            p+=1;
            d++;
        }
        else if(c[p]=='N'&&c[p+1]=='O'&&c[p+2]=='T')
        {
            s[d]='!';
            p+=2;
            d++;
        }
        else if(c[p]=='T'&&c[p+1]=='R'&&c[p+2]=='U'&&c[p+3]=='E')
        {
            s[d]='1';
            p+=3;
            d++;
        }
        else if(c[p]=='F'&&c[p+1]=='A'&&c[p+2]=='L'&&c[p+3]=='S'&&c[p+4]=='E')
        {
            s[d]='0';
            p+=4;
            d++;
        }
        else if(c[p]!=' ')
        {
            s[d]=c[p];
            d++;
        }
    }
    p=0;
}
bool exp()
{

    bool rez;
    rez=fact();
    while(s[p]=='&'||s[p]=='|'||s[p]=='!')
    {
        if(s[p]=='&')
        {
            p++;
            rez=(rez&&fact());
        }
        else if(s[p]=='|')
        {
            p++;
            rez=(rez||fact());
        }
        else if(s[p]=='!')
        {
            p++;
            rez=!rez;
        }
    }
    return rez;
}
bool fact()
{
    bool val;

    if(s[p]=='(')
    {
        p++;
        val=exp();
        p++;
        return val;
    }
    if(isdigit(s[p]))
    {
        val=(bool)(s[p]-'0');
    }
    else if(schimb==s[p])
    {

        v[s[p]]=!v[s[p]];
        val=v[s[p]];
    }
    else
    {
        val=v[s[p]];
    }

    return val;


}
int main()
{
    int i,len;
    fin.getline(c,N);
    n=strlen(c);
    simplificare();
    fin>>len;
    for(i=1; i<=len; i++)
    {
        fin>>schimb;
        fout<<exp();
    }
    return 0;
}