版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、逻辑表达式课程设计报告中北大学课程设讣报告2016/2017学年第一学期信息与通信工程学院学院:专业:电子信息科学与技术学生姓名:向伟学号:1503044245课程 设讣题LI:逻辑表达式的合理性判断起迄日期:2016年12月12日,2016年12月30日课程设计地点:科 学楼五院106指导教师:李建民提交报告日期:2016年 月 日1设计要求一、逻辑表达式的合理性判断任务:(自己解析后的具体任务);,编写键盘输入与文件读取表达式的程序;,编写可以依次进行识别判断表达式的程序;,整理表达式错误类型,并且编写分类进行错误原因分析的提示程序;,编写 扫描表达式的程序;,分类编写检测逻辑运算符,操作
2、数以及括号是否合法的程序;,编写删除所 有空格操作的程序二、要求(自己程序能达到的指标),表达式既能手动输入,乂能从文件中读取,并且能有多个表达式;,可以输 入任意表达式(含所有可输入的字符及符号),程序将进行自动判别是否为逻辑表达式;,能自动删除所有空格;,程序可以分析输入的表达式的所有错误类型并输出到显示器上;,程序优先 对括号合法性进行判断,包含所有括号的组合情况;算法分析与程序详解一、整体结构整个程序分为:表达式数据的读取,空格删除,括号(多重)的扫描判断与记 录,运算符的扫描与检测,操作数的扫描与检测。二、各个函数的详细说明:1. Deletespace函数,传入表达式字符数组,以及
3、字符坐标,循环检测并删除 空格,每次调用完该函数后继续检查当前坐标位置是否为空格,若仍然为空格将继 续调用该函数,直至当前位置不再是空格,将继续循环检测下一个坐标。2. Getmount函数:为了解决scanf函数和gets函数同时使用时产生的bug(若使用 了前者再使用或者,或者将会自动接收前者的一个换行符,导致后者第一个数2据无法正常输入),使用该函数将输入的字符数字通过ASCII码转换成整型数 字。3. Operator函数:在对表达式进行从头至尾的扫描过程中若匹配到含逻辑运算 符的字符,则返回成功,否则返回失败,并输出错误类型的提示信息,本次判断将 就此结束。4. Bracket函数:
4、从左至右扫描过程中,发现括号后检查括号是否合法,若合 法,用一个二维数组记录检测到的合法括号的位置信息,并且返回此信息,若不合 法,返回不合法类型,并且输出错误类型的提示信息,本次判断将就此结束。5. Repeat函数:主要检查是否含有重复的无用括号,例如“(xxx)”,具体方 法是,设置该函数返回的缺省值是有重复,在循环检测的过程中,分别用两个数组 记录连续的左右括号的位置,然后用两个for循环实现从左括号位置到右括号位置 的交义扫描,如果出现了括号,则修改缺省值为没有重复,并且立刻跳出内部for 循环的扫描,进行外层for循环的下一次扫描,如果某次内部扫描完毕后都没有出 现括号,则缺省值不
5、会被修改,将直接跳出外层循环,并且返回有重复,输出错误 类型提示,结束本次判断。6. Scan函数:扫描运算符的函数,其扫描方式为根据Bracket函数和提供的位 置进行扫描,如果匹配到运算符,并且检测到该运算符合法,将调用相关运算符检 测函数,进行运算符的检测。7. Single函数:一元运算符及操作数检测函数,根据一元运算符的特征进行判 断该运算符到附近的运算符或者前面左括号后面右括号之间的操作数是否合法,规 定操作数为字母或字母组合为合法。若后面紧接着出现左括号则也认为操作数合 法。8. Double函数:二元运算符及操作数检测函数,根据二元运算符的特征进行判 断该运算符到附近的运算符或
6、者前面左括号后面右括号之间的操作数是否合法,规 定操作数为字母或字母组合为合法。若后面紧接着出现左括号或者询面紧接着出现 右括号则也认为操作数合法。三、程序运行过程每个函数具体如何工作请参考第二部分对各个函数的详细说明。程序从主函数开始运行,首先进入数据来源方式的选择,用变量select表示,输入1或2分别进入文件读取数据和键盘输入数据的程序模块,在读取到数据 后,进入删除空格函数Deletespace函数删除空格后返回新的数据,紧接着调用 Operator函数,检测是否存在运算符,若没有则返回该错误类型,若有则进入 Bracket函数对括号进行扫描,若有括号,括号没有正常成对,则返回该错误类
7、 型,若没有括号,将直接从表达式开始到表达式结尾进行Scan函数扫描,若有括 号,且成对,则调用Repeat函数进行多余重复括号检查,若存在多余括号,则返 回该错误类型,若不存在,则返回Bracket函数生成的括号坐标位置信息,3并根据该信息进行循环Scan函数扫描,如果匹配到运算符,并且检测到该运 算符合法,根据运算符类型的不同选择调用Single函数(一元运算符)和Double函 数(二元运算符),进行操作数检查,若不合法则返回相应错误类型,若合法,则返 回正确。刃外第五部分附有流程图四、错误类型说明函数名返回值错误类型Operator -1表达式无运算符Repeat -2表达式存在多余重
8、复括号Bracket -3表达式括号不成对-4运算符不正确(符号前非法)Scan-5运算符不正确(符号后非法)-6 一元运算符操作数个数有误Single-7操作数直接缺失运算符-8操作数非字母组合-9二元运算符缺失操作数Double-10操作数非字母组合4五、流程图1、表达式数据的读取开始键盘输入selectselectcase标号2标号1 default选择有误键盘输入表达文件读取表重新输入式以及个数n达式结束52. 空格删除操作当发现当前表达式中有空格时,调用Deletespace (char (*string) m, inti, int j)函数开始int t=jstringit!=0&
9、stringit- nNo YesstringCiZ t=stringLiZ t+1;t+6六、运行结果利用文件读取各种错误类型的表达式如下:(按每行四个表达式列出,表达式间用换行隔开)saff & asdf !(fsI fsf)& &da fs!#fs(f|(s|dfs) f|(s|%fsf) (fs!#fs)fsd!fas fds(!fs, da) saf3 dadadaf j sf2+h adaf sf2+h !d(asd)i sa sdaf fa I(dad d)其程序运行部分结果如下图|第1个表达式为:saff & asdf表达式正确!第2个表达式为:!Cfs| |fsf)& &da
10、 表达式正确!第3个表达式为;f 5 !5表达式错误!原因是:运算符不正确(符号后非法)J第4个表达式为;Cfll(sllldfs)表达式错误!原因是:运算符不正确(符号后非法)1第6个表达式为;Cfs!#fs)表达式错误!原因足:运算符不正确(符兮后非法)1*7个表达式为;fsdlfas表达式错误!原因足:一元运算符的操作数个数有误!弟8个表达式为:fds(!fs| |da)表达式错误!原因是:操作数之间缺失运算符!第9个表达式为:saf3| |dad衷达式错谋!原因是:操作数非字母组合!第:LQ个表达戎为:adaf | |sf 2+h 表达式错误!原因是:操作数非字母组合!请选择输入数据来
11、源方武愉入丄选捋縫盘读取.输入2选择文 件读取 select :2请輸入逻辑表达武个数nn=33请綸入霜要测试的逻辑表达式,并以回车键隔开: 文件正存读取.文伴数据己经读取完毕!文件数搞-共有丄S项:举例说明:1. 如输入:Cdll (fs | | da)表达式,经a Deletespace函数删除空格后返回新 的表达式为cdll(fsllda),然后进行Operator函数检查是否存在操作符,此处存在,则 调用Repeat函数进行多余重复括号检查,此处不存在,则进入Bracket函数对括 号进行扫描,此处有括号,并且记录括号位置4、11,然后调用Repeat函数进行 多余重复括号检查,此处无
12、多余括号,然后根据坐标位置信息进行循环Scan函数 扫描,此处扫描到“丨丨”,为二元运算符,则调用Double函数,进行操作数检 查,前面为fs,后面为“da”,均为合法操作数,括号内部扫描完毕后,扫描括号 外部,从位置0,此处扫描到“丨丨”,为二元运算符,则调用Double函数,进行操作数到位 置4检查,前面为“ cd”,后面为“(”,均为合法操作数,最后在位置13扫描到 结束符,则结束当前表达式扫描,并且返回正确提示,进行下一个表达式判断。2. 如输入saff asdf表达式,经过Deletespace函数删除空格后返回新的表达 式为sdff asdf,然后进行Operator函数检查是否
13、存在操作符,此处不存在,则 返回“第1个表达式没有逻辑运算符”的错误提示,并且结束当前表达式判断,进 入下一个表达式的判断。七、总结技术方面:1. 良好的编程习惯真的很重要,它可以帮助自己减少错误率,还能更好更快地 回看和理自己的程序,大大提高程序的可读性。比如写好注释和较好的排版。2. 注意变量的生命周期,既能节省内存资源,乂可以避免变量赋值不正确。3. 编写程序前应该先整理需要考虑的所有情况,包括特殊情况,避免出现bugo4. 除了使用编程环境自带的调试功能逐步或断电调试程序外,还可以自己在程 序中适当位置通过屏幕输出提示进行调试。3. 尽量使用最优算法,既能提高自己的思维能力,乂能使程序
14、简洁而高效。6. 要给每一个函数起一个好名称,做到见名知义的程度方便对程序整体的快速 理解。7. 在编写一个项LI或程序时应事先考虑到需要定义的函数,把且有相同功能的 部分抽象到一个函数时,减少代码冗余。如本程序中的Scan函数。88. 一个函数应该只解决一个功能或问题。心得体会方面:通过近两周的奋斗,课程设计接近了尾声。经过两周的奋战我们的课程设计终于完成了。在没有做课程设讣以前觉得课程设讣只是对C语言这门课程所学知识的 单纯总结,但是通过这次做课程设计发现自己的看法有点太片面。课程设计不仅是 对前面所学知识的一种检验,而且也是对自己能力的一种提高。通过这次课程设计 使我们明白了自己原来知识
15、还比较欠缺。自己要学习的东西还太多,以前老是觉得 自己什么东西都会,什么东西都懂,有点眼高手低。通过这次课程设计,我们才明 白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,提高自 己的知识和综合素质。在这次课程设计中也使我们们的同学关系更进一步了,同学之间互相帮助,有 什么不懂的大家在一起商量,听听不同的看法对我们们更好的理解知识,所以在这 里非常感谢帮助我们的同学。总之,大家都认为万事开头难,不知道如何入手。最后终于做完了有种如释重 负的感觉。此外,还得出一个结论:知识必须通过应用才能实现其价值有些东西 以为学会了,但真正到用的时候才发现是两回事,所以我们认为只有到真正会用的 时候才是真的学会了。通过这次课程设计,我们们即学会了使用VC6.0软件和 codeblocks软件,也掌握了一些有用的知识,这对我们们以后的学习和生活非常 的有帮助,也使得我们们对自己的总体知识水平有了一个了解。懂得了知识的重要 性。使我们学会了如何运用所学的知识收集、归纳相关资料解决具体问题的方法, 加强了我们的动手能力、分析和解决问题的能力、以及增强综合运用知识的能力。 同时对自己应用计算机的水平有了一个更深刻的了解,我们在今后的学习和生活 中,可以有针对性的学习和改善。在此要感谢我们的指导老师李老师对我们的悉心
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度企业市场推广策略委托策划合同3篇
- 唇亡齿寒的意思
- 小的英语单词
- 市场经济与计划经济的关系
- 陇南2024年甘肃陇南市事业单位高层次人才引进83人笔试历年典型考点(频考版试卷)附带答案详解
- 我国特殊医疗用途食品法规
- 铸造历史文化与艺术价值探讨考核试卷
- 防雷接地系统施工考核试卷
- 药物价格影响因素-洞察分析
- 虚拟货币市场分析-洞察分析
- 二氧化碳充装流程
- 12m跨钢栈桥设计计算
- 电路板类英语词汇
- 美国Control4智能家居设计方案解说资料
- DES算法Matlab代码
- 沙特的矿产资源开发概况及其商机
- 高一生物必修一期末试题(附答案)
- 安全事故应急响应程序流程图(共1页)
- 三年级_上册牛津英语期末试卷
- 损伤容限设计基本概念原理和方法PPT课件
- 水压式沼气池设计
评论
0/150
提交评论