Cod sursa(job #1749053)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 27 august 2016 19:23:08
Problema Bool Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
/*
 * Se va folosi recursivitatea indirecta in rezolvarea problemei.
 * Vom observa ca orice expresie este "impartita" in urmatoarele componente:
 * 1) termeni ai unei adunari, separati de '+' sau '-'
 * 2) factori ai unui produs, separati de '*' sau '/'
 * 3) subexpresii, incadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
 * Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara intoarcerea in cazul (1)
 * si implicit a necesitatii recursivitatii indirecte.
 */

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int modif, p = 0;
string S, M;
vector<bool> vals(26, false);
bool and_eval();
bool not_eval();
bool factor();
ifstream infile;
ofstream outfile;

string termen() {
    string sol;
    if (p == S.length())
        return sol;
    int save = p;
    if (S[p] == '(') {
        sol += S[p];
        return sol;
    }
    while (p < S.length() && S[p] >= 'A' && S[p] <= 'Z') {
        sol += S[p];
        ++ p;
    }

    p = save;
    return sol;
}

bool or_eval() {
    bool r = and_eval();

    while (termen() == "OR") {
        p += 3;
        r |= and_eval();
        break;
    }

    return r;
}
/*
* Functia termen() se ocupa de continutul unui termen. Acesta este compus la randul
* lui din factori inmultiti.
*/
bool and_eval() {
    bool r = not_eval();
    while (termen() == "AND") {
        p += 4;
        r &= not_eval();
        break;
    }

    return r;
}

bool not_eval() {
    bool r;
    if (termen() == "NOT") {
        p += 4;
        r = !factor();
    }
    else r = factor();

    return r;
}

bool factor() {
    bool r;
    if (termen() == "(") {
        p ++;
        r = or_eval();
        p ++;
    } else if (termen() == "TRUE") {
        r = true;
        p += 4;
    } else if (termen() == "FALSE") {
        r = false;
        p += 5;
    } else {
        int val = (int)S[p] - 65;
        r = vals[val];
        p ++;
    }

    while (p < S.length() && S[p] == ' ' || S[p] == ')')
        ++ p;

    return r;
}

int main() {
    infile.open("bool.in");
	outfile.open("bool.out");
    getline(infile, S);
    cout << S << endl;
    infile >> modif;
    cout << modif << endl;
    char ch;
    for (int i = 0; i < modif; i ++) {
        infile >> ch;
        M.push_back(ch);
    }
    cout << M << endl;

    for (int i = 0; i < modif; i ++) {
        int val = (int)M[i] - 65;
        vals[val] = !vals[val];
        for (int i = 0; i < 26; i ++)
            cout << vals[i];
        cout << endl;
        outfile << or_eval();
        p = 0;
    }
    return 0;
}