Cod sursa(job #2305571)

Utilizator driver71528@gmail.comTerec Andrei-Sorin [email protected] Data 20 decembrie 2018 16:30:58
Problema Bool Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 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);
    return true;
}

bool si();
bool negare();


bool expr()
{
    bool r=si();
    while(*p==OR)
    {
        p++;
        r= r || si();
    }
    return r;
}
bool si()
{
    bool r=negare();
    while(*p==AND)
    {
        p++;
        r=r && negare();
    }
    return r;
}
bool negare()
{
    bool r;
    if(*p=='(')
        p++,r=expr(),p++;
    else
        if(*p==NOT)
            p++,r=!negare();
        else
            if(*p==TRUE || *p==FALSE)
                return *p==TRUE;
            else
                r=var[*p-'A'];
    return r;
}

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;
}