资源预览内容
第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
第9页 / 共21页
第10页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
席堂况遂实验报告(/学年第一学期)课程名称离散数学实验名称 利用真值表法求主析取范式及主合取范式的实现实验时间年 月 日指导单位指导教师学生姓名班级学号学院(系)专业实验报告实验名称利用真值表法求主析取范式及 主合取范式的实现指导教师实验类型上机实验学时4实验时间一、实验目的和要求能够列出合式公式的真值表并给出相应主析取范式和主合取范 式。二、实验环境(实验设备)硬件:PC机。软件:Code:Blocks (C+)三、实验原理及内容内容:编程实现用真值表法求任意含三个以内变量的合式公式的主析取范式和主合取范式 -原理:首先读入变元个数,然后读入合式公式,用堆栈的知识将中缀表达式转化为后缀表达式,调用否定、析取、合取、条件、双条件的函数计算P、Q、R取不同真值时合式公式的真值,然后输出真值表,调用计算主析取范式和主合取范式的函数并输出。程序:#include#include#include#includeusing namespace std;string OriginalForm; /原式string业史_;/主合取范式string _Xiqu_;/主析取范式cWss_ SeqStak/建立一个堆,利用将中缀表达式转为后缀表达式public:SeqStack(int mSize);SeqStack();char Top();bool Push(char x);bool Pop();private:char *st;int top;int maxtop;_;_SeqStack:SeqStack(int mSize)maxtop = mSize - 1;top = -1;:ststSeqStack:SeqStack()deletest;char SeqStack:Top()return sttop;bool SeqStack:Push(char x)if(top = maxtop)return false;st+top = x;return true;bool SgSPo)oo iqeqqtac iV: ropif(top = -1)return false;top;return true;int p, q, r, s, t, u;int a, b, result;int v =0;void Not()void Not()否定();result = a = 1 0 : 1;(result);void Or()析取result = a + b;result = result 1 1 : resultint number;/用number表示变元的个数 SeqStack stack(200);(result);void And() /合取 result = a * b; -L U/ kJ LX _L L/CXkJ ;(result);VOid - If()/条件,b_-aresult = (b = 1 & a = 0) 0 : 1 (result);void Doubleif() /双条件result = (b = a) 1 : 0;bool CanIn(char out)/优先级的判断char in =();int i, o;switch(in)return true;elsereturn false;void InfixToPostfix()/中缀表达式转后缀表达式,string tmp = ;一一(#_)_;for(int i = 0; (unsigned)i (); i+)一Jif(OriginalFormi = P | OriginalFormi = Q ?riginalForm顼二M_PriginalFormLi_=_S:LOriginalForm_Li =T | OriginalFormi = U)(tmp=tmp+OriginalFormi;continue;if(CanIn(OriginalFormi)(OriginalFormi);else if(OriginalFormi=)(while() !=()二二顼_(_;_:!elsedotmp = tmp + ();_(!; while(!CanIn(OriginalFormi);while() != #)二:1 ();();OriginalForm = tmp;void _ Calculate()/计算主析取范式和主合取范式的函数if(number = 3)一Jfor(int i = 0; (unsigned)i :If(); break;case |:Or(); break;case &:And(); break;case !:Not(); break;_一if_(number 一二 2)一Jfor(int i = 0; (unsigned)i (); i+)(if(OriginalFormi = P | OriginalFormi = Q)(v = OriginalFormi = P p : q;_(v);continue;_if(OriginalFormi != !)a =();:二二二一b = _()_;_(!;case -:Doubleif(); break;case :If(); break;case |:Or(); break;case &:And(); break;cmeai ; iVCX.LX.;void Print()cout Pt Qt Rt Z = 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) + ) + &cout p t q t r t result endl;一Jif(number = 2)cout Pt Qt Z endl;二 F)二二Calculate();if(result = 1)Xiqu _=Xiqu _ +_ ;_(+_ _(p _=_ 1 _ _ ?_:_ ;J_P)_ + _&+_ _(q _ = 1 _ Q _:_ _!_Q)_ + _)_+_elseHequ 二 jHequ_+_(+_(p 二=0 _ :P_:_P2u:L+ (q = 0 Q :!Q)+ ) + & ;coutendl;_if(_= g)()二 2);_if(_= J0)()-2);cout 主析取范式:Xiqu endl endl;cout 主合取范式: Hequ endl endl;int main()int flag=1;while(flag=1)一JSetConsoleTextAttribute(GetStdHandle(STP_output_handle)2foreground_intensityFOREGROUND_GREEN|FOREGROUND_BLUE)_;_/设置绿色和蓝色相加,(即青色)systemCsls);/清屏coutendl;cout 欢迎使用! endlendl;cout _ _ _ !表示否定_ _ endKlel;cout|表示析取endlendl;cout&表示合取endlendl;cout表示条件endlendl;cout -表示双条件 endl;coutendl;cout _endl number;cout _请输入合式公式:;switch(number)(case _2:cout_ endl _ 变元请用 M、Q 表示 endl _ endl; break;case 3:cout endl 变元请用 P、Q、R 表示 endl str;OriginalForm二str;InfixToPostfix();Print();coutendlflag;_return 0;开始流程图:Y是否继续使用(Y/N)输入变元个数输入合式公式输出真值表输出主析取范式 和主合取范式N计算主析取范式和 主合取范式退出程序举例使用:四、实验小结(包括问题和解决方法、心得体会、意见
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号