1、2016年9月20日一、 实验目的和要求实验目的:通过编程实现主析取范式以及主合取范式的真值表求法以巩固相关理论的掌握。实验要求:从屏幕输入含三个以内变量的合式公式(其中联结词按照从高到底的顺序出现)。规范列出所输合式公式的真值表。给出相应主析取和主合取范式。二、实验环境(实验设备)Windows+VC三、实验原理及内容 实验原理:开始时在屏幕提示上提示非、合取、析取、条件、双条件在计算机上的字符表示,因为有些数学符号在计算机上不能表示出来。然后在屏幕中输入含三个以内变量的合式公式,其中联结词按照从高到底的顺序出现。把输入的合式公式,分别存放在相应的数组中,设计一个真值判断表达式,并使其赋值计
2、算。依次从左向右计算对应的一组真值指派下合式公式的真值。多重循环计算,并将最终的结果存入相应的数组里,而后输出真值表。最后根据真值表求主析取范式和主合取范式的方法输出所求的相应的主析取范式和主合取范式。 实验内容: #include stdio.h#include stdlib.hstring.hconio.hmath.h#define N 50 void panduan(int bN,int f);/赋值函数int tkh (char szN, char ccuN, int icuN, int h0);/分级运算函数int fkh (char szN, char ccuN, int icuN
3、, int h0);/主运算函数main() int i1,i2,d=1,icuN,jg,j=0,h0;/icuN用于存放变量值,jg存放结果 int bj=0,hqN,h=0,x=0,xqN;/hqN存放合取结果xqN存放析取结果 char szN,ccuN,sz0N,s;/szN存放式子,ccuN存放变量,sz0N也是用于存放式子 hq0=-1; xq0=-1; printf( *n);/标语 n 欢迎进入菜单 n*nn 用!表示非 n 用&表示合取 n 用|表示析取 n 用表示条件 n 用表示双条件 n *nn请输入一个合法的命题公式:n/输入式子 gets(sz);/读取式子 strc
4、py(sz0,sz);/复制式子 for(i1=0;i1=a & szi1AZ) for(i2=0;i20)/判断并添加符号/M(%d),hqi1); /输出主合取范式 if(xq0=-1)/不存在析取范式时n该命题公式不存在主析取范式。nn该命题公式的主析取范式:x;/m(%d),xqi1);/输出主析取范式n欢迎下次再次使用!n /结束 getch();void panduan(int bN,int f) / 二进制赋值。 int i; i=f; if(bf=0)/加1 bf=1; else/进位 bf=0; panduan(b,-i);int fkh(char szN,char ccuN
5、,int icuN,int h0)/主运算函数 int i,h=0,j=0,j1=0,j2=0,j3=0,j4=0,j5=0,i1,i2,p1=-1,p2=-1,s; char dtN; s=strlen(sz); if(s=1) if(sz0=-2)/判断是否是最后一项 return 0; return 1; /1 就是sz0的值、 for(i=0;is-j;i+) /先处理非 if(szi=!) if(szi+1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(p1=-1)/如果是数字,直接给P1 p1=
6、szi+1; dtj+2=!p1;/非运算 szi=j+2; for(i1=i+1; szi1=szi1+1;/将后续式子前移一项 p1=-1; j1=j;s-j1-2*j2;i+) / 处理与 if(szi-1=ccui1)/将变量赋值并给P1 if(szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;j+2;i2+) if(szi-1=i2) /如果为前计算结果,将结果赋值并给P1 p1=dti2; if(szi+1=i2) /如果为前计算结果,将结果赋值并给P2 p2=dti2; if(szi-1=-2)/如果是前运算结果的0,则P1等于0 if(szi+
7、1=-2)/如果是前运算结果的0,则P2等于0 p2=0; if(p1=-1) /如果是数字,直接给P1 p1=(int)(szi-1); if(p2=-1)/如果是数字,直接给P2 p2=(int)(szi+1); dtj+2=p1 & p2;/与运算 szi-1=j+2; j2+; p2=-1; for(i1=i;i1+)/将后续式子前移两项 szi1=szi1+2; i=i-1;s-j1-2*j2-2*j3;i+) / 处理或。| if(szi+1=i2)/如果为前计算结果,将结果赋值并给P2 p1=szi-1; p2=szi+1; dtj+2=p1 | p2;/或运算 j3+; i-;
8、s-j1-2*j2-2*j3-2*j4;i+) / 处理蕴含。 if(szi-1=-2)/如果是前运算结果的0,则P1等于0 p1=0; if(szi+1=-2)/如果是前运算结果的0,则P2等于0 p2=0; if(p1=-1)/如果是数字,直接给P1 p1=szi-1; if(p2=-1)/如果是数字,直接给P2 p2=szi+1; dtj+2=!p1 | p2;/蕴含运算 szi-1=j+2; j+; j4+; p1=-1; p2=-1; for(i1=i; szi1=szi1+2; i-;s-j1-2*j2-2*j3-2*j4-2*j5;i+) / 处理等值。 dtj+2=(!p1 | p2)&(!p2 | p1);/等值运算 j5+; return dtj+1;/返回结果 实验结果:四、实验小结(包括问题和解决方法、心得体会、意见与建议等) 问题 :对于括号和联结词的优先顺序这方面有不足。 解决方法:因为对括号的运算这方面有不足,所以要求联结词按照从高到底的顺序出现。括号这方面以后再拓展。 心得体会:这个实验的目的是从逻辑思维上增进我们对于使用真值表来求某个合式的主析取范式和主合取范式,具体化求取的过程,并将之转化为计算机语言,这要求我们对此方法有足够的认识。这个实验同时考察了我们的数学和计算机水平。 意见与建议:无。五、指导教师评语成 绩批阅人日 期
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1