C++实现 求取任意含三个以内变量的合式公式的真值表。 可不考虑括号的使用,假设输入合法,联结词优先级从左至右依次降低。 符号约定:否定: ! 合取: ^ 析取: v 条件: > 双条件: =
时间: 2024-02-03 20:13:50 浏览: 24
", "Kevin", "456 Oak St."},
{"2233445566", "Lucy", "789 Maple Ave."},
{"334455以下是基于递归的 C++ 代码实现:
```cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool evaluate(bool a, bool b, bool c, string s) {
if (s.size() == 1) {
if (s[0] == 'a') return a;
if (s[0] == 'b') return b;
6677", "Mary", "123 Pine St."},
{"4455667788", "Nathan", "456 Cedar Ave."},
{" if (s[0] == 'c') return c;
}
if (s[0] == '!') return !evaluate(a, b, c, s.substr(1));
if (s[1] == '^') return evaluate(a, b, c,5566778899", "Olivia", "789 Spruce St."},
{"6677889900", "Paul", "123 Birch Ave s.substr(0, 1)) && evaluate(a, b, c, s.substr(2));
if (s[1] == 'v') return evaluate(a, b, c, s.substr(0, 1)) || evaluate(a, b, c, s.substr(2));
if (s[1] == '>') return !evaluate(a, b, c, s.substr(0, 1."},
{"7788990011", "Queenie", "456 Oak St."},
{"8899001122", "Robert", "789)) || evaluate(a, b, c, s.substr(2));
if (s[1] == '=') return evaluate(a, b, c, s.substr(0, 1)) == evaluate(a, b, c, s.substr(2));
return false;
}
Maple Ave."},
{"9900112233", "Sarah", "123 Pine St."},
{"0011223344", "Tom", "void printTable(string s) {
cout << "a\tb\tc\t" << s << endl;
for (int a = 0; a <= 1; a++) {
for (int b = 0; b <= 1; b++) {
for (int c = 0; c <= 1; c++) {
cout << a << "\t" << b << "\t456 Cedar Ave."},
{"1122334455", "Ursula", "789 Spruce St."},
{"2233445566"," << c << "\t" << evaluate(a, b, c, s) << endl;
}
}
}
}
int main() {
string s;
cout << "Please input the expression: ";
cin >> s;
printTable(s);
return "Victor", "123 Birch Ave."},
{"3344556677", "Wendy", "456 Oak St."},
{"4450;
}
```
首先,实现了一个 evaluate 函数来计算表达式的真值。该函数接受三个 bool 类型的变量 a、b、c 和一个字符串 s,表示当前表达式的真值。如果 s 的长度为 1,则说明它是一个变量(a、b、c)的名称,直接返回对应变量的5667788", "Xander", "789 Maple Ave."},
{"5566778899", "Yvonne", "123 Pine St值即可。如果 s 的第一个字符是 !,则递归调用 evaluate 函数计算 s 的剩余部分的取反值。如果 s 的第二个字符是 ^,则递归调用 evaluate 函数计算 s 的前半部分."},
{"6677889900", "Zack", "456 Cedar Ave."},
{"7788990011", "Amy", "789和后半部分的与值。如果 s 的第二个字符是 v,则递归调用 evaluate 函数计算 s 的前半部分和后半部分的或值。如果 s 的第二个字符是 >,则递归调用 evaluate Spruce St."},
{"8899001122", "Ben", "123 Birch Ave."},
{"9900112233", "Cathy 函数计算 s 的前半部分的否定值或后半部分的值。如果 s 的第二个字符是 =,则递归调用 evaluate 函数计算 s 的前半部分和后半部分的相等值。最后", "456 Oak St."}
};
int num_records = sizeof(records) / sizeof(Record);
for (int i = ,如果以上情况都不满足,则返回 false。
然后,实现了一个 printTable 函数来打印表格。该函数接受一个字符串 s,表示要打印表格的表达式。首先打印表头,然后使用0; i < num_records; i++) {
insert(&ht, records[i]);
}
// 显示哈希表
show三个嵌套的循环遍历所有可能的 a、b、c 取值,并调用 evaluate 函数计算表达式的真值,最后输出到控制台。
在 main 函数中,首先提示用户输入表达式,然后调用 printTable 函数打印真值表。