Cod sursa(job #2305557)

Utilizator driver71528@gmail.comTerec Andrei-Sorin [email protected] Data 20 decembrie 2018 16:12:00
Problema Bool Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cassert>
#define OR 'o'
#define AND 'a'
#define NOT 'n'
#define TRUE 't'
#define FALSE 'f'
using namespace std;

bool var[27];
char s[1003],*p;
char op[]={OR,AND};
int k,n;
char rez[101];

void creare(char s[],char S[])
{
    int i=0;
    while(S[i])
    {
        if(S[i]==' ')
        {
            i++;continue;
        }
        if(strchr("()",S[i]))
            s[k++]=S[i++];
        else
            if(isalpha(S[i+1]))
                switch(S[i])
                {
                    case 'A':s[k++]=AND,i+=3;break;
                    case 'O':s[k++]=OR,i+=2;break;
                    case 'N':s[k++]=NOT,i+=3;break;
                    case 'T':s[k++]=TRUE,i+=4;break;
                    case 'F':s[k++]=FALSE,i+=5;
                }
            else
                s[k++]=S[i++];
    }
    s[k]=NULL;
}

bool eval(bool a,char o,bool b)
{
    switch(o)
    {
        case AND: return a&&b;
        case OR: return a||b;
    }
    assert(0);
}

bool expr(int lev=0)
{
    bool x;
    if(lev==2)
    {
        if(*p==NOT)
            p++,x=(!expr(lev));
        else
            if(*p=='(')
                p++,x=expr(0),p++;
            else
                if(*p==TRUE)
                    x=true;
                else
                    if(*p==FALSE)
                        x=false;
                    else
                        x=var[*p-'A'],p++;
    }
    else
        for(x=expr(lev+1);op[lev]==*p;)
        {
            char s=*p++;
            x=eval(x,s,expr(lev+1));
        }
    return x;
}


int main()
{
    char S[1003];
    ifstream f("bool.in");
    ofstream g("bool.out");
    f.getline(S,1002);
    creare(s,S);
    f>>n>>rez;
    f.close();

    for(int i=0;i<n;i++)
    {
        var[rez[i]-'A']=!var[rez[i]-'A'];
        p=s;
        g<<expr();
    }
    g.close();
    return 0;
}