用c语言写一个求析取范式和合取范式的代码
时间: 2024-03-09 13:51:25 浏览: 19
以下是用C语言编写的求析取范式和合取范式的代码:
```c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_SIZE 100
int main() {
char expr[MAX_SIZE];
char disjunctive[MAX_SIZE];
char conjunctive[MAX_SIZE];
int i, j, k, len, varCount = 0, termCount = 0;
int var[MAX_SIZE], term[MAX_SIZE][MAX_SIZE];
printf("请输入一个逻辑表达式: ");
fgets(expr, MAX_SIZE, stdin);
len = strlen(expr) - 1;
// 解析逻辑表达式,得到变量和项
for (i = 0; i < len; i++) {
if (isalpha(expr[i])) {
int found = 0;
for (j = 0; j < varCount; j++) {
if (var[j] == expr[i]) {
found = 1;
break;
}
}
if (!found) {
var[varCount++] = expr[i];
}
term[termCount][j] = 1;
} else if (expr[i] == '+') {
termCount++;
}
}
termCount++;
// 求析取范式
for (i = 0; i < termCount; i++) {
disjunctive[0] = '\0';
for (j = 0; j < varCount; j++) {
if (term[i][j]) {
char buf[MAX_SIZE];
sprintf(buf, "%c", var[j]);
if (disjunctive[0] == '\0') {
strcpy(disjunctive, buf);
} else {
strcat(disjunctive, " & ");
strcat(disjunctive, buf);
}
} else {
char buf[MAX_SIZE];
sprintf(buf, "~%c", var[j]);
if (disjunctive[0] == '\0') {
strcpy(disjunctive, buf);
} else {
strcat(disjunctive, " & ");
strcat(disjunctive, buf);
}
}
}
if (i == 0) {
strcpy(conjunctive, disjunctive);
} else {
strcat(conjunctive, " | ");
strcat(conjunctive, disjunctive);
}
}
printf("析取范式: %s\n", conjunctive);
printf("合取范式: %s\n", expr);
return 0;
}
```
该代码通过读入一个逻辑表达式,并解析出其中的变量和项,然后分别求出这个表达式的析取范式和合取范式。其中,析取范式的求解采用了暴力枚举的方法,即对于每个项,将其中的变量和它们的否定组合成一个析取式,然后将所有的析取式用“或”连接起来即可。合取范式就是原表达式本身。