文档介绍:实验报告(2016 /2017学年第一学期)课程名称离散数学实验名称利用真值表法求取主析取范式以及主合取范式的实现  实验报告实验名称利用真值表法求取主析取范式以及主合取范式的实现指导教师 实验类型验证实验学时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(!()){y=();();if(y!='#'){hou[