求给定命题公式的真值表并根据真值表求公式的主范式

上传人:枕*** 文档编号:123280068 上传时间:2022-07-22 格式:DOC 页数:26 大小:185KB
收藏 版权申诉 举报 下载
求给定命题公式的真值表并根据真值表求公式的主范式_第1页
第1页 / 共26页
求给定命题公式的真值表并根据真值表求公式的主范式_第2页
第2页 / 共26页
求给定命题公式的真值表并根据真值表求公式的主范式_第3页
第3页 / 共26页
资源描述:

《求给定命题公式的真值表并根据真值表求公式的主范式》由会员分享,可在线阅读,更多相关《求给定命题公式的真值表并根据真值表求公式的主范式(26页珍藏版)》请在装配图网上搜索。

1、“离散数学”实验报告(求给定命题公式的真值表并根据真值表求公式的主范式)专 业 网络工程 班 级 1202班 学 号 12407442 姓 名 张敏慧 .12.14目录一.实验目的3二.实验内容.3 求任意一种命题公式的真值表3三.实验环境3四. 实验原理和实现过程(算法描述)31.实验原理32.实验流程图5五.实验代码6 六. 实验成果14 七. 实验总结19一.实验目的本实验课程是网络工程专业学生的一门专业基本课程,通过实验,协助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算;通过实验提高学生编写实验报告、总结实验成果的能力;使学生具有程序设计的思想,可以独立完毕简朴的算法

2、设计和分析。熟悉掌握命题逻辑中的真值表、主范式等,进一步能用它们来解决实际问题。二.实验内容求任意一种命题公式的真值表,并根据真值表求主范式具体阐明: 求任意一种命题公式的真值表本实验规定人们运用C/C语言,实现任意输入公式的真值表计算。一般我们将公式中的命题变元放在真值表的左边,将公式的成果放在真值表的右边。命题变元可用数值变量表达,合适公式的表达及求真值表转化为逻辑运算成果;可用一维数表达合式公式中所浮现的n个命题变元,同步它也是一种二进制加法器的模拟器,每当在这个模拟器中产生一种二进制数时,就相称于给各个命题变元产生了一组真值指派。算法逻辑如下:(1)将二进制加法模拟器赋初值0(2)计算

3、模拟器中所相应的一组真值指派下合式公式的真值。(3)输出真值表中相应于模拟器所给出的一组真值指派及这组真值指派所相应的一行真值。(4)产生下一种二进制数值,若该数值等于2n-1,则结束,否则转(2)。三.实验环境;使用visual C+6.0为编程软件,采用C语言为编程语言实现。四. 实验原理和实现过程(算法描述);1.实验原理(1)真值表:表征逻辑事件输入和输出之间所有也许状态的表格。列出命题公式真假值的表。一般以1表达真,0 表达假。命题公式的取值由构成命题公式的命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。 真值表是在逻辑中使用的一类数学表,用来拟定一种体现式与否

4、为真或有效。(2)主范式:主析取范式:在具有n个命题变元的简朴合取式中,若每个命题变元与其否认不同步存在,而两者之一浮现一次且仅浮现一次,称该简朴合取式为小项。由若干个不同的小项构成的析取式称为主析取范式;与A等价的主析取范式称为A的主析取范式。任意含n个命题变元的非永假命题公式A都存在与其等价的主析取范式,并且是惟一的。主合取范式:在具有n个命题变元的简朴析取式中,若每个命题变元与其否认不同步存在,而两者之一浮现一次且仅浮现一次,称该简朴析取式为大项。由若干个不同的大项构成的合取式称为主合取范式;与A等价的主合取范式称为A的主合取范式。任意含n个命题变元的非永真命题公式A都存在与其等价的主合

5、取范式,并且是惟一的。(2)一方面是输入一种合理的式子,然后从式子中查找出变量的个数,开辟一种二进制函数,用来生成真值表,然后用函数运算,输出成果,并根据成果归类给范式,最后输出范式。函数部分,重要是3个函数,一种为真值表递加函数,通过二进制的加法原理递进产生,一种为分级运算函数,这个函数是通过判断括号,选出最内级括号的内容执行运算函数,这样一级一级向外运算,最后得出最后成果,剩余一种为主运算函数,按照运算符号的优先级按顺序进行运算,如先将所有非运算运算完,再执行与运算。如此运算。2.实验流程图如下:开始输入式子计算变量个数生成真值表输出真值表变量赋值运算式子输出成果归类主范式输出主范式结束循

