求命题公式的真值表 问题描述: 给出一个命题公式,列出其真值表 输入说明: 命题变元及命题常元均用大写字母表示,用 !、+、*、-、= 分别表示非、合取、析取、条件、双条件联结词。 输出说明: 第一行为所有命题变元、命题常元和命题公式,之间用空格隔开,所有命题常元和命题变元按字典序排列。第二行开始为不同的真值指派及在该指派下命题公式的真值,同行的真值之间用空格隔开,真用T表示,假用F表示。真值指派按升序排列。 输入样例: 样例1: !A 样例2: A+B 输出样例: 样例1: A !A F T T F 样例2: A B A+B F F F F T F T F F T T T 用c++代码的形式表达
时间: 2024-02-27 15:51:56 浏览: 240
以下是一个简单的 C++ 代码,可以实现命题公式的真值表:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
bool eval(string expr, vector<pair<char, bool>> values) {
for (auto& v : values) {
size_t pos = expr.find(v.first);
while (pos != string::npos) {
expr.replace(pos, 1, v.second ? "T" : "F");
pos = expr.find(v.first, pos + 1);
}
}
while (true) {
size_t pos = expr.find("!");
if (pos == string::npos) break;
expr.replace(pos, 2, (expr[pos + 1] == 'T') ? "F" : "T");
}
while (true) {
size_t pos = expr.find("*");
if (pos == string::npos) break;
bool left = (expr[pos - 1] == 'T');
bool right = (expr[pos + 1] == 'T');
expr.replace(pos - 1, 3, left && right ? "T" : "F");
}
while (true) {
size_t pos = expr.find("+");
if (pos == string::npos) break;
bool left = (expr[pos - 1] == 'T');
bool right = (expr[pos + 1] == 'T');
expr.replace(pos - 1, 3, left || right ? "T" : "F");
}
while (true) {
size_t pos = expr.find("-");
if (pos == string::npos) break;
bool left = (expr[pos - 1] == 'T');
bool right = (expr[pos + 1] == 'T');
expr.replace(pos - 1, 4, !left || right ? "T" : "F");
}
while (true) {
size_t pos = expr.find("=");
if (pos == string::npos) break;
bool left = (expr[pos - 1] == 'T');
bool right = (expr[pos + 1] == 'T');
expr.replace(pos - 1, 3, left == right ? "T" : "F");
}
return expr == "T";
}
int main() {
string expr;
cin >> expr;
vector<char> vars;
for (char c : expr) {
if (isupper(c)) {
if (find(vars.begin(), vars.end(), c) == vars.end()) {
vars.push_back(c);
}
}
}
sort(vars.begin(), vars.end());
cout << expr << " ";
for (char c : vars) {
cout << c << " ";
}
cout << endl;
vector<pair<char, bool>> values;
for (int i = 0; i < pow(2, vars.size()); i++) {
for (int j = 0; j < vars.size(); j++) {
values.push_back(make_pair(vars[j], ((i >> j) & 1) == 1));
}
for (auto& v : values) {
cout << (v.second ? "T" : "F") << " ";
}
cout << (eval(expr, values) ? "T" : "F") << endl;
values.clear();
}
return 0;
}
```
该程序从标准输入读取一个命题公式,然后输出该命题公式的真值表。首先,程序提取所有的命题变元并将它们按字典序排序。然后,程序生成所有可能的真值指派,并计算在每个真值指派下命题公式的真值。最后,程序输出真值表。
阅读全文