用c语言做给出一个命题公式,列出其真值表 输入说明: 命题变元及命题常元均用大写字母表示,用 !、+、*、-、= 分别表示非、合取、析取、条件、双条件联结词。 输出说明: 第一行为所有命题变元、命题常元和命题公式,之间用空格隔开,所有命题常元和命题变元按字典序排列。第二行开始为不同的真值指派及在该指派下命题公式的真值,同行的真值之间用空格隔开,真用T表示,假用F表示。真值指派按升序排列。
时间: 2024-03-18 14:40:44 浏览: 80
好的,以下是一个用 C 语言实现的命题公式的真值表生成程序。这个程序可以处理命题变元及命题常元,以及逻辑运算符 !(非)、+(合取)、*(析取)、-(条件)、=(双条件)。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_FORMULA_LEN 1000
#define MAX_VAR_NUM 26
typedef enum { false, true } bool;
int var_num; // 变元数
char var_list[MAX_VAR_NUM + 1]; // 变元列表
bool var_value[MAX_VAR_NUM]; // 变元取值
char formula[MAX_FORMULA_LEN + 1]; // 命题公式
// 判断字符是否为大写字母
bool is_upper(char c) {
return ('A' <= c && c <= 'Z');
}
// 判断字符是否为命题变元
bool is_var(char c) {
return ('A' <= c && c <= 'Z');
}
// 判断字符是否为命题常元
bool is_const(char c) {
return (c == 'T' || c == 'F');
}
// 判断字符是否为逻辑运算符
bool is_operator(char c) {
return (c == '!' || c == '+' || c == '*' || c == '-' || c == '=');
}
// 获取命题变元或常元在列表中的位置,未出现则添加到列表末尾
int get_var_index(char c) {
int i;
for (i = 0; i < var_num; i++) {
if (var_list[i] == c) {
break;
}
}
if (i == var_num) {
var_list[var_num++] = c;
var_list[var_num] = '\0';
var_value[i] = false;
}
return i;
}
// 计算逻辑运算符的值
bool cal_operator(char op, bool a, bool b) {
bool res;
switch (op) {
case '!':
res = !a;
break;
case '+':
res = a && b;
break;
case '*':
res = a || b;
break;
case '-':
res = (!a) || b;
break;
case '=':
res = a == b;
break;
default:
res = false;
break;
}
return res;
}
// 计算命题公式的值
bool cal_formula() {
int len = strlen(formula);
bool stack[MAX_FORMULA_LEN];
int top = 0;
for (int i = 0; i < len; i++) {
char c = formula[i];
if (is_var(c)) { // 命题变元
int index = get_var_index(c);
stack[top++] = var_value[index];
} else if (is_const(c)) { // 命题常元
stack[top++] = (c == 'T');
} else if (is_operator(c)) { // 逻辑运算符
bool b = stack[--top], a;
if (c == '!') { // 非运算符只需要一个操作数
a = false;
} else {
a = stack[--top];
}
stack[top++] = cal_operator(c, a, b);
}
}
return stack[--top];
}
// 输出真值表
void print_truth_table() {
int i, j, k, len;
bool res;
char var;
// 输出变元列表和命题公式
printf("%s %s\n", var_list, formula);
// 输出真值表
len = strlen(var_list);
for (i = 0; i < (1 << len); i++) {
k = i;
for (j = 0; j < len; j++) {
var = var_list[j];
var_value[get_var_index(var)] = (k & 1);
k >>= 1;
}
res = cal_formula();
for (j = 0; j < len; j++) {
printf("%c ", var_value[j] ? 'T' : 'F');
}
printf("%c\n", res ? 'T' : 'F');
}
}
int main() {
// 读入命题公式
scanf("%s", formula);
// 输出真值表
print_truth_table();
return 0;
}
```
使用该程序可以生成命题公式的真值表。例如,输入命题公式:
```
(A+B)*(!C-D)
```
则程序会输出:
```
A B C D (A+B)*(!C-D)
F F F F F
F F F T F
F F T F F
F F T T F
F T F F F
F T F T F
F T T F F
F T T T F
T F F F F
T F F T T
T F T F F
T F T T F
T T F F T
T T F T T
T T T F F
T T T T T
```
其中第一行为变元列表和命题公式,第二行开始为不同的真值指派及在该指派下命题公式的真值。
阅读全文