离散数学实验-求真值表

上传人:shaoy****1971 文档编号:108147544 上传时间:2019-10-22 格式:DOC 页数:18 大小:136KB
返回 下载 相关 举报
离散数学实验-求真值表_第1页
第1页 / 共18页
离散数学实验-求真值表_第2页
第2页 / 共18页
离散数学实验-求真值表_第3页
第3页 / 共18页
离散数学实验-求真值表_第4页
第4页 / 共18页
离散数学实验-求真值表_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《离散数学实验-求真值表》由会员分享,可在线阅读,更多相关《离散数学实验-求真值表(18页珍藏版)》请在金锄头文库上搜索。

1、一一 实验目的实验目的 .3 二二 实验内容实验内容 .3 三三 实验环境实验环境 .3 四四 实验原理和实现过程(算法描述)实验原理和实现过程(算法描述) .3 五五 实验数据及结果分析;实验数据及结果分析; .5 六六 源程序清单;源程序清单; .9 七七 其他收获和体会。其他收获和体会。 .18 一一 实验目的实验目的 熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用 它们来解决实际问题。 二二 实验内容实验内容 1. 从键盘输入两个命题变元 P 和 Q 的真值,求它们的合取、析 取、条件和双条件的真值。 (A) 2. 求任意一个命题公式的真值表(B,并根据真值表求主范式 (C)

2、 ) 三三 实验环境实验环境 C 或 C语言编程环境实现。 四四 实验原理和实现过程(算法描述)实验原理和实现过程(算法描述) A A:首先提示用户输入真值指派,然后判断用户输入的是否是 0 或者 1,如果不是则利用 while 语句提示错误,然后提示重新输入 直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含, 双条件的变量赋值,再以两行表格形式输出所得结果。最后提示按# 键退出,否则继续循环求真值。 B B: 主要思路:首先提示用户输入表达式,然后编写并调用一个函数 将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式 中的变量名存储到数组 bianlN中,然后输出存好的各变量

3、名及用 户输入的表达式(建立表头) ,将每次的真值指派存在数组 zhi中, 编写函数 zzhi()每次调用 zzhi()时都使数组 zhi中的真值加 1, (利用递推实现加一时可能的进位, )然后编写并调用一函数 qiuzhi()计算每次真值指派下的逆波兰表达式的值,再输出各真 值指派和求出的表达式的真值,然后调用函数 zzhi()将真值指派 的数组加 1,最后外围利用 while 语句循环输出每个不同的真值指 派和该指派下表达式的值。 将表达式转换成逆波兰式并将变量提取的算法:首先需要分配 2 个栈,一个作为临时存储运算符的栈 fu,一个作为输入逆波兰式 的栈 nibol,从中缀式的左端开始