6、环与否结束YN主函数开始检查括号与否是最内级括号运算内容与否是最后成果返回成果结束开始结束YYNN非运算与运算或运算蕴含运算等值运算返回成果主运算函数分级运算函数五.实验代码#include stdio.h#include stdlib.h#include string.h#include conio.h#include math.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, in

7、t icuN, int h0);/主运算函数main() int i1,i2,d=1,icuN,kh=0,jg,j=0,h0;/icuN用于寄存变量值,kh括号计数,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);/标语 printf(* *n); printf(* 欢迎进入逻辑运算软件 *n); printf(* (可运算真值表,主范式,支持括号) *n); printf(* *n

8、); printf(* 用!表达非 *n); printf(* 用&表达与 *n); printf(* 用|表达或 *n); printf(* 用表达蕴含 *n); printf(* 用表达等值 *n); printf(* *n); printf(*nn); printf(请输入一种合法的命题公式:n);/输入式子 gets(sz);/读取式子 strcpy(sz0,sz);/复制式子 for(i1=0;i1=a & szi1=A & szi1=Z) for(i2=0;i2j;i2+) /判断并储存变量。 if(ccui2=szi1)/清除反复变量 d=0; if(d=1) ccuj=szi1

9、; j+; d=1; printf(nd该式子中的变量个数为:%dn,j);/输出变量个数 h0=j; printf(n输出真值表如下:n n); /输出真值表表头 for(i1=0;i1h0;i1+) printf( %c ,ccui1); printf( ); puts(sz); printf(n); for(i1=0;i1j;i1+) /先将所有的变量赋值为零。 icui1=0; for(i2=0;i2j;i2+)/输出真值表前项 printf( %d ,icui2); jg=tkh(sz,ccu,icu,h0); /用函数求成果 if(jg=0)/成果为0,合取加1 hqh+=bj;

10、else /否则,析取加1 xqx+=bj; printf( %dn,jg);/输出运算成果 strcpy(sz,sz0); for(i1=0;i1(int)pow(2,j)-1;i1+) +bj;panduan(icu,j-1); /赋值变量jg=tkh(sz,ccu,icu,h0); if(jg=0)/成果为0,合取加1 hqh+=bj; else /否则,析取加1 xqx+=bj; strcpy(sz,sz0); /恢复被修改的数组。 for(i2=0;i2j;i2+) printf( %d ,icui2);/输出真值表前项 printf( %dn,jg);/输出运算成果 if(hq0=

11、-1)/不存在合取范式时 printf(n该命题公式不存在主合取范式。n); else printf(n该命题公式的主合取范式:nt); for(i1=0;i10)/判断并添加符号 printf(/); printf(M(%d),hqi1); /输出主合取范式 if(xq0=-1)/不存在析取范式时 printf(n该命题公式不存在主析取范式。n); else printf(nn该命题公式的主析取范式:nt); for(i1=0;i10)/判断并添加符号 printf(/); printf(m(%d),xqi1);/输出主析取范式 printf(n); printf(n欢迎下次再次使用!n )

12、;/结束 getch();void panduan(int bN,int f) / 二进制赋值。 int i; i=f; if(bf=0)/加1 bf=1; else/进位 bf=0; panduan(b,-i); int tkh (char szN,char ccuN,int icuN,int h0)/分级运算函数 int i,j,h,s,kh=0,wzN,a; char xs1N,ckhN; /xs1用来保存括号内的字符 ckh用来保存括号。 s=strlen(sz); for(i=0;is;i+) if(szi=( | szi=)/判断括号 wzkh=i;/存储括号位置 ckhkh=sz

13、i;/存储括号类型 kh+; if(kh=0) return fkh(sz,ccu,icu,h0);/如果无括号,直接运营 else for(i=0;ikh;i+) if(ckhi=)/找到第一种) break; for(j=wzi-1+1,h=0;jwzi;j+,h+) /存储最内级括号中的内容 xs1h=szj; xs1h=0; a=fkh(xs1,ccu,icu,h0);/运营最内级括号的式子,得到成果 if(a=1)/判断并存储成果 szwzi-1=1; else szwzi-1=-2; for(j=wzi-1+1;js+wzi-1-wzi;j+)/将括号后内容前移 szj=szj+w

