实用标准文档文案大全实验报告(/学年第一学期)课程名称离散数学实验名称利用真值表法求主析取范式及主合取范式的实现实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专业实用标准文档文案大全实验报告实验名称利用真值表法求主析取范式及主合取范式的实现指导教师实验类型上机实验学时4实验时间一、实验目的和要求能够列出合式公式的真值表并给出相应主析取范式和主合取范式。二、实验环境(实验设备)硬件:PC机。软件:Code::Blocks(C++)三、实验原理及内容内容:编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式。原理:首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。实用标准文档文案大全程序:#includeiostream#includestring#includeconio.h#includewindows.husingnamespacestd;stringOriginalForm;//原式stringHequ;//主合取范式stringXiqu;//主析取范式classSeqStack//建立一个堆栈,利用将中缀表达式转为后缀表达式{public:SeqStack(intmSize);~SeqStack();charTop();boolPush(charx);boolPop();private:char*st;inttop;intmaxtop;};实用标准文档文案大全SeqStack::SeqStack(intmSize){maxtop=mSize-1;top=-1;st=newchar[mSize];}SeqStack::~SeqStack(){delete[]st;}charSeqStack::Top(){returnst[top];}boolSeqStack::Push(charx){if(top==maxtop)returnfalse;st[++top]=x;returntrue;}boolSeqStack::Pop()实用标准文档文案大全{if(top==-1)returnfalse;top--;returntrue;}intp,q,r,s,t,u;inta,b,result;intv=0;intnumber;//用number表示变元的个数SeqStackstack(200);voidNot()//否定{a=stack.Top();stack.Pop();result=a==1?0:1;stack.Push(result);}voidOr()//析取{result=a+b;实用标准文档文案大全result=result1?1:result;stack.Push(result);}voidAnd()//合取{result=a*b;stack.Push(result);}voidIf()//条件,b-a{result=(b==1&&a==0)?0:1;stack.Push(result);}voidDoubleif()//双条件{result=(b==a)?1:0;stack.Push(result);}boolCanIn(charout)//优先级的判断{charin=stack.Top();inti,o;实用标准文档文案大全switch(in){case'#':i=0;break;case'(':i=1;break;case'-':i=3;break;case'':i=5;break;case'|':i=7;break;case'&':i=9;break;case'!':i=11;break;case')':i=12;break;}switch(out){case'#':o=0;break;case'(':o=12;break;case'-':o=2;break;case'':o=4;break;case'|':o=6;break;case'&':o=8;break;case'!':o=10;break;case')':o=1;break;}实用标准文档文案大全if(io)returntrue;elsereturnfalse;}voidInfixToPostfix()//中缀表达式转后缀表达式{stringtmp=;stack.Push('#');for(inti=0;(unsigned)iOriginalForm.length();i++){if(OriginalForm[i]=='P'||OriginalForm[i]=='Q'||OriginalForm[i]=='R'||OriginalForm[i]=='S'||OriginalForm[i]=='T'||OriginalForm[i]=='U'){tmp=tmp+OriginalForm[i];continue;}if(CanIn(OriginalForm[i]))stack.Push(OriginalForm[i]);elseif(OriginalForm[i]==')'){实用标准文档文案大全while(stack.Top()!='('){tmp=tmp+stack.Top();stack.Pop();}stack.Pop();}else{do{tmp=tmp+stack.Top();stack.Pop();}while(!CanIn(OriginalForm[i]));stack.Push(OriginalForm[i]);}}while(stack.Top()!='#'){tmp=tmp+stack.Top();stack.Pop();}实用标准文档文案大全stack.Pop();OriginalForm=tmp;}voidCalculate()//计算主析取范式和主合取范式的函数{if(number==3){for(inti=0;(unsigned)iOriginalForm.length();i++){if(OriginalForm[i]=='P'||OriginalForm[i]=='Q'||OriginalForm[i]=='R'){v=OriginalForm[i]=='P'?p:OriginalForm[i]=='Q'?q:r;stack.Push(v);continue;}if(OriginalForm[i]!='!'){a=stack.Top();stack.Pop();b=stack.Top();实用标准文档文案大全stack.Pop();}switch(OriginalForm[i]){case'-':Doubleif();break;case'':If();break;case'|':Or();break;case'&':And();break;case'!':Not();break;}}}if(number==2){for(inti=0;(unsigned)iOriginalForm.length();i++){if(OriginalForm[i]=='P'||OriginalForm[i]=='Q'){v=OriginalForm[i]=='P'?p:q;stack.Push(v);continue;}实用标准文档文案大全if(OriginalForm[i]!='!'){a=stack.Top();stack.Pop();b=stack.Top();stack.Pop();}switch(OriginalForm[i]){case'-':Doubleif();break;case'':If();break;case'|':Or();break;case'&':And();break;case'!':Not();break;}}}}voidPrint(){if(number==3){实用标准文档文案大全coutP\tQ\tR\tZendl;for(p=1;p=0;p--){for(q=1;q=0;q--){for(r=1;r=0;r--){Calculate();if(result==1)Xiqu=Xiqu+(+(p==1?P:!P)+&+(q==1?Q:!Q)+&+(r==1?R:!R)+)+|;elseHequ=Hequ+(+(p==0?P:!P)+|+(q==0?Q:!Q)+|+(r==0?R:!R)+)+&;coutp\tq\tr\tresultendl;}}实用标准文档文案大全}}if(number==2){coutP\tQ\tZendl;for(p=1;p=0;p--){for(q=1;q=0;q--){Calculate();if(result==1)Xiqu=Xiqu+(+(p==1?P:!P)+&+(q==1?Q:!Q)+)+|;elseHequ=Hequ+(+(p==0?P:!P)+|+(q==0?Q:!Q)+)+&;coutp\tq\tresultendl;}}}coutendl;if(Xiqu.length()!=0)实用标准文档文案大全Xiqu.erase(Xiqu.length()-2);if(Hequ.length()!=0)Hequ.erase(Hequ.length()-2);cout主析取范式:Xiquendlendl;cout主合取范式:Hequendlendl;}intmain(){intflag=1;while(flag==1){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);//设置绿色和蓝色相加(即青色)system(cls);//清屏cout-----------------endl;cout欢迎使用!endlendl;cout!表示否定endlendl;cout|表示析取endlendl;cout&表示合取endlendl;实用标准文档文案大全cout表示条件endlendl;cout-表示双条件endl;cout-----------------endl;coutendl输入你的变元数目:;cinnumber;cout请输入合式公式:;switch(number){case2:coutendl变元请用P、Q表示endlendl;break;case3:coutendl变元请用P、Q、R表示endlendl;break;}charstr[100];cinstr;OriginalForm=str;InfixToPostfix();Print();coutendl是否继续使用?(继续请按1,退出请按0):;cinflag;}return0;实用标准文档文案大全}流程图:开始输入变元个数输入合式公式输出真值表计算主析取范式和主合取范式输出主析取范式和主合取范式Y是否继续使用(Y/N)实用标准文档文案大全N举例使用:退出程序实用标准文档文案大全实用标准文档文案大全实用标准文档文案大全四、实验小结(包括问题和解决方法、心得体会、意见与建议等)刚开始思考如何写这个程序的时候,我不知道该如何处理输入进来的合式公式,在翻阅了数据结构书籍之后我才忽然反应过来,可以用堆栈的知识,将输入进来的中缀表达式转化为后缀表达式,这样就方便计算合式公式的真值了。这次离散数学实验中,我成功地将所学习得C++的编程知识和数据结构里的堆栈的知识运用了起来,虽然中途遇到了一些困难,但最终都很好地解决了。这次实验让