给出相应主析取和主合取范式
发布时间:2025-06-24 17:50:54 作者:北方职教升学中心 阅读量:068
//! //联结词改造函数char*conjuction(chara[],size_tlen)//len表示字符串长度{for(inti =0;i <len;i++){if(a[i]=='!')a[i]='6';elseif(a[i]=='&')a[i]='2';elseif(a[i]=='|')a[i]='3';elseif(a[i]=='>')a[i]='4';elseif(a[i]=='-')a[i]='5';}returna;}
联结词计算函数
对每个联结词对应的计算方法写成函数。
- 主合取范式:真值结果为假F,变元如果为真就写为否定 !P,如果为假就不取否定。
//改PQ值为1 0voidchange(chara[],size_tlen,charb1,charb2,charb3){for(intj =0;j <len;j++){if(a[j]=='P')a[j]=b1;elseif(a[j]=='Q')a[j]=b2;elseif(a[j]=='R')a[j]=b3;}}
命题变元个数判断函数
直接循环遍历然后记录出现次数就行。
//单变元打印voidonePrint(chara[],size_tlen,chardis[],charpri[]){printf("该合式公式真值表如下表示:n");printf("Pt%sn",a);charb[MAX];conjuction(a,len);charret;strcpy(b,a);ret =count(a,len,'1','1','1');printf("1t%cn",ret);strcpy(a,b);ret =count(a,len,'0','0','0');printf("0t%cn",ret);}//双变元打印voidtwoPrint(chara[],size_tlen,chardis[],charpri[]){printf("该合式公式真值表如下表示:n");printf("PtQt%sn",a);charb[MAX];charret;conjuction(a,len);strcpy(b,a);ret =count(a,len,'1','1','0');//存储范式值if(ret =='0')strcat(pri,"(!P|!Q)&");elseif(ret =='1')strcat(dis,"(P&Q)|");printf("1t1t%cn",ret);strcpy(a,b);ret =count(a,len,'1','0','0');//存储范式值if(ret =='0')strcat(pri,"(!P|Q)&");elseif(ret =='1')strcat(dis,"(P&!Q)|");printf("1t0t%cn",ret );strcpy(a,b);ret =count(a,len,'0','1','0');//存储范式值if(ret =='0')strcat(pri,"(P|!Q)&");elseif(ret =='1')strcat(dis,"(!P&Q)|");printf("0t1t%cn",ret);strcpy(a,b);ret =count(a,len,'0','0','0');//存储范式值if(ret =='0')strcat(pri,"(P|Q)&");elseif(ret =='1')strcat(dis,"(!P&!Q)|");printf("0t0t%cn",ret );}//三变元打印voidthreePrint(chara[],size_tlen,chardis[],charpri[]){printf("该合式公式真值表如下表示:n");printf("PtQtRt%sn",a);charb[MAX];charret;conjuction(a,len);strcpy(b,a);ret =count(a,len,'1','1','1');//计算范式if(ret =='1')strcat(dis,"(P&Q&R)|");elseif(ret =='0')strcat(pri,"(!P|!Q|!R)&");printf("1t1t1t%cn",ret);strcpy(a,b);//计算范式ret =count(a,len,'1','1','0');if(ret =='1')strcat(dis,"(P&Q&!R)|");elseif(ret =='0')strcat(pri,"(!P|!Q|R)&");printf("1t1t0t%cn",ret );strcpy(a,b);//计算范式ret =count(a,len,'1','0','1');if(ret =='1')strcat(dis,"(P&!Q&R)|");elseif(ret =='0')strcat(pri,"(!P|Q|!R)&");printf("1t0t1t%cn",ret);strcpy(a,b);//计算范式ret =count(a,len,'1','0','0');if(ret =='1')strcat(dis,"(P&!Q&!R)|");elseif(ret =='0')strcat(pri,"(!P|Q|R)&");printf("1t0t0t%cn",ret);strcpy(a,b);//计算范式ret =count(a,len,'0','1','1');if(ret =='1')strcat(dis,"(!P&Q&R)|");elseif(ret =='0')strcat(pri,"(P|!Q|!R)&");printf("0t1t1t%cn",ret);strcpy(a,b);//计算范式ret =count(a,len,'0','1','0');if(ret =='1')strcat(dis,"(!P&Q&!R)|");elseif(ret =='0')strcat(pri,"(P|!Q|R)&");printf("0t1t0t%cn",ret);strcpy(a,b);//计算范式ret =count(a,len,'0','0','1');if(ret =='1')strcat(dis,"(!P&!Q&R)|");elseif(ret =='0')strcat(pri,"(P|Q|!R)&");printf("0t0t1t%cn",ret);strcpy(a,b);//计算范式ret =count(a,len,'0','0','0');if(ret =='1')strcat(dis,"(!P&!Q&!R)|");elseif(ret =='0')strcat(pri,"(P|Q|R)&");printf("0t0t0t%cn",ret);}//主析取范式打印voiddisPrint(chardis[],size_tdisLen){printf("该合式公式的主析取范式:n");for(inti =1;i <disLen -1;i++)printf("%c",dis[i]);printf("n");}//主合取范式打印voidpriPrint(charpri[],size_tpriLen){printf("该合式公式的主合取范式:n");for(inti =1;i <priLen -1;i++)printf("%c",pri[i]);printf("n");}
主函数中调用
调用思路如下:
主函数中用一个字符数组来接收传来的合式公式。
实验要求
要求:
从屏幕输入含三个以内变量的合式公式(其中 联结词按照从高到底的顺序出现)。