Cod sursa(job #1692163)

Utilizator marioviperconstantin mario marioviper Data 20 aprilie 2016 12:12:56
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
char s[1008],a[1008];
bool v[30];
int expresie();
int termen();
int factor();
int poz=1;
int main()
{   int n;
    in.getline(s+1,1008);
    in>>n;
    in.get();
    in.getline(a+1,1008);
    int ok=0;
    for(int i=1;s[i];i++)
    {
        if(s[i]=='T'&&s[i+1]=='R'){s[++ok]='1';i=i+3;}
        else if(s[i]=='F'&&s[i+1]=='A'){s[++ok]='0';i=i+4;}
        else if(s[i]=='O'&&s[i+1]=='R'){s[++ok]='|';i=i+1;}
        else if(s[i]=='A'&&s[i+1]=='N'){s[++ok]='&';i=i+2;}
        else if(s[i]=='N'&&s[i+1]=='O'){s[++ok]='!';i=i+2;}
        else if(s[i]!=' ')s[++ok]=s[i];

    }
    s[++ok]='\0';
    for(int i=1;a[i];i++)
    {
        v[a[i]-'A']=!v[a[i]-'A'];
        poz=1;
        out<<expresie();
    }
    return 0;
}
int expresie()
{
    bool ans=termen();
    while(s[poz]=='|')
    {
        ++poz;
        bool act=termen();
        ans=ans||act;
    }
    return ans;
}
int termen()
{
     bool ans=factor();
    while(s[poz]=='&')
    {
        ++poz;
        bool act=factor();
        ans=ans&&act;
    }
    return ans;
}
int factor ()
{    int ans;
    if(s[poz]=='!')
    {
        ++poz;
        ans=factor();
        return !ans;
    }
    if(s[poz]=='(')
    {
        ++poz;
        ans=expresie();
        ++poz;
        return ans;
    }
    if(s[poz]=='1'){
        ++poz;
        return 1;
    }
    if(s[poz]=='0'){
        ++poz;
        return 0;
    }
    ans=v[s[poz]-'A'];
    ++poz;
    return ans;
}