Cod sursa(job #2949083)

Utilizator andreea_chivuAndreea Chivu andreea_chivu Data 29 noiembrie 2022 18:09:19
Problema Bool Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 1004

char a[NMAX];
bool t[30];

bool calc_or();
bool calc_and();
bool factor();

int p = 0;

bool calc_or(){
		bool rez = calc_and();
		while(a[p] == '|'){
				p++;
				rez = (calc_and() || rez);
		}
		return rez;
}

bool calc_and(){
		bool rez = factor();
		while(a[p] == '&'){
				p++;
				rez = (factor() && rez);
		}
		return rez;
}

bool factor(){
		bool semn = true;
		bool val;
		while(a[p] == '!'){
				semn = (!semn);
				p++;
		}
		if(a[p] == '('){
				p++;
				val = calc_or();
				p++;
				if(semn == false){
					val = (!val);
				}
				return val;
		}
		val = t[a[p] - 'A'];
		if(semn == false){
				val = (!val);
		}
		return val;
}

int main() {
    ifstream fin("bool.in");
    ofstream fout("bool.out");

    int nc = 0;
    char ch;
    char ant;
    fin.get(ch);
    a[nc++] = ch;
    ant = ch;
    fin.get(ch);
    while(ch != '\n') {
        if(ch != ' ') {
            if('A' <= ch && ch <= 'Z') {
                if(ch == 'D') {
                    if(ant == 'N') { //suntem intr-o structura de tip &
                        a[nc - 2] = '&';
                        nc = nc - 1;
                    }else{
											a[nc++] = ch;
                    }
                } else if(ch == 'R') {
                    if(ant == 'O') {
                        a[nc - 1] = '|';
                        nc = nc;
                    }else{
											a[nc++] = ch;
                    }
                } else if(ch == 'T') {
                    if(ant == 'O') {
                        a[nc - 2] = '!';
                        nc = nc - 1;
                    }else{
												a[nc++] = ch;
                    }
                } else if(ch == 'E') {
                    if(ant == 'U') {
                        a[nc - 3] = '1';
                        nc = nc - 2;
                    } else if(ant == 'S') {
                        a[nc - 3] = '0';
                        nc = nc - 2;
                    }else{
												a[nc++] = ch;
                    }
                }else{
										a[nc++] = ch;
                }
            } else {
                a[nc++] = ch;
            }
        }
        ant = ch;
        fin.get(ch);
    }

    /*for(int i = 0; i < nc; i++) {
        fout << a[i];
    }
    */

		int n;
    fin >> n;
    fin.get(ch);//am citit \n
    for(int i = 0; i < n; i++){
				fin.get(ch);
				t[ch - 'A'] = !t[ch - 'A'];
				fout << calc_or();
    }

    fin.close();
    fout.close();
    return 0;
}