Pagini recente » Monitorul de evaluare | Cod sursa (job #1602730) | Cod sursa (job #1716686) | Cod sursa (job #2901307) | Cod sursa (job #1749053)
/*
* 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;
}