用c语言可以算出主析去范式和主合取范式的程序加注释
时间: 2024-06-06 08:06:52 浏览: 55
利用真值表法求取主析取范式以及主合取范式的实现.doc
//以下是主析去范式的程序
#include<stdio.h>
#include<string.h>
int main() {
char expr[100]; //存储逻辑表达式的数组
printf("请输入逻辑表达式:\n");
scanf("%s", expr);
int len = strlen(expr); //获取逻辑表达式的长度
int num = 0; //用于记录当前表达式中的最大下标
for(int i=0;i<len;i++) {
if(expr[i]>='A'&&expr[i]<='Z') {
if(expr[i]-'A'>num) num = expr[i]-'A'; //更新当前表达式中的最大下标
}
}
int count = 1<<num; //计算出需要遍历的次数
printf("主析取范式为:\n");
for(int i=0;i<count;i++) { //枚举所有情况
int flag = 0; //用于判断当前情况是否符合主析取范式
printf("(");
for(int j=0;j<=num;j++) { //枚举表达式中的每一个变量
if(j==num) { //最后一个变量
if(flag==0&&expr[len-1]=='0') printf("1"); //如果当前情况符合主析取范式,输出“1”
else if(flag==1&&expr[len-1]=='1') printf("0"); //如果当前情况不符合主析取范式,输出“0”
}
else {
if(i&(1<<j)) { //当前变量的值为“1”
if(flag==0&&expr[j*2+1]=='1') flag=1; //如果当前情况符合主析取范式,更新“flag”为“1”
else if(flag==1&&expr[j*2+1]=='0') {flag=0;break;} //如果当前情况不符合主析取范式,更新“flag”为“0”并跳出循环
}
else { //当前变量的值为“0”
if(flag==0&&expr[j*2+1]=='0') flag=1; //如果当前情况符合主析取范式,更新“flag”为“1”
else if(flag==1&&expr[j*2+1]=='1') {flag=0;break;} //如果当前情况不符合主析取范式,更新“flag”为“0”并跳出循环
}
printf("%c", 'A'+j); //输出当前变量
if(j!=num-1) printf("^"); //如果不是最后一个变量,输出“^”
}
}
printf(")");
if(i!=count-1) printf("v"); //如果不是最后一种情况,输出“v”
}
return 0;
}
//以下是主合取范式的程序
#include<stdio.h>
#include<string.h>
int main() {
char expr[100]; //存储逻辑表达式的数组
printf("请输入逻辑表达式:\n");
scanf("%s", expr);
int len = strlen(expr); //获取逻辑表达式的长度
int num = 0; //用于记录当前表达式中的最大下标
for(int i=0;i<len;i++) {
if(expr[i]>='A'&&expr[i]<='Z') {
if(expr[i]-'A'>num) num = expr[i]-'A'; //更新当前表达式中的最大下标
}
}
int count = 1<<num; //计算出需要遍历的次数
printf("主合取范式为:\n");
for(int i=0;i<count;i++) { //枚举所有情况
int flag = 1; //用于判断当前情况是否符合主合取范式
printf("(");
for(int j=0;j<=num;j++) { //枚举表达式中的每一个变量
if(j==num) { //最后一个变量
if(flag==1&&expr[len-1]=='1') printf("1"); //如果当前情况符合主合取范式,输出“1”
else if(flag==0&&expr[len-1]=='0') printf("0"); //如果当前情况不符合主合取范式,输出“0”
}
else {
if(i&(1<<j)) { //当前变量的值为“1”
if(flag==1&&expr[j*2+1]=='1') {flag=1;break;} //如果当前情况符合主合取范式,更新“flag”为“1”并跳出循环
else if(flag==0&&expr[j*2+1]=='0') flag=0; //如果当前情况不符合主合取范式,更新“flag”为“0”
}
else { //当前变量的值为“0”
if(flag==1&&expr[j*2+1]=='0') {flag=1;break;} //如果当前情况符合主合取范式,更新“flag”为“1”并跳出循环
else if(flag==0&&expr[j*2+1]=='1') flag=0; //如果当前情况不符合主合取范式,更新“flag”为“0”
}
printf("%c", 'A'+j); //输出当前变量
if(j!=num-1) printf("v"); //如果不是最后一个变量,输出“v”
}
}
printf(")");
if(i!=count-1) printf("^"); //如果不是最后一种情况,输出“^”
}
return 0;
}
阅读全文