(完整word版)求给定命题公式的真值表并根据真值表求公式的主范式

上传人:tu****8 文档编号:57652764 上传时间:2022-02-24 格式:DOC 页数:23 大小:649.50KB
收藏 版权申诉 举报 下载
(完整word版)求给定命题公式的真值表并根据真值表求公式的主范式_第1页
第1页 / 共23页
(完整word版)求给定命题公式的真值表并根据真值表求公式的主范式_第2页
第2页 / 共23页
(完整word版)求给定命题公式的真值表并根据真值表求公式的主范式_第3页
第3页 / 共23页
资源描述:

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

1、“离散数学”实验报告 (求给定命题公式的真值表并根据真值表求公式的主范式) 专业 网络工程 班级 1202 班 学号 12407442 姓名 张敏慧 2013.12.14-1 - 目录 一. 实验目的 . 3 二. . 实验内容 . .3 求任意一个命题公式的真值表 . 3 三. 实验环境 . 3 四. 实验原理和实现过程(算法描述) . 3 1. 实验原理 . 3 2. 实验流程图 .5. 五. 实验代码 . 6 六. 实验结果 . 14 七. 实验总结 . 19-2 - 一. 实验目的 本实验课程是网络工程专业学生的一门专业基础课程, 通过实验,帮助学生 更好地掌握计算机科学技术常用的离散

2、数学中的概念、 性质和运算;通过实验提 高学生编写实验报告、总结实验结果的能力;使学生具备程序设计的思想,能够 独立完成简单的算法设计和分析。 熟悉掌握命题逻辑中的真值表、主范式等,进一步能用它们来解决实际问题。 二. 实验内容 求任意一个命题公式的真值表,并根据真值表求主范式 详细说明: 求任意一个命题公式的真值表 本实验要求大家利用C/C+语言,实现任意输入公式的真值表计算。一般 我们将公式中的命题变元放在真值表的左边,将公式的结果放在真值表的右边。 命题变元可用数值变量表示,合适公式的表示及求真值表转化为逻辑运算结果; 可用一维数表示合式公式中所出现的 n个命题变元, 同时它也是一个二进

3、制加法 器的模拟器,每当在这个模拟器中产生一个二进制数时, 就相当于给各个命题变 元产生了一组真值指派。算法逻辑如下: (1) 将二进制加法模拟器赋初值0 (2) 计算模拟器中所对应的一组真值指派下合式公式的真值。 (3) 输出真值表中对应于模拟器所给出的一组真值指派及这组真值指派所对应 的一行真值。 (4) 产生下一个二进制数值,若该数值等于 2n-1,则结束,否则转(2)。 三. 实验环境; 使用visual C+6.0为编程软件,采用C语言为编程语言实现。 四. 实验原理和实现过程(算法描述); 1.实验原理 (1)真值表:表征逻辑事件输入和输出之间全部可能状态的表格。 列出命题公 式真

4、假值的表。通常以1表示真,0表示假。命题公式的取值由组成命题公式的 命题变元的取值和命题联结词决定,命题联结词的真值表给出了真假值的算法。 真值表是在逻辑中使用的一类数学表,用来确定一个表达式是否为真或有效。 (2)主范式: -3 - 主析取范式:在含有n个命题变元的简单合取式中,若每个命题变元与其否 定不同时存在,而两者之一出现一次且仅出现一次,称该简单合取式为小项。由若 干个不同的小项组成的析取式称为主析取范式;与A等价的主析取范式称为 A的 主析取范式。任意含n个命题变元的非永假命题公式 A都存在与其等价的主析取 范式,并且是惟一的。 主合取范式:在含有n个命题变元的简单析取式中,若每个

