1 / 25
文档名称:

离散数学实验报告.doc

格式:doc   大小:339KB   页数:25页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

离散数学实验报告.doc

上传人:梅花书斋 2020/3/17 文件大小:339 KB

下载得到文件列表

离散数学实验报告.doc

相关文档

文档介绍

文档介绍:实验报告(/年第一学期)课程名称离散数学实验名称利用真值表法求取主析取范式以及主合取范式的实现实验报告实验名称利用真值表法求取主析取范式以及主合取范式的实现指导教师实验类型验证实验学时4实验时间实验目的和要求内容:编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。要求:能够列出任意合式公式的真值表并给出相应主析取和主合取范式。二、实验环境(实验设备)X86架构计算机操作系统:Windows732bitIDE::C++编译器:GCC三、实验原理及内容内容:编程实现用真值表法求取任意数量变量的合式公式的主析取范式和主合取范式。原理:先将中缀表示式转换成后缀表示式,再将后缀表示式中每一个字母变量一一赋值,用递归枚举的方法枚举所有赋值情况,而且用map映射将每一个字母变量与当前被枚举的值一一映射,对每一种赋值情况调用后缀表示式计算函数计算后缀表示式的值,打印真假情况。如果是真,记录到名为zhen的vector不定长数组中,如果是假,记录到名为jia的vector不定长数组中。最后根据zhen和jia的不定长数组来打印主析取范式和主合取范式。此程序能够实现任意数量的字母变量的主析取范式求取和主合取范式求取,以及真值表打印。实验报告第一步:预处理预处理,去除中缀表示式中条件->中的>,和双条件<=>中的=和>,这样,所有的运算符只是一个字符,后期处理起来更加方便。voidddd(){ string::iteratori=();//string类迭代器,需在头文件加入#include<string> intflag=1; while(flag){flag=0;for(i=();i!=();++i){if(*i=='>'){(i);flag=1;break;}if(*i=='='){(i);flag=1;break;}} }}第二步:将中缀表示式转换后缀表示式利用栈和优先级函数来将中缀表示式转换成后缀表示式,此函数另一个功能是将中缀表示式中所有出现过的字母变量都保存包名为alpha的string类中(string类为STL中的string,需要在头文件加入#include<string>),而且alpha中不出现重复字母,这样,()函数就能够得到所有字母变量的个数,而且方便后面枚举赋值映射。全局变量:stringzhong;//中缀表示式charhou[1000];//后缀表示式stringalpha;//存放所有字母变量优先级函数:inticp(chara)//栈外优先级{ if(a=='#')return0; if(a=='(')return12; if(a=='!')return10; if(a=='&')return8; if(a=='|')return6; if(a=='-')return4; if(a=='<')return2; if(a==')')return1;}intisp(chara)//栈内优先级{ if(a=='#')return0; if(a=='(')return1; if(a=='!')return11; if(a=='&')return9; if(a=='|')return7; if(a=='-')return5; if(a=='<')return3; if(a==')')return12;}voidchange()//中缀表示式转换后缀表示式{ intj=0; stack<char>s;//定义临时栈,需要在头文件加入#include<stack> charch,y; ('#'); chart1,t2; stringstreamss(zhong);//字符串流,需要在头文件加入#include<sstream> while(ss>>ch,ch!='#') { if(isalpha(ch))//判断是不是字母,如果是,加入到alpha字符串中{ hou[j++]=ch;//而且加入到后缀表示式字符串中 if((ch)==-1) { (ch); } } elseif(ch==')') { for(y=(),();y!='(';y=(),()) { hou[j++]=y; } } else { for(y=(),();icp(ch)<=isp(y);y=(),()) { hou[j++]=y; } (y); (ch); } } while(!()) {