Cod sursa(job #1573425)

Utilizator AndreiFlorescuAndrei Florescu AndreiFlorescu Data 19 ianuarie 2016 18:00:29
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include <fstream>

#define MAX_N 1000

using namespace std;

char sir[MAX_N + 1];
bool valoare[26];
short int n;
int cntr = 0, poz;

int expresie();
int termen();
int factor();
int trans();
void push(int, char, int);

int expresie() {
    int rasp = termen();

    while (sir[poz] == '|') {
        poz++;
        rasp |= termen();
    }
    return rasp;
}

int termen() {
    int rasp = factor();

    while (sir[poz] == '&') {
        poz++;
        rasp &= factor();
    }
    return rasp;
}

int factor() {
    int rasp = 0;

    if (sir[poz] >= 'A' && sir[poz] <= 'Z') {
        return valoare[sir[poz++] - 'A'];
    } else if (sir[poz] == '0') {
        poz++;
        return 0;
    } else if (sir[poz] == '1') {
        poz++;
        return 1;
    } else if (sir[poz] == '(') {
        poz++;
        return expresie();
        poz++;
    } else if (sir[poz] == '!') {
        poz++;
        return !factor();
    }
}

void push (int *i, char c, int lungime) {
    sir[cntr++] = c;
    (*i) += lungime;
}

int trans() {
    for (int i = 0; sir[i] != '\0'; i++) {

        if (sir[i] == 'A') {                 // AND
            if(sir[i + 1] == 'N') {
                push(&i, '&', 2);
            } else {
                push(&i, 'A', 0);
            }
        } else if (sir[i] == 'O') {          // OR
            if(sir[i + 1] == 'R') {
                push(&i, '|', 1);
            } else {
                push(&i, 'O', 0);
            }
        } else if (sir[i] == 'N') {            // NOT
            if (sir[i + 1] == 'O') {
                push(&i, '!', 2);
            } else {
                push(&i, 'N', 0);
            }
        } else if (sir[i] == 'T') {            // TRUE
            if (sir[i + 1] == 'R') {
                push(&i, '1', 3);
            } else {
                push(&i, 'T', 0);
            }
        } else if (sir[i] == 'F') {            // FALSE
            if (sir[i + 1] == 'A') {
                push(&i, '0', 4);
            } else {
                push(&i, 'F', 0);
            }
        } else if (sir[i] != ' ') {
            push(&i, sir[i], 0);
        }
    }
    sir[cntr] = '\0';
}

int main()
{
    ifstream file_in ("bool.in");
    ofstream file_out ("bool.out");

    int rasp, temp;
    char c;

    /// Citirea datelor
    file_in.getline(sir, 1002);
    file_in >> n;

    /// Calcularea solutiei + Afisarea solutiei
        // Transformarea sirului
    trans();
    //cout << sir;
    for (int i = 0; i < n; i++) {
        file_in >> c;
        valoare[c - 'A'] = !valoare[c - 'A'];
        poz = 0;
        file_out << expresie();
    }

    return 0;
}