Cod sursa(job #3196124)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 22 ianuarie 2024 20:27:18
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char s[1002],l[1002],ch;
int q,j,k,i,n,fr[30];
bool expresie ();
bool termen ();
bool factor ();
bool expresie () ///or
{
    bool r=termen ();
    while (l[i]=='|')
    {
        i++;
        r=r||termen ();
    }
    return r;
}
bool termen () ///and
{
    bool r=factor ();
    while (l[i]=='&')
    {
        i++;
        r=r&&factor ();
    }
    return r;
}
bool factor () ///not,expresie,numar
{
    bool r,ok=0;
    if (l[i]=='!')
    {
        i++;
        ok=1;
    }
    if (l[i]>='A'&&l[i]<='Z')
        r=fr[l[i]-'A'+2];
    else if (l[i]=='0'||l[i]=='1')
        r=fr[l[i]-'0'];
    else
    {
        i++;
        r=expresie ();
        i++;
    }
    if (ok==1)
        r=1-r;
    return r;
}
int main ()
{
    fin.getline (s,1000);
    fin>>q;
    n=strlen (s);
    for (i=0; i<n; i++)
    {
        if (s[i]>='A'&&s[i]<='Z'&&(s[i+1]==' '||s[i+1]==0))
        {
            l[++k]=s[i];
            i++;
        }
        else if (s[i]=='A'&&s[i+1]=='N')
        {
            l[++k]='&';
            i+=2;
        }
        else if (s[i]=='O'&&s[i+1]=='R')
        {
            l[++k]='|';
            i++;
        }
        else if (s[i]=='N'&&s[i+1]=='O')
        {
            l[++k]='!';
            i+=2;
        }
        else if (s[i]=='T'&&s[i+1]=='R')
        {
            l[++k]='1';
            i+=3;
        }
        else if (s[i]=='F'&&s[i+1]=='A')
        {
            l[++k]='0';
            i+=4;
        }
        else if (s[i]=='('||s[i]==')')
            l[++k]=s[i];
    }
    fr[1]=1;
    for (j=1; j<=q; j++)
    {
        i=1;
        fin>>ch;
        fr[ch-'A'+2]=1-fr[ch-'A'+2];
        fout<<expresie ();
    }
    return 0;
}