- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
离散数学实验——求真值表
一 实验目的 3
二 实验内容 3
三 实验环境 3
四 实验原理和实现过程(算法描述) 3
五 实验数据及结果分析; 5
六 源程序清单; 9
七 其他收获和体会。 18
一 实验目的
熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二 实验内容
1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。(A)
2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))
三 实验环境
C或C++语言编程环境实现。
四 实验原理和实现过程(算法描述)
A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。最后提示按#键退出,否则继续循环求真值。
B:
主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi()每次调用zzhi()时都使数组zhi[]中的真值加1,(利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhi()将真值指派的数组加1,最后外围利用while语句循环输出每个不同的真值指派和该指派下表达式的值。
将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2个栈,一个作为临时存储运算符的栈,一个作为输入逆波兰式的栈,从中缀式的左端开始取字符,逐序进行如下步骤:
(1)若取出的字符是,则该直接送入栈 ()若取出的字符是“(”,则直接送入栈栈顶。
()若取出的字符是“)”,则将距离栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入栈,此时抛弃“(”。 ()若取出的字符是运算符,则将该运算符与栈栈顶元素比较,如果该运算符优先级大于栈栈顶运算符优先级,则将该运算符进栈,否者,将栈的栈顶运算符弹出,送入栈中,直至栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入栈。
(5) 重复上面的1~4步,直至处理完所有的输入字符
(6)两个元素出栈,执行运算,得到的结果再入栈{
if(zhi[n]==0)
zhi[n]=1;
else if(zhi[n]==1)
{
zhi[n]=0;
zzhi(n-1); //递推,实现进位
}
}
C:在B的基础上加了两个二维数组biao[],biao2[],将真值为1和0的真值指派分别存在数组biao[][]和biao2[][]中,然后按合取和析取主范式的不同定义,用循环将对应真值的变量以原或反变量形式输出期间也输出合取、析取符和括号,使之成为主范式
再编写好主要的功能之后,我又在源程序基础上加了一些判断输入错是的提示和处理。具体见实验数据分析和源程序的注释
五 实验数据及结果分析;
A:当输入的真值不为0或者1时提示错误并要求重新输入
可循环输入直到输入#才退出,如图所示,以表格的形式输出结果,并且真值都正确
B和C:
首先提示输入表达式(合取、析取、蕴含、双条件分别用,|,,=表示),然后如果输入的是正确的表达式则以表格形式输出该表达式的真值表、主析取范式和主合取范式,如下图所示,所得真值表和主范式是正确的
当输入错误的表达式格式时,提示错误,并让用户选择是否继续输入表达式(按#退出)然后返回原界面,继续求真值表和主范式。如下图所示:当输入pQ!R(!R前漏写运算符)时,提示表达式不合规范,要求重新输入,也可选择按#退出。
括号不匹配:
输入错误的符号:
六 源程序清单;
A:
#includestdio.h
main()
{
char flag;
int he,xi,yunh,dengj,p,q;
printf(***************欢迎进入***************\n);
printf(\t(本次实验计算二元表达式的值)\n\n);
do{
printf(请输入P,Q的真值指派(0或1)\n);
printf(p=);
scanf(%d,p);
while(p!=0p!=1)
{
printf(输入有误!请重新输入!\np=);
fflush(stdin);
scanf(%d,p);
}
printf(Q=);
scanf(%d,q);
while(q!=0q!=1)
{
p
文档评论(0)