Cod sursa(job #2836769)

Utilizator monicab_Balan Monica monicab_ Data 20 ianuarie 2022 21:01:57
Problema Bool Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
ifstream in("bool.in");
ofstream out("bool.out");
 
char s[1001];
char aux[1001];
int p=0;
bool EvalTermen();
bool EvalFactor();
bool EvalExpresie()
{
    bool vala=EvalTermen();
    while(s[p]=='|')
    {
        p++;
        bool valb=EvalTermen();
        vala|=valb;
    }
    return vala;
}
bool EvalTermen()
{
    bool vala=EvalFactor();
    while(s[p]=='&')
    {
        p++;
        bool valb=EvalFactor();
        vala&=valb;
    }
    return vala;
}
bool EvalFactor()
{
    bool semn=0;
    while(s[p]=='!')
    {
        semn=!semn;
        p++;
    }
    if(s[p]=='(')
    {
        p++;
        bool val=EvalExpresie();
        p++;
        if(semn==1)
            return !val;
        else
            return val;
    }
    bool val=0;
    if(s[p]=='0')
        val=0;
    if(s[p]=='1')
        val=1;
    p++;
    if(semn==1)
        return !val;
    else
        return val;
}
void modificare(char s1[],char s2[])
{
    char *pp=strstr(s,s1);
    while(pp!=NULL)
    {
        strcpy(aux,pp+strlen(s1));
        strcpy(pp,s2);
        strcat(s,aux);
        pp=strstr(pp+strlen(s2),s1);
    }
}
void modificaretotala()
{
    modificare("AND","&");
    modificare("OR","|");
    modificare("NOT","!");
    modificare("FALSE","0");
    modificare("TRUE","1");
}
int main()
{
    in.getline(s,1001);
    int lungime=strlen(s);
    int i=0;
    while(i<lungime)
    {
        if(s[i]==' ')
        {
            for(int j=i+1;j<=lungime;j++)
                s[j-1]=s[j];
            lungime--;
        }
        else
            i++;
    }
    modificaretotala();
    int modif;
    in>>modif;
    int f[100];
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]>='A' && s[i]<='Z')
        {
            f[s[i]-'A']=i;
            s[i]='0';
        }
        //cout<<s[i];
    }
    for(int i=1;i<=modif;i++)
    {
        char ch;
        in>>ch;
        int indice=ch-'A';
        if(s[f[indice]]=='0')
            s[f[indice]]='1';
        else
            s[f[indice]]='0';
        modificaretotala();
        out<<EvalExpresie();
        p=0;
    }
    return 0;
}