一个逻辑表达式如果对于其变元的任一种取值都为真,则称为重言式;反之,如果对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一个程序,通过真值表判别一个逻辑表达式属于上述哪一类。基本要求: (1) 逻辑表达式从终端输入,长度不超过一行。逻辑运算符包括 "|","&" 和 "~",分别表示或、 与和非,运算优先程度递增,但可由括号改变,即括号内的运算优先。逻辑变元 为大写字母。表达式中任何地方都可以含有多个空格符。 (2) 若是重言式或矛盾式,可以只显示"True forever",或"False forever",否则显示 "Satisfactible" 以及变量名序列,与用户交互。若用户对表达式中变元取定一组值,程序就求出并显示逻辑表达式的值。 测试数据: (1) (A|~A)&(B|~B) (2) (A&~A)&C (3) A|B|C|D|E|~A (4) A&B&C&~B (5) (A|B)&(A|~B) (6) A&~B|~A&B;O ,0;0,1;1,0;1,1 。 给出C的实现
时间: 2024-02-13 20:07:40 浏览: 21
以下是一个简单的 C 代码实现,可以实现基本要求的功能:
```
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int is_var(char c) {
return c >= 'A' && c <= 'Z';
}
int eval(char* expr, int* values) {
int len = strlen(expr);
int stack[MAX_LEN], top = 0;
for (int i = 0; i < len; i++) {
if (expr[i] == ' ') {
continue;
} else if (is_var(expr[i])) {
stack[top++] = values[expr[i] - 'A'];
} else if (expr[i] == '~') {
int a = stack[--top];
stack[top++] = !a;
} else if (expr[i] == '&') {
int a = stack[--top], b = stack[--top];
stack[top++] = a && b;
} else if (expr[i] == '|') {
int a = stack[--top], b = stack[--top];
stack[top++] = a || b;
}
}
return stack[0];
}
int is_tautology(char* expr) {
int values[26] = {0};
int len = strlen(expr);
for (int i = 0; i < (1 << 26); i++) {
for (int j = 0; j < 26; j++) {
values[j] = (i & (1 << j)) ? 1 : 0;
}
if (!eval(expr, values)) {
return 0;
}
}
return 1;
}
int is_contradiction(char* expr) {
int values[26] = {0};
int len = strlen(expr);
for (int i = 0; i < (1 << 26); i++) {
for (int j = 0; j < 26; j++) {
values[j] = (i & (1 << j)) ? 1 : 0;
}
if (eval(expr, values)) {
return 0;
}
}
return 1;
}
int main() {
char expr[MAX_LEN];
printf("Input an expression: ");
fgets(expr, MAX_LEN, stdin);
int len = strlen(expr);
if (expr[len - 1] == '\n') {
expr[len - 1] = '\0';
}
if (is_tautology(expr)) {
printf("True forever\n");
} else if (is_contradiction(expr)) {
printf("False forever\n");
} else {
printf("Satisfactible\n");
int num_vars = 0;
for (int i = 0; i < len; i++) {
if (is_var(expr[i]) && !strchr(expr + i + 1, expr[i])) {
printf("%c ", expr[i]);
num_vars++;
}
}
printf("\n");
printf("Input values for %d variables (0/1): ", num_vars);
int values[26], j = 0;
for (int i = 0; i < num_vars; i++) {
scanf("%d", &values[j++]);
}
printf("Result: %d\n", eval(expr, values));
}
return 0;
}
```
程序通过 `is_tautology` 和 `is_contradiction` 函数来判断表达式是否为重言式或矛盾式,如果不是,则输出变量名序列并提示用户输入变量值,最后输出表达式的值。其中 `eval` 函数用于计算表达式的值,`is_var` 函数用于判断字符是否为变量名。需要注意的一点是,在输入变量值时,变量名序列的顺序与输入的顺序应该一致。