重言式判别课程设计报告.doc
《重言式判别课程设计报告.doc》由会员分享,可在线阅读,更多相关《重言式判别课程设计报告.doc(43页珍藏版)》请在咨信网上搜索。
1、合肥学院计算机科学与技术系课程设计报告20232023学年第1学期课程 数据结构与算法课程设计题目名称重言式的判别学生姓名王 芳学号专业班级计算机科学与技术14级1班指导教师李红 何立新2023年9月一、题目【问题描述】一个逻辑表达式假如对于其变元的任一种取值都为真,则称为重言式;反之,假如对于其变元的任一种取值都为假,则称为矛盾式;然而,更多的情况下,既非重言式,也非矛盾式。试写一个程序,通过真值表判别一个逻辑表达式属于上述哪一类。【基本规定】(1) 逻辑表达式从终端输入,长度不超过一行。逻辑运算符涉及 |,& 和 ,分别表达或、与和非,运算优先限度递增,但可由括号改变,即括号内的运算优先。
2、逻辑变元为大写字母。表达式中任何地方都可以具有多个空格符。(2) 若是重言式或矛盾式,可以只显示True forever,或False forever,否则显示 Satisfactible 以及变量名序列,与用户交互。若用户对表达式中变元取定一组值,程序就求出并显示逻辑表达式的值。 【测试数据】(1) (A|A)&(B|B)(2) (A&A)&C(3) A|B|C|D|E|A(4) A&B&C&B(5) (A|B)&(A|B)(6) A&B|A&B;O ,0;0,1;1,0;1,1 。二、问题分析1、 一个逻辑表达式假如对于其变元的任一种取值均为真,则称为重言式;反之,假如对于其变元的任一种取
3、值都为假,则称为矛盾式,若对于其变元的任一种取值既有真,又有假,则称其为可满足式。写一个程序通过真值表判别一个逻辑表达式属于上述哪一类。基本规定如下:1) 逻辑表达式从终端输入,长度不超过一行。逻辑运算符涉及“|”、“&”、“”,分别表达或、与、非,运算优先限度递增,但可有括号改变,即括号内的运算优先。逻辑变元为大写字母。表达式中任何地方都可以具有多个空格符。2) 若是重言式或矛盾式,可以只显示“True Forever”或“False Forever”,否则显示运算中每种赋值和与其相相应的表达式的值。2、通过真值表判别逻辑表达式是否为重言式,需解决以下问题:1) 对逻辑表达式中空格符的解决。
4、为了方便对逻辑表达式进行扫描判断,应先去掉表达式中的空格符。2) 算符的优先级问题在带括号的表达式中,界线符涉及左右括号以及表达式起始、结束符“#”。对于一个简朴的表达式求值运算规则如下:(1)从左至右依次计算。(2)先取反,然后相与,后相或。(3)先括号内,后括号外。为统一算法的描述,将运算符和界线符统称为算符。这样,算符集为,&,|,(,),#。根据上述3条规则,两个前后相继出现的算符a1,a2间的优先关系可以归纳如下:(1) 若a1,a2同为“&”或同为“|”,则算符a1的优先级大于a2。(2) “”、“&”、“|”的优先级依次减小。(3) 由于先括号内,后括号外,若a1为“|”、“&”
5、、“”,a2为“(”;或者,a1为“(”,而a2为“|”、“&”、“”,则a1的优先级小于a2。(4) 同理,若a1为“|”、“&”、“”,a2为“)”;或者,a1为“)”,而a2为“|”、“&”、“”,则a1的优先级大于a2。(5) 若a1、a2同为“(”,则a1的优先级小于a2;若a1、a2同为“)”,则a1的优先级大于a2。(6) 表达式的起始、结束符“#”的优先级小于其他所有合法出现的算符。(7) 若a1为“(”,a2为“)”;或者,a1、a2同为“#”,则a1、a2优先级相同。综上所述,将两个相继出现的算符a1、a2的优先关系进行归纳如表1所示。表1 算符a1和a2间的优先关系a1
6、a2|&()#|&(_#_=我们可以将逻辑表达式的计算类比算术表达式的计算,通常借助堆栈来实现按运算符的优先级完毕表达式的求值计算。一个是存放运算符栈,另一个是存放变量或中间结果栈。 (1) 一方面初始化算符栈logic和变量栈,并将表达式的起始符“#”压入算符栈logic。(2) 依次读入表达式中的每个字符。若是变量,则为其分派结构node的size大小的内存,强制转换为bitree类型,并将其压入变量栈variable;若是运算符,则为其分派结构node的size大小的内存,强制转换为bitree类型,并与运算符栈logic的栈顶算符进行优先级比较,并作如下解决: 若栈顶算符a1的优先级低
7、于刚读入的算符a2,则将a2压入运算符栈logic。 若栈顶算符a1的优先级高于刚读入的算符a2,则将a1出栈,同时将变量栈variable出栈一次,得到变量A,再判断栈顶算符a1是否为“”,假如a1不是“”,则继续出栈变量栈variable一次,得到变量B,将a1作为根结点,B作为a1的左孩子,A作为a1的右孩子,并将根结点a1压入变量栈variable;假如栈顶算符a1是“”,则将a1作为根结点,A作为a1的右孩子,a1的左孩子则为空,并将根结点a1压入变量栈。 若栈顶算符a1优先级与刚读入的算符a2的优先级相同,说明左右括号相遇,或者是表达式的起始、结束符相遇,只需将栈顶算符(左括号或起
8、始符)出栈即可;当运算符栈logic空时,算法结束这样就可以将逻辑表达式构导致一棵完整二叉树,根结点是优先级最小的算符(除了括号和起始结束符,在构造二叉树的过程中已被脱去)。如(A|A)&(B|B)构导致的二叉树如图1所示图1 表达式构造的二叉树 1) 变量的赋值问题若只有1个变量,则有21种情况的赋值;若有2个变量,易知有22种情况的赋值;若有3各变量,则有23种情况的赋值,那么假如有n个变量,就有2n种情况的赋值。既然要对变量进行赋值,一方面要找到逻辑表达式中的变量,并拟定变量的个数。 2) 逻辑表达式取值的判断 由上述对运算符的优先级的分析可知,对逻辑表达式的计算,就是中序遍历由优先级拟
9、定的逻辑表达式构成的二叉树。5)重言式的判别可以将给变量的所有赋值的逻辑表达式的逻辑值相加,假如相加结果与2n相等,则为重言式;若相加结果为0,则为矛盾式;否则为可满足式。本问题的关键和难点在于算符优先级的判断和二叉树的构造。三、数据结构的选择和概要设计1、数据结构的选择通过问题分析可知,需要用到的数据结构有堆栈和二叉树。1) 对于堆栈选用顺序栈结构来进行存放算符或变量,存放的都是二叉树的结点。设有两个堆栈,一个是存放运算符栈,另一个是存放变量或中间结果栈。2) 对于二叉树,选用二叉树的链接存储结构,其结点存放得都是表达式中的元素。将表达式构导致一棵二叉树。2、概要设计从整体上可以分为三个模块
10、:第一个模块:属于堆栈和二叉树结点类型的定义typedef struct stack /辨认表达式使用的堆栈定义,它存放的都是树的结构 /栈中的元素都是树的结点结构bitree *base; /栈底指针bitree *top; /栈顶指针int stacksize; /栈容量seqstack;typedef struct node /根据表达式建立的二叉树的结点定义char data;struct node *lchild; struct node *rchild;BiTNode,*bitree;第二个模块:重要函数及其功能。 堆栈的创建void creatstack(sqstack &st)
11、;初始化栈void setstack(seqstack &st);进栈void push(sqstack &st,bitree e);出栈void pop(sqstack &st,bitree &e);将逻辑表达式中的元素转换为二叉树结点的形式,使栈中存储的都是二叉树的结点。void creattree(char s,bitree &tree);通过优先级将逻辑表达式构导致一颗完整的二叉树void create(bitree &zigen,bitree l,bitree r);对逻辑表达式求值int valuetree(bitree tree);生成变量的各种取值组合void creatzuh
12、e(int n,int m,char a);逻辑运算符的优先级判别,返回值为“”、“=”char youxianji(char m,char n);第四个模块为于用户的交互void user();流程图: 图2 程序流程图开始mainmeun输入表达式1. 计算机2. 用户3. 3.返回建树建树计算机穷举用户输入变量值输出结果继续结束213NY四、算法思想1、穷举法思想通过真值表来判断重言式,需要一一给变量赋值,共有2n中情况(n表达变量的个数),这里用到穷举的思想。2、递归与分治思想每给变量赋一组值,通过递归中序遍历二叉树求值,这里用到了递归与分治思想。3、运算符的优先级判断思想(见问题分析
13、算符的优先级问题分析第5页)五、具体设计和重要编码段一方面将用户输入的逻辑表达式存到char *str当中,然后去除逻辑表达式中的空格符。for(;*pstr!=NULL;pstr+,n+)if(strn!= ) strii+=*pstr; /去除表达式中的空格 此时stri当中存储的就是没有空格符的逻辑表达式。通过问题分析,需找到表达式中的变量,并拟定变量的个数。下面的代码就是实现此功能。for(int k=0;k=65&strik=90)/找到变量 int mark=0; /标记变量for(int j=0;ji)%2。用一下代码可以实现第n次对变量的赋值组合int lzp=m;for(in
14、t i=0;ii)%2;lzp-;下面说明优先级的判断。char bijiao77用来存放算符间的优先关系表中的数据。int i,j; bijiao77= ,|,&,(,),#, /二维数组比较优先级先后|,&, ,(, ,#, ,=;for(i=0;i7;i+)if(bijiao0i=a2) /找到a2运算符的列号break;for(j=0;j、=65&int(*s)data=*s; push(variable,variables); /入变量栈else if(int(*s)90|int(*s)data) case data=*s;push(logic,logics);break; case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 重言式 判别 课程设计 报告
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。