14、zi-wzi-1; szj=0; return tkh(sz,ccu,icu,h0);/循环执行 int fkh(char szN,char ccuN,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; else return 1; /1 就是sz0的值、 else for(i=0;is-j;i+) /先解决非 if(szi=!) for(i1=0;i1h0

15、;i1+) if(szi+1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=-2)/如果是前运算成果的0,则P1等于0 p1=0; if(p1=-1)/如果是数字,直接给P1 p1=szi+1; dtj+2=!p1;/非运算 szi=j+2; j+; p1=0; for(i1=i+1;i1s-j;i1+) szi1=szi1+1;/将后续式子前移一项 p1=-1; j1=j; for(i=0;is-j1-2*j2;i+) / 解决与 if(szi=&) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(

16、szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算成果,将成果赋值并给P1 p1=dti2; if(szi+1=i2) /如果为前计算成果,将成果赋值并给P2 p2=dti2; if(szi-1=-2)/如果是前运算成果的0,则P1等于0 p1=0; if(szi+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 &

17、 p2;/与运算 szi-1=j+2; j+; j2+; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2;i1+)/将后续式子前移两项 szi1=szi1+2; i=i-1; for(i=0;is-j1-2*j2-2*j3;i+) / 解决或。 if(szi=|) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算成果,将成果赋值并给P1 p1=dti2; if(

18、szi+1=i2)/如果为前计算成果,将成果赋值并给P2 p2=dti2; 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+; j3+; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2-2*j3;i1+)/将后续式子前移两项 szi1=szi1+2; i-; for(i=0;is-j1

19、-2*j2-2*j3-2*j4;i+) / 解决蕴含。 if(szi=) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccui1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算成果,将成果赋值并给P1 p1=dti2; if(szi+1=i2) /如果为前计算成果,将成果赋值并给P2 p2=dti2;if(szi-1=-2)/如果是前运算成果的0,则P1等于0 p1=0; if(szi+1=-2)/如果是前运算成果的0,则P2等于0 p

20、2=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;i1s-j1-2*j2-2*j3-2*j4;i1+)/将后续式子前移两项 szi1=szi1+2;i-; for(i=0;is-j1-2*j2-2*j3-2*j4-2*j5;i+) / 解决等值。 if(szi=) for(i1=0;i1h0;i1+) if(szi-1=ccui1)/将变量赋值并给P1 p1=icui1; if(szi+1=ccu

21、i1)/将变量赋值并给P2 p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) /如果为前计算成果,将成果赋值并给P1 p1=dti2; if(szi+1=i2) /如果为前计算成果,将成果赋值并给P2 p2=dti2; 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)&(!p2 | p1);/等值运算

22、szi-1=j+2; j+; j5+; p1=-1; p2=-1; for(i1=i;i1s-j1-2*j2-2*j3-2*j4-2*j5;i1+)/将后续式子前移两项 szi1=szi1+2; i-; return dtj+1;/返回成果 六.实验成果 成果分析:这道题第一部分比较简朴,重要是读取值并进行计算,同步要注意输入的值要是0或1,如果不是,则进行错误提示,并进行重新输入。欢迎界面非运算与运算或运算蕴含运算等值运算综合运算带括号的综合运算成果分析:这个程序从功能上来说,达到了题目规定的各个功能,可以运算与,或,非,蕴含,等值条件构成的体现式,并且支持括号运算,因此,总体上来说,虽然尚

23、有某些不完善的部分,但是整体是比较可以的。七. 实验总结这个实验相对来说是一种不困难的题,一开始想用中序体现式转变为逆波兰式的措施来解决,但是总有某些零零散散的问题困扰,况且对于栈和二叉树之类的东西在学习C语言时接触很少,因此困难更大,通过多次失败后,还是最后用最简朴同步也是最麻烦的措施来解决这个问题。运用函数一步步来解决,因此在个别功能上来说有某些不完美,例如纠错,由于时间有限,有个别地方没有设立出错提示。也许是好久没看C语言了,导致诸多基本的语句都已经并不纯熟了,通过这次实验,让我从一定限度上找回了一点此前做课程设计时的感觉。在编程过程中,最重要的其实是对细节方面的把握。在设计上重要有如下几种问题:1.优先级的问题,要如何解决优先级的问题,最后我直接用先后执行来解决。2.括号问题,对于运算来说,解决括号问题很重要,而我是从最内级括号向外层层运算,最后得出成果。3.真值表问题,真值表运用二进制的原理,递加得到。4.赋值问题,一开始这个问题困扰了我好久,后来发现直接用一种赋值函数,每次运营都直接运营一次就可以较好的解决了。这些是在做题时重要遇到的问题。其实这个题在得出真值的成果之后就可以比较简朴的解决了,由于已有真值表,只要将最后成果分类,并将其分类列出就可以了。总的来说,本次实验总体上是比较成功的,也让我学到了诸多东西。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!