C++ 编程实现用真值表法求取任意含三个以内变量的合式公式的主析取范式和主合取范式
时间: 2023-12-07 11:07:01 浏览: 122
以下是用C++编程实现用真值表法求取任意含三个以内变量的主析取范式和主合取范式的代码:
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
// 计算真值表
vector<vector<bool>> truthTable(int n) {
int rows = pow(2, n);
vector<vector<bool>> table(rows, vector<bool>(n));
for (int i = 0; i < rows; i++) {
for (int j = 0; j < n; j++) {
table[i][j] = (i / static_cast<int>(pow(2, j))) % 2;
}
}
return table;
}
// 计算主析取范式
string mDNF(vector<vector<bool>> table) {
string res;
int n = table[0].size();
for (int i = 0; i < table.size(); i++) {
if (table[i][n - 1]) {
string term;
for (int j = 0; j < n - 1; j++) {
if (table[i][j]) {
term += ('A' + j);
} else {
term += ('!' + to_string(j));
}
term += "&";
}
term.pop_back(); // 去除最后一个"&"
res += ("(" + term + ")|");
}
}
res.pop_back(); // 去除最后一个"|"
return res;
}
// 计算主合取范式
string mCNF(vector<vector<bool>> table) {
string res;
int n = table[0].size();
for (int i = 0; i < table.size(); i++) {
if (!table[i][n - 1]) {
string term;
for (int j = 0; j < n - 1; j++) {
if (!table[i][j]) {
term += ('A' + j);
} else {
term += ('!' + to_string(j));
}
term += "|";
}
term.pop_back(); // 去除最后一个"|"
res += ("(" + term + ")&");
}
}
res.pop_back(); // 去除最后一个"&"
return res;
}
int main() {
int n;
cout << "请输入变量数(不超过3):";
cin >> n;
vector<vector<bool>> table = truthTable(n);
cout << "真值表:" << endl;
for (int i = 0; i < table.size(); i++) {
for (int j = 0; j < n; j++) {
cout << table[i][j] << " ";
}
cout << endl;
}
cout << "主析取范式:" << mDNF(table) << endl;
cout << "主合取范式:" << mCNF(table) << endl;
return 0;
}
```
运行程序,输入变量数(不超过3),程序将输出真值表、主析取范式和主合取范式。例如,当输入2时,输出结果为:
```
请输入变量数(不超过3):2
真值表:
0 0
0 1
1 0
1 1
主析取范式:(!0&!1)|(0&!1)
主合取范式:(0|1)&(!0|1)&(0|!1)
```
阅读全文