Cod sursa(job #2105608)

Utilizator dariastanescuDaria Stanescu dariastanescu Data 13 ianuarie 2018 18:50:22
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

char s[1001],ch;
short n,i;
bool ok[91];
bool si();
bool nu();

bool sau()
{
    bool r;
    r=si();
    while(s[i]=='|')
    {
        i++;
        r=r|si();
    }
    return r;
}
bool si()
{
    bool r;
    r=nu();
    while(s[i]=='&')
    {
        i++;
        r=r&nu();
    }
    return r;
}
bool nu()
{
    bool r;
    r=0;
    if(s[i]=='!')
    {
        i++;
        r=!nu();
    }
    if(s[i]=='(')
    {
        i++;
        r=sau();
        i++;
    }
    else if(s[i]>='A' && s[i]<='Z') {r=ok[int(s[i])]; i++;}
    else if(s[i]=='0') {r=0; i++;}
    else if(s[i]=='1') {r=1; i++;}
    return r;
}
int main()
{
    for(i=65;i<=90;++i) ok[i]=0;
    f.getline(s,1001);
    i=0;
    while(i<strlen(s))
    {
        if(s[i]==' ')strcpy(s+i,s+i+1);
        if(s[i]=='A' && s[i+1]=='N')
        {
            strcpy(s+i,s+i+2);
            s[i]='&';
        }
        if(s[i]=='N' && s[i+1]=='O')
        {
            strcpy(s+i,s+i+2);
            s[i]='!';
        }
        if(s[i]=='O' && s[i+1]=='R')
        {
            strcpy(s+i,s+i+1);
            s[i]='|';
        }
        if(s[i]=='T' && s[i+1]=='R')
        {
            strcpy(s+i,s+i+3);
            s[i]='1';
        }
        if(s[i]=='F' && s[i+1]=='A')
        {
            strcpy(s+i,s+i+4);
            s[i]='0';
        }
        i++;
    }
    f>>n;
    //g<<s<<endl;
    for(short j=1;j<=n;++j)
    {
        f>>ch;
        ok[int(ch)]=!ok[int(ch)];
        i=0;
        g<<sau();
    }
  return 0;
}