5、命题变元与其否 定不同时存在,而两者之一出现一次且仅出现一次,称该简单析取式为大项。由若 干个不同的大项组成的合取式称为主合取范式;与A等价的主合取范式称为 A的 主合取范式。任意含n个命题变元的非永真命题公式 A都存在与其等价的主合取 范式,并且是惟一的。 (2)首先是输入一个合理的式子,然后从式子中查找出变量的个数,开辟一个 二进制函数,用来生成真值表,然后用函数运算,输出结果,并根据结果归类给 范式,最后输出范式。 函数部分,主要是3个函数,一个为真值表递加函数,通过二进制的加法原 理递进产生,一个为分级运算函数,这个函数是通过判断括号,选出最内级括号 的内容执行运算函数,这样一级一级向

6、外运算,最后得出最终结果,剩下一个为 主运算函数,按照运算符号的优先级按顺序进行运算,如先将所有非运算运算完, 再执行与运算。如此运算。-4 - 2.实验流程图如下: 主函数 -5 - 分级运算函数 主运算函数 -6 - 五.实验代码 #i nclude stdio.h #i nclude stdlib.h #include string.h #i nclude coni o.h #in clude math.h #defi ne N 50 void pan dua n(i nt bN,i nt f); 赋值函数 int tkh (char szN, char ccuN, int icuN,

