Cod sursa(job #1324238)

Utilizator cristinamateiCristina Matei cristinamatei Data 21 ianuarie 2015 23:40:22
Problema Bool Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <fstream>

using namespace std;

char s[1001];
int nrc, p;
bool lit[28];

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

int expresie();
int termen();
int factor();

int factor()
{
    int semn = 0;
    if ( s[p] == '!' )
    {
        p++;
        semn = 1;
    }
    int val=lit[ s[p] -'A' + 1 ];
    if ( s[p] == '1' )
    {
        p++;
        if ( semn == 1 )
            return 0;
        return 1;
    }
    if ( s[p] == '0' )
    {
        p++;
        if ( semn == 1 )
            return 1;
        return 0;
    }
    if ( semn == 1 )
        val = !val;
    if ( val == true )
        return 1;
    return 0;

}

int termen()
{
    int val = factor();
    if ( s[p] == '&' )
    {
        p++;
        if ( val == factor() )
            return 1;
        return 0;
    }
    return val;
}

int expresie()
{
    int val = termen();
    if ( s[p] == '|' )
    {
        p++;
        if ( val == 1 )
            return 1;
        if ( termen() == 1 )
            return 1;
        return 0;
    }
    return val;
}

int main()
{
    char x;
    int n, i;
    x = in.get();
    while ( x != '\n' )
    {
        s[nrc] = x;
        x = in.get();
        if ( s[nrc] == 'A' && x == 'N' )
        {
            s[nrc] = '&';
            in.get();
            x = in.get();
        }
        if ( s[nrc] == 'O' && x == 'R' )
        {
            s[nrc] = '|';
            x = in.get();
        }
        if ( s[nrc] == 'N' && x == 'O' )
        {
            s[nrc] = '!';
            in.get(); // trec de T
            x = in.get();
        }
        if ( s[nrc] == 'T' && x == 'R' )
        {
            s[nrc] = '1';
            in.get(); // trece de U
            in.get(); // trece de E
            x = in.get();
        }
        if ( s[nrc] == 'F' && x == 'A' )
        {
            s[nrc] = '0';
            in.get(); // trec de L
            in.get(); // trec de S
            in.get(); // trec de E
            x = in.get();
        }
        nrc++;
        if ( x == ' ' )
            x = in.get();
    }
    in >> n;
    in.get();
    for ( i = 1; i <= n; i++ )
    {
        x = in.get();
        if ( lit[x - 'A' + 1] == false )
            lit[x - 'A' + 1] = true;
        else lit[x - 'A' + 1] = false;
        p = 0;
        out << expresie();
    }
    return 0;
}