您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 微机课程设计报告―计算器
中南大学微机应用系统设计与综合实验设计报告设计题目四则混合运算器程序设计指导老师设计者专业班级设计日期第一章实验课题与要求1.1课程在教学计划中的地位和作用《微机应用系统设计与综合实验》课程是测控技术专业本科生必修的一门技术基础课程。通过该课程的学习使学生对微机系统有一个全面的了解、掌握常规芯片的使用方法、掌握简单微型计算机应用系统软硬的设计方法。通过课程设计进一步锻炼我们在微型计算机应用方面的实际工作能力。计算机科学在应用上得到飞速发展,因此,学习这方面的知识必须紧密联系实际:掌握这方面的知识更要强调解决实际问题的能力。我们要着重学会面对一个实际问题,如何去自己收集资料,如何自己去学习新的知识,如何自己去制定解决问题的方案并通过实践不断地去分析和解决前进道路上的一切问题,最终到达胜利的彼岸。1.2实验课题与要求1.2.1实验课题课题:四则混合运算器程序设计设计内容:按照屏幕提示输入算术表达式,例如:3+2,9*5,10-5,45/2等,然后计算相应的表达式的结果并按十进制形式输出显示。按ESC键则退出计算器菜单界面并返回dos系统,否则继续输入表达式,求得对应的结果。1.2.2实验要求实验设计要求:1.遵循模块化、结构化的程序设计方法。2.要求程序必须正确。3.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。4.要求程序结构合理,语句使用得当。5.适当追求编程技巧和程序运行效率。1.2.3工作条件使用的设备及软件为8086兼容机及MASM汇编开发软件。1.2.4运算器功能简介本计算器具体来说有以下功能和特点:(1)输入一个正数后按回车可以直接输出该正数;(2)输入一个负数后按回车可以直接输出该负数;(3)可以进行有符号数的加运算;(4)可以进行有符号数的减运算;(5)可以进行有符号数的加、减运算;(6)可以进行有符号数的乘运算;(7)可以进行有符号数的除运算;(8)可以进行有符号数的乘、除运算;(9)可以进行有符号数的加、减、乘、除四则运算;(10)支持使用括号改变运算顺序;(11)输入一个数值不是很大的合法的算术表达式并按回车,可以得到正确的结果;(12)程序采用的数据长度为16位,运算结果范围是:-32768~32767.第二章程序设计方案2.1程序需求分析该程序设计的关键是要根据四则运算中()、*、/、+、-、=的优先级设置符号的权值,其中(、*、/、+、-、)、=的权值分别设置为5、4、4、3、3、1、0,然后根据权值的大小进行运算。程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。程序不断判断输入的符号是否是左括号‘(’,当遇到左括号是在存储区MARK保存其符号,紧跟着将‘(’的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇到右括号‘)’时括号内运算将结束。需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有‘+、-’运算符及紧跟着的权值,然后按照+、-运算符的左右顺序从左到右进行‘+、-’运算,当最后遇到等号‘=’时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式2.2主程序流程图=N是符号是数字YYNNY开始清屏初始化首地址是数字、符号还是=输入字符保存数值(SIGN1)=0设置符号权值DI+2(SIGN1)=0是否是‘(’是否是‘)’输出欢迎界面(SIGN2)=0ERRORNYYNYNYNNYYNYN(SIGN2)+1(SIGN2)-1(SI)=‘M’(CH)(SI)是否是等号是否是‘)’SI+1(SI)=ALSI+1是否是‘(’(SI)=(CH)(SI)=‘(’SI-1SI-1(CH)=2CL=(SI)是何种运算进行相应的运算输出表达式的值初始化首地址NY图2.1总流程图第三章程序各模块的设计3.1题目分析根据题目要求,可以把程序的工作过程划分为运算表达式输入、计算、结果输出三部分。因此在编写程序时可以按此把程序大致划分为三个模块。3.2运算表达式输入用户通过键盘输入的运算表达式为一个ASCII码字符串,字符串的最后一个字符是“=”号。对于这个运算表达式,“+、-、*、/、(、)、0~9、=”是合法的表达式内容,其他的字符则是无法进行运算的非法内容,因此需要首先进行表达式合法性检查。另外,由于计算机能进行计算的是2进制的补码,因此还需要把以ASCII码表示的数值转换为补码的形式并加以保存。当然,控制运算方式的符号也要进行保存。因此,“运算表达式输入”这个模块可以细化为:表达式合法性检查、数值的ASCII码到补码转换及保存、符号的保存三个小部分,如图3.1所示。数值的补码转换及保存运算表达式合法性检查运算符的保存图3.1“运算表达式输入”的流程图3.2.1运算表达式合法性的检查方法观察“ASCII字符编码表”,可以发现“+、-、*、/、(、)”的ASCII码由28H到2FH,而“0~9”的ASCII码则由30H到39H,因此只需对输入的字符一个一个地进行数值范围比较,看看是否处于28H~39H这个范围里面,即可区分输入的表达式是否合法,流程图如图3.2所示。此流程图是采用循环输入字符的方法,每输入一个字符即进行判断。读者也可以采用输入字符串的方法,把整个运算表达式接收完毕后再进行判断。输入字符是否为ESC结束DI+2输入字符是“=”小于28H大于39H小于30H输入结束是否是是是否否否是符号,执行相应处理是数值,执行相应处理图3.2运算表达式合法性检查流程图一另一方面,对于含有括号的运算表达式,当左括号的数量与右括号数量不相等时,表达式也是非法的。因此,可以设置一个起始值为0的变量(下面称其为配对标志),当输入“(”时此变量加一,当输入“)”时减一,则当表达式输入结束时,只需判定此配对标志是否为0,即可判定左右括号数量是否相等。输入是符号是“(”是“)”否配对标志加1配对标志减1是是保存符号否输入结束配对标志为0出错,退出进行计算是否图3.3运算表达式合法性检查流程图二3.2.2数值的补码转换方法要进行数值的ASCII码到补码的转换,首先就得判断输入的字符是数值还是符号。根据上文所提,“+、-、*、/、(、)”的ASCII码由28H到2FH,而“0~9”的ASCII码则由30H到39H,只需比较字符是否小于等于2FH(或小于30H)即可判断是否为符号,否则则是数值,如图2所示。众所周知,要把一个ASCII码数值转换为二进制补码的形式,只需要对其减30H即可实现。但如果输入的是多位数,例如123,那么计算机获得的是31H、32H、33H三个字节,即使分别对这三个字节进行减30H操作,也只是获得1、2、3三个数而已。实际上可以利用加权的方法合并这几个数:123=1×100+2×10+3×1但另一个问题是,由于输入是随机的,即输入的运算数有多少位是未知的,因此无法使用上面的方面静态确定每一位的权重。这里介绍的方法是,每输入运算数的一位,则把前面的合并结果(称为原值)乘以10再与这一位相加,实现动态的加权合并。例如:令原值为0,输入1,结果为:0×10+1=1输入2,结果为:1×10+2=12输入3,结果为:12×10+3=123即:123=(((0×10+1)×10+2)×10)+3。数值的补码转换流程如图4所示,当然,在获得第一个数值输入前要先把原值设置为0。输入是数值结果作为新的原值保存减30H与原值的10倍相加图3.4数值的补码转换流程图由于符号全部是一个字节,无需进行任何转换即可保存,处理简单,这里不作探讨。3.3计算由于运算表达式有多个数值和符号,而符号有不同的优先级别,因此上文提到的数值保存和符号保存应该分开两个地方进行保存,这样有利于表达式的计算算法设计。下面把“+、-、*、/”称为运算符,把“(、)”称为优先符。1212*34+563456*+数值存储符号存储(a)1212*(34+56-8)3456*(数值存储符号存储(b)8+-)1212*21-((34+56-8)+1)2134*(数值存储符号存储(c)56+-)81-(+)图3.5运算表达式的存储举例观察图5的三条运算表达式,再联系四则混合运算的优先原则,可以归纳出几点:(1)数值的数量是运算符的数量加1(优先符不算),第1个运算符代表第1、2个数值的运算操作,第N个运算符代表第N、N+1个数值的运算操作……(2)每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值,仍然满足(a)。例如图3.5(a),当完成乘法运算后,数值存储区有408、56两个数,符号存储区有“+”一个运算符。(3)括号(优先符)的作用是把括号内的运算符的优先级别提高到比外部高。因此,要实现运算表达式的运算,最重要的就是确定所有运算符的优先级别。下面讨论运算符优先级别的编程设计方法。3.3.1运算优先级别的静态确定法此方法是完成了把整条运算表达式全部存入数值存储区和符号存储区后才开始对运算符优先级进行判断的方法:(1)设置“*、/”的优先级为2、“+、-”的优先级为1;(2)括号内部的所有运算符的优先级全部加2。运用优先级别静态确定法处理图3.5的三条表达式的运算符,结果如图3.6所示。其中图3.6(c)的“34+56-8”由于被括号括起两次,因此其两个运算符“+、-”的优先级别均加了两次2。1212*34+563456*+数值存储符号存储(a)1212*(34+56-8)3456*(数值存储符号存储(b)8+-)1212*21-((34+56-8)+1)2134*(数值存储符号存储(c)56+-)81-(+)21优先级2优先级332优先级5513图3.6运算符的静态优先级别最后,由于四则混合运算遵循从左往右计算的原则,即相同优先级别的运算符靠左的优先。因此,只需计算出符号存储区里面的所有运算符的优先级别,然后根据优先级的大小先后执行运算符对应的运算即可实现计算(当然每进行一次运算,相应的运算符即被消除,而参与运算的两个数值合并为一个数值)。当数值存储区里面剩下一个数值时,运算结束,这个最后的数值就是运算的最终结果。请同学们自行设计此算法的流程图。3.3.2运算优先级别的动态确定法运算优先级别静态确定法具有容易理解、实现简单的优点,而其缺点是:如果运算表达式太长、太多数值和符号时,则会占用较多的存储空间,而且计算优先级的工作量也会增多。动态确定法是在运算表达式未结束输入即开始计算的一种方法。由于在表达式输入阶段已开始计算,因此计算结果的速度比静态确定法快。观察图3.5(a),当用户输入“+”时,已经可以开始计算“12*34”;观察图3.5(b),当用户输入“-”时,已经可以开始计算“34+56”;观察图3.5(c),当用户输入第一个“-”时,已经可以开始计算“12*21”。也就是说,当用户输入的运算符的优先级不大于前一个运算符时,即可开始前一个运算符的计算。问题是,对于有括号的运算表达式,在用户没有完成运算表达式的全部输入前,很难提前确定括号内部运算符的优先级。为了解决这个问题,动态确定法把优先符(括号)也赋予了优先级:(1)“(”,优先级为5;(2)“*、/”,优先级为4;(3)“+、-”,优先级为3;(4)“)”,优先级为1。计算图3.5三条运算表达式的所有符号的优先级别,结果如图3.7所示。1212*34+563456*+数值存储符号存储(a)1212*(34+56-8)3456*(数值存储符号存储(b)8+-)1212*21-((34+56-8)+1)2134*(数值存储符号存储(c)56+-)81-(+)43优先级4优先级334优先级3333551115图3.7运算符的动态优先级别设计计算的条件:(1)只有优先级为3、4的符号(即+、-、*、/)可以进行计算;(2)如果某符
本文标题:微机课程设计报告―计算器
链接地址:https://www.777doc.com/doc-3511789 .html