7、int h0); int fkh (char szN, char ccuN, int icuN, int h0); 分级运算函数 主运算函数 mai n() 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,szON,s;/szN 存放式子,ccuN存放变量,sz0N也 是用于存放式子 标语 prin tf(* ( 可运算真值表,主范式,支持括 号) prin tf(* *n); prin tf(

8、* 用!表示非 *n) prin tf(* 用&表示与 *n) prin tf(* 用|表示或 *n) prin tf(* 用A表示蕴含 *n) prin tf(* 用表示等值 *n) prin tf(* *n); 输入式子 *n);/ *n); 欢迎进入逻辑运算软件 *n); hq0=-1; xq0=-1; printf( prin tf(* prin tf(* printf( i*nn); printf( 请输入一个合法的命题公式:n); gets(sz);/ 读取式子 strcpy(szO,sz); 复制式子 for(i1=0;i1=a & szi1=A & szi1=Z) for(i2

9、=0;i2j;i2+) / 判断并储存变量。 if(ccui2=szi1)/ 去除重复变量 -7 - d=0; if(d=1) ccuj=szi1; j+; d=1; prin tf(nd 该式子中的变量个数为: dn,j); 输出变量个数 h0=j; prin tf(n 输出真值表如下:n n); / 输出真值表表头 for(i1=0;i1h0;i1+) prin tf( %c ,ccui1); printf(); puts(sz); prin tf(n); for(i 1=0;i1j;i1+)/ icui1=0; for(i2=0;i2j;i2+) 先将所有的变量赋值为零 输出真值表前项

10、-8 - prin tf( %d ,icui2); jg=tkh(s z,ccu,icu,h0); / 用函数求结果 if(jg=0)/ 结果为0,合取加1 hqh+=bj; else / 否则,析取加1 xqx+=bj; printf( %dn,jg); 输出运算结果 strcpy(sz,sz0); for(i 1=0;i1(i nt)pow(2,j)-1;i1+) +bj; pan dua n( icu,j-1); / 赋值变量 jg=tkh(sz,ccu,icu,h0); if(jg=0)/ 结果为0,合取加1 hqh+=bj; else / 否则,析取加1 xqx+=bj; strcp

11、y(s z,sz0); / 恢复被修改的数组。 for(i2=0;i2j;i2+) printf( %d ,icui2); 输出真值表前项 printf( %dn,jg);/ 输出运算结果 if(hq0=-1)/ 不存在合取范式时 prin tf(n 该命题公式不存在主合取范式。n); -9 - else prin tf(n 该命题公式的主合取范式:nt); for(i 1=0;i10) 判断并添加符号 prin tf(V); prin tf(M(%d),hqi1); / 输出主合取范式 if(xq0=-1) 不存在析取范式时 prin tf(n 该命题公式不存在主析取范式。n); else

12、prin tf(nn 该命题公式的主析取范式:nt); for(i 1=0;i10) 判断并添加符号 prin tf(/); prin tf(m(%d),xqi1);/ 输出主析取范式 prin tf(n); prin tf(n 欢迎下次再次使用! n );/ 结束 getch(); void pan dua n(i nt bN,i nt f) / 二进制赋值。 int i; i=f; if(bf=0)/ 力卩 1 bf=1; else/ 进位 bf=0; pan dua n( b,-i); int tkh (char szN,char ccuN,int icuN,int h0)/ int i

13、,j,h,s,kh=0,wzN,a; char xs1N,ckhN; /xs1 用来保存括号内的字符 ckh s=strle n(sz); 分级运算函数 用来保存括号 -10 - for(i=0;is;i+) if(szi=( | szi=) 判断括号 wzkh=i; 存储括号位置 ckhkh=szi; 存储括号类型 kh+; if(kh=0) return fkh(s z, ccu,icu,h0); 如果无括号,直接运行 else for(i=0;ikh;i+) if(ckhi=) 找到第一个) break; for(j=wzi-1+1,h=0;jwzi;j+,h+) / 存储最内级括号中的

14、内容 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+wzi-wzi-1; szj=0; return tkh(sz,ccu,icu,h0); 循环执行 int fkh(char szN,char ccuN,i nt icuN,i nt h0) 主运算函数 int i,h=0,j=0,j仁 0,j2=0,j3=0,j4=0,j5=0,i1,i2,p

15、 1=-1,p2=-1,s; char dtN; s=strle n(sz); if(s=1) if(sz0=-2) 判断是否是最后一项 return 0; else return 1; 1 就是 sz0的值、 else for(i=0;is-j;i+) / 先处理非 if(szi=!)-11 - for(i1=0;i1h0;i1+) if(szi+1=ccui1) 将变量赋值并给 P1 p1=icui1; if(szi+1=-2) 如果是前运算结果的0,则P1等于0 p仁0; if(p1=-1) 如果是数字,直接给 P1 p1= szi+1; dtj+2=!p1; 非运算 szi=j+2;

16、j+; p1=0; 如果为前计算结果,将结果赋值并给 如果为前计算结果,将结果赋值并给 如果是前运算结果的0,则P1等于0 如果是前运算结果的0,则P2等于0 p1=(i nt)(szi-1); if(p2=-1) 如果是数字,直接给 P2 p2=(i nt)(szi+1); dtj+2=p1 & p2; szi-1=j+2;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=icui1; if(szi+1

17、=ccui1) p2=icui1; 将后续式子前移一项 处理与 将变量赋值并给P1 将变量赋值并给P2 p2=0; if(p1=-1) / 如果是数字,直接给P1 for(i2=2;i2j+2;i2+) if(szi-1=i2) / p仁 dti2; if(szi+1=i2) / p2=dti2; if(szi-1=-2) p仁0; if(szi+1=-2) P1 P2 与运算 -12 - j+; j2+; p1=-1; p2=-1; for(i仁i;i1s-j1-2*j2;i1+) szi1=szi1+2; i=i-1; for(i=0;is-j1-2*j2-2*j3;i+) / if(sz

18、i=T) for(i1=0;i1h0;i1+) if(szi-1=ccui1) p1=icui1; if(szi+1=ccui1)/ p2=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) / p仁 dti2; if(szi+1=i2)/ p2=dti2; if(szi-1=-2)/ p仁0; if(szi+1=-2)/ p2=0; if(p1=-1)/ p1= szi-1; if(p2=-l) 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;

19、i1+)/ szi1=szi1+2; i-; -13 - for(i=0;is-j1-2*j2-2*j3-2*j4;i+) /将后续式子前移两项 处理或。 将变量赋值并给P1 将变量赋值并给P2 如果为前计算结果,将结果赋值并给 P1 如果为前计算结果,将结果赋值并给 P2 0,则P1等于0 0,则P2等于0 如果是前运算结果的 如果是前运算结果的 如果是数字,直接给 如果是数字,直接给 或运算 P1 P2 将后续式子前移两项 处理蕴含。 -14 - if(szi=T for(i1=0;i1h0;i1+) if(szi-1=ccui1) p1=icui1; if(szi+1=ccui1) p2

20、=icui1; for(i2=2;i2j+2;i2+) if(szi-1=i2) / p仁 dti2; if(szi+1=i2) / p2=dti2; 将变量赋值并给P1 将变量赋值并给P2 if(szi-1=-2) p仁0; if(szi+1=-2) 如果是前运算结果的 如果是前运算结果的 0,贝U P1等于0 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(i

21、1=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(i 1= 0;i1h0;i1+) if(szi-1=ccui1)/ p1=icui1; if(szi+1=ccui1)/ 将变量赋值并给P1 将变量赋值并给P2 p2=icui1; 如果为前计算结果,将结果赋值并给 P1 如果为前计算结果,将结果赋值并给 P2 -15 - for(i2=2;i2j+2;i2+) if(szi-1=i2) / p仁 dti2; if

22、(szi+1=i2) / p2=dti2; if(szi-1=-2) p仁0; if(szi+1=-2) p2=0; if(p1=-1) p1= szi-1; if(p2=-1) p2=szi+1; 如果为前计算结果,将结果赋值并给 P1 如果为前计算结果,将结果赋值并给 P2 如果是前运算结果的 如果是前运算结果的 如果是数字,直接给 如果是数字,直接给 dtj+2=(!p1 | p2)&(!p2 | p1); szi-1=j+2; j+; j5+; p1=-1; p2=-1; for(i仁i;i1s-j1-2*j2-2*j3-2*j4-2*j5;i1+) 项 szi1=szi1+2; i-

23、; return dtj+1; 返回结果 P1 P2 0,贝U P1等于0 0,则P2等于0 等值运算 将后续式子前移两 六.实验结果 结果分析: 这道题第一部分比较简单,主要是读取值并进行计算,同时要注意输入的值 要是0或1,如果不是,则进行错误提示,并进行重新输入。 -16 - -*C:DOCniEMTS ABD SETTISGSAT1IHISTRATOR桌面新建文件Debuecl- exe -17 - 陆命题公式的主合取范式 憧命题公式的主析取范式 非运算 -18 - i C:DOCU1EKTS ABD SETTINGSADHINISTRATORV Debugc 1 _ exe 与运算

24、-19 - 或运算 -20 - C l *C:DOCU1EMIS AKD SETTINGSVADIIMISIKATORXffixlftlTXDebuEYcl. ese 話输入一个台法的命题公式; kAb 该式子中的变量个数为 2 打岀真值表如下 a b ab 0 0 1 0 1 1 1 0 0 1 1 1 詁命题公式的至合取範式 MC25 右命题公式的主析取范式: n/i/i k迎下次再次使用| 蕴含运算 等值运算-21 - 综合运算 C:DOCU1ENTS ABD SETTIMGSADHINISTRATOK5fM #Debugcl_ exe- a b c d taAbc*d!dta 0 0

25、P 0 1 e 0 & 1 S 0 0 1 0 1 0 0 1 1 e 0 1 9 0 1 0 1 0 1 0 1 1 8 1 0 1 1 1 0 1 0 P 0 1 1 0 & 1 S 1 0 1 3 1 1 0 1 1 0 1 1 0 0 1 1 1 & 1 0 1 1 i 8 1 1 1 1 1 0 核命题公式的主合取范式: g 命题公式的主析取范式: R/n2 带括号的综合运算 -22 - 结果分析: 这个程序从功能上来说,达到了题目要求的各个功能,可以运算与,或,非, 蕴含,等值条件组成的表达式,并且支持括号运算,所以,总体上来说,虽然还 有一些不完善的部分,但是整体是比较可以的。

26、七.实验总结 这个实验相对来说是一个不困难的题,一开始想用中序表达式转变为逆波 兰式的方法来解决,但是总有一些零零散散的问题困扰, 况且对于栈和二叉树之 类的东西在学习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交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!