Cod sursa(job #1823295)

Utilizator sabinantonSabin Anton sabinanton Data 6 decembrie 2016 10:20:44
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
const int N=1001;
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+1]=='A'&&c[p+2]=='N'&&c[p+3]=='D')
        {
            s[d]='&';
            p+=3;
            d++;
        }
        else if(c[p+1]=='O'&&c[p+2]=='R')
        {
            s[d]='|';
            p+=2;
            d++;
        }
        else if(c[p+1]=='N'&&c[p+2]=='O'&&c[p+3]=='T')
        {
            s[d]='!';
            p+=3;
            d++;
        }
        else if(c[p+1]=='T'&&c[p+2]=='R'&&c[p+3]=='U'&&c[p+4]=='E')
        {
            s[d]='1';
            p+=4;
            d++;
        }
        else if(c[p+1]=='F'&&c[p+2]=='A'&&c[p+3]=='L'&&c[p+4]=='S'&&c[p+5]=='E')
        {
            s[d]='0';
            p+=5;
            d++;
        }
        else if(c[p]!=' ')
        {
            s[d]=c[p];
            d++;
        }
    }
    p=0;
}
bool exp()
{
    bool 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++;
        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<=n;i++)
    {
    fin>>schimb;
    fout<<exp();
    }
    return 0;
}