用c语言写一个可以算出主析取范式与主合去范式
时间: 2024-05-03 17:21:48 浏览: 114
计算主合取范式,主析取范式
以下是一个简单的用C语言写的程序,可以计算主析取范式和主合取范式。
```
#include <stdio.h>
#include <string.h>
#define MAX_TERMS 20
#define MAX_VARS 26
int main(void) {
char terms[MAX_TERMS][MAX_VARS + 1];
int num_terms = 0;
int num_vars = 0;
int values[MAX_VARS];
// 输入布尔表达式
printf("请输入布尔表达式:");
char input[100];
fgets(input, 100, stdin);
input[strcspn(input, "\n")] = '\0';
// 分离出每个项
char *term = strtok(input, "+");
while (term != NULL) {
strcpy(terms[num_terms], term);
num_terms++;
term = strtok(NULL, "+");
}
// 确定变量的数量
for (int i = 0; i < num_terms; i++) {
for (int j = 0; j < strlen(terms[i]); j++) {
if (terms[i][j] >= 'A' && terms[i][j] <= 'Z') {
int var_index = terms[i][j] - 'A';
if (var_index >= num_vars) {
num_vars = var_index + 1;
}
}
}
}
// 输入每个变量的取值
for (int i = 0; i < num_vars; i++) {
printf("请输入 %c 的取值(0 或 1):", 'A' + i);
scanf("%d", &values[i]);
}
// 计算主析取范式
printf("主析取范式为:");
for (int i = 0; i < num_terms; i++) {
int is_true = 1;
for (int j = 0; j < strlen(terms[i]); j++) {
if (terms[i][j] >= 'A' && terms[i][j] <= 'Z') {
int var_index = terms[i][j] - 'A';
if (values[var_index] == 0) {
is_true = 0;
break;
}
}
}
if (is_true) {
printf("%s", terms[i]);
if (i < num_terms - 1) {
printf(" ∨ ");
}
}
}
printf("\n");
// 计算主合取范式
printf("主合取范式为:");
for (int i = 0; i < num_vars; i++) {
if (values[i] == 0) {
printf("(%c ∨ ", 'A' + i);
} else {
printf("(¬%c ∨ ", 'A' + i);
}
}
for (int i = 0; i < num_terms; i++) {
int is_false = 1;
for (int j = 0; j < strlen(terms[i]); j++) {
if (terms[i][j] >= 'A' && terms[i][j] <= 'Z') {
int var_index = terms[i][j] - 'A';
if (values[var_index] == 1) {
is_false = 0;
break;
}
}
}
if (is_false) {
printf("%s", terms[i]);
if (i < num_terms - 1) {
printf(" ∧ ");
}
}
}
for (int i = 0; i < num_vars; i++) {
printf(")");
}
printf("\n");
return 0;
}
```
这个程序首先会让用户输入一个布尔表达式,然后分离出每个项。接着,程序会确定表达式中使用了哪些变量,并让用户输入每个变量的取值。然后,程序会计算主析取范式和主合取范式,并输出结果。
例如,如果用户输入的表达式为 `A'B'C + AB'C'`,程序会输出如下结果:
```
请输入布尔表达式:A'B'C + AB'C'
请输入 A 的取值(0 或 1):1
请输入 B 的取值(0 或 1):0
请输入 C 的取值(0 或 1):1
主析取范式为:A'B'C
主合取范式为:(A ∨ ¬B ∨ ¬C) ∧ (¬A ∨ B ∨ ¬C) ∧ (¬A ∨ ¬B ∨ C)
```
阅读全文