上机课作业:
输入表达式,输出主合取、主析取范式和真值表
简单粗暴,用真值表法。缺点是因为懒和不会,没有做输入表达式的部分,导致要改表达式只能通过改代码中的部分解决。
#include <iostream>
#include <string>
using namespace std;
class statement {
private:
int value;
public:
statement(int a) {
value = a;
}
void setv(int a) {
value = a;
}
int show() {
return value;
}
statement operator!();
statement operator*(statement &b);
statement operator+(statement &b);
statement operator>(statement &b);
};
statement statement::operator!() {
if (value == 1) {
value = 0;
} else {
value = 1;
}
return *this;
}
statement statement::operator*(statement &b) {
statement temp(0);
if (value == 1 && b.value == 1) {
temp.setv(1);
}
return temp;
}
statement statement::operator+(statement &b) {
statement temp(1);
if (value != 1 && b.value != 1) {
temp.setv(0);
}
return temp;
}
statement statement::operator>(statement &b) {
statement temp(1);
if (value == 1 && b.value != 1) {
temp.setv(0);
}
return temp;
}
statement f(statement P, statement Q, statement M) {
statement temp(0);
temp = (!P * Q ) > M ;
return temp;
}
int main() {
statement P(0);
statement Q(0);
statement M(0);
cout << "用!表示 否定" << endl;
cout << "用*表示 合取" << endl;
cout << "用+表示 析取" << endl;
cout << "用>表示 蕴含" << endl;
cout << endl;
statement a(0);
int a1 = 0;
int O[8] = {0, 0, 0, 0, 0, 0, 0, 0} ;
cout << "真值表如下:" << endl;
cout << "P Q M A" << endl;
for (int i = 0; i <= 1; i++) {
for (int j = 0; j <= 1; j++) {
for (int k = 0; k <= 1; k++) {
P.setv(i);
Q.setv(j);
M.setv(k);
a = f(P, Q, M);
a1++;
cout << P.show() << " " << Q.show() << " " << M.show() << " " << a.show() << endl;
O[a1 - 1] = a.show();
}
}
}
cout << "主析取范式为:";
for (int i = 0; i < 8; i++) {
if (O[i] == 0) {
cout << "M" << i << "+";
}
}
cout << "\b " << endl;
cout << "主合取范式为:";
for (int i = 0; i < 8; i++) {
if (O[i] == 1) {
cout << "M" << i << "*";
}
}
cout << "\b " << endl;
}