用简单C语言实现:给定一个命题公式,求其主析取范式,主合取范式。
时间: 2024-02-11 16:08:09 浏览: 98
实验1-利用真值表法求取主析取范式以及主合取范式的实现1
以下是一个简单的C语言程序,可以实现给定一个命题公式,求其主析取范式和主合取范式:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void getMdn(char *exp);
void getMhn(char *exp);
int main() {
char exp[MAX_LEN];
printf("请输入命题公式:");
fgets(exp, MAX_LEN, stdin);
exp[strlen(exp) - 1] = '\0'; // 去除fgets读入的换行符
printf("主析取范式:");
getMdn(exp);
printf("主合取范式:");
getMhn(exp);
return 0;
}
// 求主析取范式
void getMdn(char *exp) {
int i, j, k, len, flag[MAX_LEN], cnt = 0;
char temp[MAX_LEN];
len = strlen(exp);
for (i = 0; i < len; i++) {
if (exp[i] == '(') {
cnt++;
} else if (exp[i] == ')') {
cnt--;
} else if (cnt == 0 && exp[i] == '|') {
flag[i] = 1;
}
}
for (i = 0, j = 0; i < len; i++) {
if (flag[i] == 1) {
temp[j++] = ')';
temp[j++] = '|';
temp[j++] = '(';
} else {
temp[j++] = exp[i];
}
}
temp[j] = '\0';
printf("%s\n", temp);
}
// 求主合取范式
void getMhn(char *exp) {
int i, j, k, len, flag[MAX_LEN], cnt = 0;
char temp[MAX_LEN];
len = strlen(exp);
for (i = 0; i < len; i++) {
if (exp[i] == '(') {
cnt++;
} else if (exp[i] == ')') {
cnt--;
} else if (cnt == 0 && exp[i] == '&') {
flag[i] = 1;
}
}
for (i = 0, j = 0; i < len; i++) {
if (flag[i] == 1) {
temp[j++] = ')';
temp[j++] = '&';
temp[j++] = '(';
} else {
temp[j++] = exp[i];
}
}
temp[j] = '\0';
printf("%s\n", temp);
}
```
使用示例:
```
请输入命题公式:(A|B)&(C&D)
主析取范式:(A|B)&(C&D)
主合取范式:(A&C)&(A&D)&(B&C)&(B&D)
```
阅读全文