Cod sursa(job #2700955)

Utilizator seburebu111Mustata Dumtru Sebastian seburebu111 Data 29 ianuarie 2021 13:16:50
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>
#include <cstring>
#include <iostream>

using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");

const int N =102;
const int LE = 1002;
const int NL = 26;

char s[LE];
char op[N];
bool f[NL];
int p;

void transformm()
{
    int nr=0, i=0;
    while(s[i] != '\0')
    {
        if(s[i]== 'T' && s[i+1]=='R')
        {
            s[nr++]='1';
            i+=4;
        }else
        if(s[i]== 'F' && s[i+1]=='A')
        {
            s[nr++]='0';
            i+=5;
        }else
        if(s[i]== 'N' && s[i+1]=='O')
        {
            s[nr++]='!';
            i+=3;
        }else
        if(s[i]== 'A' && s[i+1]=='N')
        {
            s[nr++]='&';
            i+=3;
        }else
        if(s[i]== 'O' && s[i+1]=='R')
        {
            s[nr++]='|';
            i+=2;
        }else
        if(s[i]== '(')
        {
            s[nr++]='(';
            i+=1;
        }else
        if(s[i]!=' ')
        {
            s[nr++]=s[i++];
        }else
        {
            i++;
        }
    }
    s[nr]='\0';
}

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


bool expresie()
{
    bool sau = termen();
    while(s[p]=='|')
    {
        p++;//trece peste |
        sau = (sau || termen());
    }
    return sau;
}


bool termen()
{
    bool andd = factor();
    while(s[p]=='&')
    {
        p++;//trece peste &
        andd = (andd && factor());
    }
    return andd;
}

bool factor()
{
    bool nott =false, v;
    while(s[p]=='!')
    {
        p++;//trece peste !
        nott=(!nott);
    }
    if(s[p]=='(')
    {
        p++;//trece peste (
        v=expresie();
        p++;//trece peste )
        if(nott)
        {
            return !v;
        }
        return v;
    }
    if(s[p]=='0')
    {
        p++;
        v = false;
    }
    else if(s[p]=='1')
    {
        p++;
        v = true;
    }
    else
    {
        v=f[s[p++]-'A'];
    }

    if(nott)
    {
        return !v;
    }
    return v;
}


int main()
{
    fin.getline(s, LE);
    transformm();
    cout<<s;
    int n;
    fin>>n>>op;
    for(int i=0; i<n; i++)
    {
        f[op[i] - 'A'] = (!f[op[i] - 'A']);
        p=0;
        fout<<expresie();
    }
    return 0;
}