实验报告
实验名称:任意命题公式的真值表
实验目的与要求:通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,包括联结词、真值表、运算的优先级等,提高学生编写实验报告、总结实验结果的能力,培养学生的逻辑思维能力和算法设计的思想,能够独立完成简单的算法设计和分析,进一步用它们来解决实际问题,帮助学生学习掌握C/C++语言程序设计的基本方法和各种调试手段,使学生具备程序设计的能力。
实验内容提要:求任意一个命题公式的真值表
实验步骤:(一)、关于命题公式的形式和运算符(即联结词)的运算
首先根据离散数学的相关知识,命题公式由命题变元和运算符(即联结词)组成,命题变元用大写字母英文表示(本次试验没有定义命题常元T和F,即T、F都表示命题变元),每个命题变元都有两种真值指派0和1,对应于一种真值指派,命题公式有一个真值,由所有可能的指派和命题公式相应的真值按照一定的规范构成的表格称为真值表。
目前离散数学里用到的包括扩充联结词总共有九种,即析取(或)、合取(与)、非、蕴含、等值、与非、或非、异或、蕴含否定,常用的为前五种,其中除了非运算为一元运算以外,其它四种为二元运算。
所以本次实验设计时只定义了前五种运算符,同时用“/”表示非,用“*”表示合取,用“+”表示析取,用“>”表示蕴含,用“:”表示等值,且这五种运算符的优先级依次降低,如果需用括号改变运算优先级,则用小括号()改变。
以下为上述五种运算符运算时的一般真值表,用P和Q表示命题变元:1.非,用“/”表示
2.合取(与),用“*”表示
3.析取(或),用“+”表示
4.蕴含,用“>”表示
5.等值,用“:”表示
(二)、命题公式真值的计算
对于人来说,计算数学表达式时习惯于中缀表达式,例如a*b+c,a*(b+c)等等,而对于计算机来说,计算a*b+c还好,计算a*(b+c)则困难,因为括号的作用改变了运算的顺序,让计算机识别括号而改变计算顺序显得麻烦。
经理论和实践研究,用一种称之为后缀表达式(逆波兰式)的公式形式能让计算机更容易计算表达式的真值。
例如上面的a*(b+c),其后缀表达式为abc+*,计算时从左边开始寻找运算符,然后按照运算符的运算规则将与其相邻的前面的一个(非运算时为一个)或两个(其它四种运算为两个)操作数运算,运算结果取代原来的运算符和操作数的位置,然后重新从左边开始寻找运算符,开始下一次计算,比如上式,从左边开始寻找运算符,先找到+,则计算b+c,结果用d表示,这时后缀表达式变为ad*,又重新开始从左边开始寻找运算符,找到*,则计算a*d,
运算结果保存在原来ad*所占的位置,即a位,也就是第一位。
实验结果与结论:(1)、非运算
(2)、与运算
(3)、或运算
(4)、蕴含
(5)、等值
(6)综合公式
写这个程序花了不少时间,而且时间相对集中,除了上课外,在电脑前都是在做这个,连续做了几天。
刚开始时并没有完全按照软件设计的步骤去写,而是知道总体方框后,一个模块一个模块去求解,至于每个模块怎么写,则是在写的过程中逐步建立和完善的。
有些知识没有学到,比如如何求逆波兰式,只得借书回来看,上网找到的资料不够详细或者几乎没解释,难以理解。
当然了,程序是自己写的,自己看得懂就好多了,别人又不一定要看,所以我也没加多少注释。
求得逆波兰式后,不知自己怎么想的,好像知道怎么计算它的值,看书之后真是那样求解的,突然间有种莫名的喜悦。
刚开始也没有实现蕴含和等值的功能,因为对与、或、非更熟悉,所以只处理了这部分,实现这部分的功能后,才把蕴含和等值的功能加上去,这时就简单得多了,只是稍稍补充和改动就可以了。
而主析取范式和主合取范式也是这样的,刚开始并没有求这个部分,只是在最后时才加上去的。
只不过实现了前面的要求,后面的就显得简单多了。
本程序有个缺点就是,没有用动态分配内存的方法,只是定义了一般够用的数组容量,容量为100个字符,这样的话造成硬件资源的浪费,灵活性不够。
这次试验让我学到了一些新知识,也让我认识到自己在编程方面的一些不足。
以后继续努力!
成绩评定:
实验日期:
指导教师签名:。