4、取字符,逐序进行如下步骤: (1)若取出的字符是字母,则该字母直接送入 nibol栈。同 时为了找出所有变量,将该变量名与数组 bianl中已有的元素比 较,如果 bianl中还没有该字母,则该字母是新出现的变量,将 其录入数组 bianl中。 (2)若取出的字符是“(” ,则直接送入 fu栈栈顶。 (3)若取出的字符是“) ” ,则将距离 fu栈栈顶最近的 “(”之间的运算符,逐个出栈,依次送入 nibol栈,此时抛弃 “(” 。 (4)若取出的字符是运算符,则将该运算符与 fu栈栈顶元 素比较,如果该运算符优先级大于 fu栈栈顶运算符优先级, (此 处是编写程序时自己判断好优先级了再按不同

5、情况处理)则将该运 算符进 fu栈,否者,将 fu栈的栈顶运算符弹出,送入 nibol 栈中,直至 fu栈栈顶运算符低于(不包括等于)该运算符优先级, 则将该运算符送入 fu栈。 (5) 重复上面的 14 步,直至处理完所有的输入字符 (6)最后将残留在符号栈 fu中的运算符依次出栈。 由于是用数组做的栈,所以,使用逆波兰式求值时只需直接从 数组 nibol的第一个元素 nibol0开始依次读取就行了。 计算逆波兰式的值的算法:把转换好的逆波兰式从 nibol0开 始依次读取,如果是字母,则先判断字母是第几个变量,将数组 zhi(存放了真值指派)中对应的真值 zhii放入数组 result (

6、作为一个栈)中,遇到双目运算符就将 result中栈顶的两个元 素出栈,执行运算,得到的结果再入栈,如果是单目运算符!,则 只将一个元素出栈并计算和入栈。 增值:用一个数组存放每一次的真值指派,并用递推实现真值 的加 1 进位: zzhi(int n) /数组 zhi 存每次的真值指派,调用 zzhi(bl+1);时给 n 赋值为变量 数加 1,以防止最后一个输出完时再增值时溢出 if(zhin=0) zhin=1; else if(zhin=1) zhin=0; zzhi(n-1); /递推,实现进位 C C:在 B 的基础上加了两个二维数组 biao,biao2,将真值为 1 和 0 的真

7、值指派分别存在数组 biao和 biao2中,然后按 合取和析取主范式的不同定义,用循环将对应真值的变量以原或反 变量形式输出期间也输出合取、析取符和括号,使之成为主范式 再编写好主要的功能之后,我又在源程序基础上加了一些判断输 入错是的提示和处理。具体见实验数据分析和源程序的注释 五五 实验数据及结果分析;实验数据及结果分析; A A:当输入的真值不为 0 或者 1 时提示错误并要求重新输入 可循环输入直到输入#才退出,如图所示,以表格的形式输出结 果,并且真值都正确 B B 和和 C C: 首先提示输入表达式(合取、析取、蕴含、双条件分别用flag;flag; intintint he,x

8、i,yunh,dengj,p,q;he,xi,yunh,dengj,p,q;he,xi,yunh,dengj,p,q; printf(“*printf(“*printf(“*欢迎进入欢迎进入欢迎进入*n“);*n“);*n“); printf(“t(printf(“t(printf(“t(本次实验计算二元表达式的值本次实验计算二元表达式的值本次实验计算二元表达式的值)nn“);)nn“);)nn“); dododo printf(“printf(“printf(“请输入请输入请输入 P,QP,QP,Q 的真值指派(的真值指派(的真值指派(0 0 0 或或或 1 1 1)n“);n“);n“);

9、 printf(“p=“);printf(“p=“);printf(“p=“); scanf(“%d“,scanf(“%d“,scanf(“%d“, while(p!=0np=“);np=“); fflush(stdin);fflush(stdin);fflush(stdin); scanf(“%d“,scanf(“%d“,scanf(“%d“, printf(“Q=“);printf(“Q=“);printf(“Q=“); scanf(“%d“,scanf(“%d“,scanf(“%d“, while(q!=0nQ=“);nQ=“); fflush(stdin);fflush(stdin);

10、fflush(stdin); scanf(“%d“,scanf(“%d“,scanf(“%d“, he=(p=1he=(p=1he=(p=1 xi=(p=1|q=1)?1:0;xi=(p=1|q=1)?1:0;xi=(p=1|q=1)?1:0; yunh=(p=0|q=1)?1:0;yunh=(p=0|q=1)?1:0;yunh=(p=0|q=1)?1:0; dengj=(p=q)?1:0;dengj=(p=q)?1:0;dengj=(p=q)?1:0; printf(“tPtQtPQtPQtPQtPQn“);printf(“tPtQtPQtPQtPQtPQn“);printf(“tPtQtP

11、QtPQtPQtPQn“); printf(“t%dt%dprintf(“t%dt%dprintf(“t%dt%d t%dt%dt%d t%dt%dt%d t%dt%dt%d ttt %d“,p,q,he,xi,yunh,dengj);%d“,p,q,he,xi,yunh,dengj);%d“,p,q,he,xi,yunh,dengj); printf(“nt(printf(“nt(printf(“nt(按按按# # #退出,其它任意键继续退出,其它任意键继续退出,其它任意键继续)n“);)n“);)n“); fflush(stdin);fflush(stdin);fflush(stdin);

12、 scanf(“%c“,scanf(“%c“,scanf(“%c“, while(flag!=#);while(flag!=#);while(flag!=#); B B B 和和和 C C C: #include#include#include #include#include#include #include#include#include #include#include#include #define#define#define N N N 202020 charcharchar yuanN*N=0,fuN=0,nibolN*N=0,bianlN;yuanN*N=0,fuN=0,nibo

13、lN*N=0,bianlN;yuanN*N=0,fuN=0,nibolN*N=0,bianlN; intintint zhiN=0;zhiN=0;zhiN=0; /全局变量分别存储原表达式全局变量分别存储原表达式全局变量分别存储原表达式 yuanyuanyuan,求逆波兰式时的符号,求逆波兰式时的符号,求逆波兰式时的符号 fufufu, /存储逆波兰式存储逆波兰式存储逆波兰式 nibolnibolnibol,存储变量,存储变量,存储变量 bianl,bianl,bianl,存储真值指派存储真值指派存储真值指派 zhizhizhi, intintint nitop=-1,ftop=-1,bl=-

14、1;nitop=-1,ftop=-1,bl=-1;nitop=-1,ftop=-1,bl=-1; /存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标存储逆波兰式和求逆波兰式时要用到的存符号的数组的栈顶指针以及变量下标 intintint error0=0;error0=0;error0=0; intintint biaoN*NN,geshu=0;/biaoN*NN,geshu=0;/biaoN*NN,geshu=0;/存储使真值为一的真值指派,用来求主析取范式存储使真值为一的真值指派,用来求主析取范式存储使

15、真值为一的真值指派,用来求主析取范式 intintint biao2N*NN,geshu2=0;biao2N*NN,geshu2=0;biao2N*NN,geshu2=0; voidvoidvoid main0();/main0();/main0();/函数声明函数声明函数声明 nibolan()nibolan()nibolan() /将输入的表达式转换为逆波兰式将输入的表达式转换为逆波兰式将输入的表达式转换为逆波兰式 intintint i,j,k,flag,fg=-1;i,j,k,flag,fg=-1;i,j,k,flag,fg=-1; /flag/flag/flag 记录某变量是否已出现,记录某变量是否已出现

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号