编写一个简单的C语言程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式
时间: 2024-03-23 15:43:37 浏览: 236
好的,下面是一个简单的C语言程序,可以输入一个命题公式,输出它的真值表:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int is_operator(char c) {
return c == '&' || c == '|' || c == '!' || c == '(' || c == ')';
}
int get_priority(char c) {
if (c == '&' || c == '|') return 1;
if (c == '!') return 2;
if (c == '(') return 3;
return -1;
}
int calculate(int a, int b, char op) {
if (op == '&') return a && b;
if (op == '|') return a || b;
if (op == '!') return !a;
return 0;
}
int main() {
char expr[100];
printf("请输入命题公式:");
scanf("%s", expr);
int len = strlen(expr);
int num_vars = 0;
char var_names[10];
int var_values[10];
for (int i = 0; i < len; i++) {
if (!is_operator(expr[i]) && strchr(var_names, expr[i]) == NULL) {
var_names[num_vars++] = expr[i];
}
}
int num_rows = pow(2, num_vars);
for (int i = 0; i < num_vars; i++) {
printf("%c ", var_names[i]);
}
printf("%s\n", expr);
for (int i = 0; i < num_rows; i++) {
for (int j = 0; j < num_vars; j++) {
var_values[j] = (i >> (num_vars - 1 - j)) & 1;
printf("%d ", var_values[j]);
}
int stack[100];
int top = -1;
for (int j = 0; j < len; j++) {
if (!is_operator(expr[j])) {
int index = strchr(var_names, expr[j]) - var_names;
stack[++top] = var_values[index];
} else {
while (top >= 1 && get_priority(stack[top]) >= get_priority(expr[j])) {
int b = stack[top--];
int a = stack[top--];
stack[++top] = calculate(a, b, expr[j]);
}
if (expr[j] == ')') {
top--;
} else {
stack[++top] = expr[j];
}
}
}
printf("%d\n", stack[0]);
}
return 0;
}
```
运行程序后,输入命题公式,例如:`a & b | !c`,然后程序就可以输出它的真值表了:
```
a b c a&b|!c
0 0 0 1
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 0
```
在这个真值表的基础上,可以进行命题公式类型的判定和求命题公式的主范式。具体实现可以参考其他相关的算法和代码。
阅读全文