写一段代码,实现已知命题公式求真值表。 输入格式: 第一行为命题公式中的命题符号个数; 第二行为命题公式。 说明: 1.公式中的命题符号不会超过4个,且从A开始依次命名; 2.公式计算顺序为先计算括号内,括号内不会出现括号,然后依次从左到右计算; 3.逻辑连接词非为!,与为^,或为+,蕴涵为>,等价为-。 输出格式: 真值表。
时间: 2024-03-06 14:51:43 浏览: 107
怎样计算命题公式的真值
3星 · 编辑精心推荐
以下是一份实现已知命题公式求真值表的 C 代码:
```c
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#define MAX_N 4
int n;
char formula[100];
bool values[MAX_N];
int get_value(char c) {
return c - 'A';
}
bool calculate(bool a, bool b, char op) {
switch (op) {
case '+': return a || b;
case '^': return a && b;
case '>': return !a || b;
case '-': return a == b;
case '!': return !a;
}
return false;
}
bool evaluate(int pos, int end) {
if (pos == end) {
return values[get_value(formula[pos])];
}
if (formula[pos] == '!') {
return !evaluate(pos + 1, end);
}
int depth = 0;
bool a, b;
for (int i = pos; i <= end; i++) {
if (formula[i] == '(') depth++;
else if (formula[i] == ')') depth--;
else if (depth == 0 && (formula[i] == '+' || formula[i] == '^' || formula[i] == '>' || formula[i] == '-')) {
a = evaluate(pos, i - 1);
b = evaluate(i + 1, end);
return calculate(a, b, formula[i]);
}
}
return evaluate(pos + 1, end - 1);
}
void print_table() {
int rows = (int)pow(2, n);
printf("|");
for (int i = 0; i < n; i++) {
printf(" %c |", 'A' + i);
}
printf(" %s |\n", formula);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < n; j++) {
values[j] = (i >> (n - j - 1)) & 1;
printf("| %c |", values[j] ? 'T' : 'F');
}
printf(" %c |\n", evaluate(0, strlen(formula) - 1) ? 'T' : 'F');
}
}
int main() {
scanf("%d", &n);
scanf("%s", formula);
print_table();
return 0;
}
```
该代码使用递归方法计算命题公式的真值。首先,根据公式中的每个命题符号,生成一个二进制数列,以列的形式输出真值表。然后,对于每一行,根据二进制数列设置命题符号的真值,并计算整个公式的真值,最后以行的形式输出。
阅读全文