给定一个命题公式,求他的主析取范式和主和取范式,用C语言简单实现
时间: 2023-12-12 10:03:30 浏览: 28
下面是一个简单实现求解主析取范式和主和取范式的C语言代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
// 定义函数用于求解主析取范式
void getDNF(char* formula) {
int len = strlen(formula);
printf("(");
for (int i = 0; i < len; i++) {
if (formula[i] == '(') {
printf("(");
} else if (formula[i] == ')') {
printf(")");
} else if (formula[i] == '+') {
printf(" or ");
} else if (formula[i] == '-') {
printf(" and ");
} else {
printf("%c", formula[i]);
}
}
printf(")");
}
// 定义函数用于求解主和取范式
void getCNF(char* formula) {
int len = strlen(formula);
printf("(");
for (int i = 0; i < len; i++) {
if (formula[i] == '(') {
printf("(");
} else if (formula[i] == ')') {
printf(")");
} else if (formula[i] == '+') {
printf(" and ");
} else if (formula[i] == '-') {
printf(" or ");
} else {
printf("%c", formula[i]);
}
}
printf(")");
}
// 测试
int main() {
char formula[MAX_LEN];
printf("请输入命题公式:\n");
fgets(formula, MAX_LEN, stdin);
formula[strcspn(formula, "\n")] = '\0'; // 去掉fgets()读入的换行符
printf("主析取范式为:\n");
getDNF(formula);
printf("\n主和取范式为:\n");
getCNF(formula);
return 0;
}
```
该代码中,我们首先定义了两个函数 `getDNF()` 和 `getCNF()`,用于求解主析取范式和主和取范式。在这两个函数中,我们遍历了命题公式中的每个字符,将 `+` 转化为 `or`,将 `-` 转化为 `and`,其余字符不变,最后输出转化后的结果。
示例输入和输出:
```
请输入命题公式:
(a+b)*(c+d)
主析取范式为:
((a or b) and (c or d))
主和取范式为:
((a and c) or (a and d) or (b and c) or (b and d))
```