实验子程序设计_第1页
实验子程序设计_第2页
实验子程序设计_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验四子程序设计一. 实验目的:1. 进一步掌握子程序设计方法;2. 进一步掌握基本的DOS功能调用.二. 实验内容:1. 从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2. 统计检查每个学生的名次.3. 将统计结果在屏幕上显示.4. 为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5. 输入要有检错手段.三. 创新功能:1、监测不合法输入,当输入字符不为数字时,报错'Inputillegal!'。且允许用户从将当前错误数据重新输入,不必整体重新输入。2、根据实际情况按百分制换算,当输入为3位数时自动结束读取,且最高分

2、可限定为100分,例如输入999,排名时按照100分计算。3、允许相同成绩的同学存在,不会影响排名。4、允许输入的学生数任意,只要不超过堆栈空间均可。5、输入输出界面友好,用户可以直观地看到名次表,对应学生学号和成绩。6、利用堆栈空间,存储结构优越四. 7、程序采用模块化设计,将实现相同功能的代码聚为宏块或子函数预习题:1. 如何确定一个学生在这门科目中的名次?答:对成绩降序排序,同时记录学号2. 你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:每次查找出当前最小成绩和其所对应学号入栈,这样形成的栈栈顶为最高分,弹栈时可依次降序输出成绩和对应学号,即为名次表。3. 准备好模

3、块层次图.答:见下面流程图4. 给出输出显示的形式.按顺序输入12个学生成绩:100、67、88、89、93、50、6、21、77、77、56、95,按ctrl+z输入结束运行结果为:03C:Wiid:rrSM3.Exf-DEELjTEWW.Escorescorrscorescores匚。臼scorescorescorescore侃fiND.81:ND.02:NO.03:町刖:ND.05:N0.H6:NO07:110,88;Nf盼NO.10:NO41;町12:ofofofofofofofofofstustustusiustu5tLIstusluStuIlid1rdnksru:ui04:09OS

4、:93伽:的07:60R:2t09:10:7711:5&12:SSSTU:12STU;65STU:眺STU:03SIU:09STU:10STU:02STU11STU:06STU:做STUrfi?SfU:STU:STU:SIU:STU:SIU:SIU:STU:STU:STU:STU:STU:SUJWfc:100SMR£:95SCORE:93SC«Rfc:89SCORE:88SCC此:S(XftEr77SCORE:67SCARF:56SCCFIC:50SCCRf;21SCflRE:06Programtfirminatfidnorma11五、代码分析CHGMACROX争数

5、字转换成ASCII码的宏块PUSHAXPUSHBXMOVAX,XMOVBL,10DIVBLADDAL,'0'ADDAH,'0'MOVBH,ALMOVBL,AHMOVX,BXPOPBXPOPAXENDMPRESENTMACROX显示单个字符的宏块MOVAH,02HMOVDL,XINT21HENDMSTRMACROSTRIN®示字符串宏块MOVAH,09HMOVDX,SEGSTRINGMOVDS,DXLEADX,STRINGINT21HENDMINPUTMACRO;输入单个字符宏块MOVAH,01HINT21HENDMDATASEGMENTBUFFDB10

6、0DUP(0疥入输入数据STRING1DB0DH,'Inputillegal!','$'STRING2DB'scoreofstu','$'STRING3DB'100','$'STRING4DB'NO.','$'STRING5DB'Thefinalrankis:','$'STRING6DB'STU:','$'STRING7DB'SCORE:','$'NUMDW1;存入学生人数

7、NUM2DW1PDW1COUNTDB0计数成绩位数COUNT1DW1DATAENDSSTACKSEGMENT'STACK'DB300DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVDX,SEGDATAMOVDS,DXLEASI,BUFF;输入模块LOOP1:MOVBH,'0'MOVBL,'0'STRSTRING2MOVCX,NUM;移入CX进行转换显示CHGCX将当前学号变为ASCIIPRESENTCHPRESENTCLPRESENT':'L3:IN

8、PUTCMPAL,26;输入是否结束JZEXICMPAL,0DHJNZL1L2:INCNUM;输入结束CMPCOUNT,1JZY1MOVSI,BH;存成绩!MOVSI+1,BLJMPY2Y1:MOVBYTEPTR同,'0容输入为一位数时,高位写0MOVSI+1,BHY2:INCSIINCSIMOVCOUNT,0计数变量清零PRESENT0DHPRESENT0AHJMPLOOP1L1:CALLJUDGECMPDL,0JNZLOOP1不合法重新输入INCCOUNTS法代表已经输入了一位数CMPCOUNT,1JNZCNT2MOVBH,AL;输入第一位数JMPL3CNT2:CMPCOUNT,獭

9、入第二位数JNZCNT3MOVBL,ALJMPL3CNT3:MOVBH,40HMOVBL,40HJMPL2输入三位数代表当前输入结束;排序模块EXI:DECNUMMOVAX,NUMMOVNUM2,AX;存起来NUM输入的个数LEASI,BUFFMOVBH,40H;最小数MOVBL,40HMOVDX,NUM;待比较的数的个数LOOP2:CMPNUM,0JZWALILOOP3:MOVCL,SI;当前待比较单元送人SICMPCL,'!'是否为空单元JZPLUSSI则判断下一个CMPCL,BHfl断高位JAPLUSSfc于最小数,跳转判断下一个JBIMOVCL,SI+1判断低位CMPC

10、L,BLJAPLUSSfc于最小数,跳转判断下一个I:MOVBH,SI;更新最小值MOVBL,SI+1MOVDI,SI;存最小值的指针PLUSS:INCSI判断下一个数INCSIDECD涎剩DX个数需要比较CMPDX,0JNZLOOP3PUSHBXft出循环一轮比较完毕LEASI,BUFF;SM新指向待比较的数组首位PUSHCXMOVCX,DISUBDI,SI记录最小值是第几个学生MOVAX,DI;存下二者差值MOVBL,2DIVBL得到实际的学号偏移MOVDI,CXPOPCXMOVP,AXINCPCHGP将学号转换为ASCII码入栈PUSH盼号入栈MOVBYTEPTRDI,'!也栈后

11、相应位置置入特殊符号,下次读取到此符号可不进行判断MOVBYTEPTRDI+1,'!'DECNUM待入栈的变量-1MOVDX,NUM2MOVBH,40H;保证每次寻找最小值前BH、BL中内容为最大值MOVBL,40HJMPLOOP2;显示模块WALI:PRESENT0DHSTRSTRING5PRESENT0DHPRESENT0AHAGAIN:MOVCX,NUM2CMPCX,0是否栈空JNZGOONENDD:MOVAX,4C00HINT21HGOON:STRSTRING4MOVCX,COUNT1CHGCXPRESENTCHPRESENTCLPRESENT':'PO

12、PC澎号弹栈STRSTRING6PRESENTClW出学号PRESENTCLPRESENT20HSTRSTRING6POPCXg绩弹栈STRSTRING7CMPCH,40H是否是满分JZNEARPTRFULPRESENTC目F满分显示分数的高低位PRESENTCLLINE:PRESENT0DHPRESENT0AHDECNUM2INCCOUNT1JMPAGAINFUL:PRESENT瑚分直接显示100PRESENT'0'PRESENT'0'JMPLINEDL=1且输出字符串提示JUDGEPROC判断输入是否合法,合法则DL=0不合法修改MOVDL,0CMPAL,&

13、#39;0'JNBNEXT1W1:STRSTRING1MOVDL,1JMPOVNEXT1:CMPAL,'9'JAW1OV:RETJUDGEENDPCODEENDSENDSTART六、流程图1、输入模块流程图:显示学号提示用户输入成绩2、排名模块流程图3、输出模块流程图:全部成绩出栈?输出排名号显示学号V学号弹栈成绩弹栈显示寄存器中成绩显示100七、程序设计思路与总结本实验主要联系了宏块和子程序调用,属于排序问题。在程序设计时,一个好的存储结构显得尤为重要。一开始我并未采取堆栈结构,而是在数据段开辟了两段内存空间,将输入的成绩段插入排序到另一个名次段,插入排序只需处理N(

14、输入数)个元素,但带来了大量的内存移动,时间复杂度较高,如果名次段存的是ASCII码则移动一个数据元素需要相应移动4个数据单元,于是我改变了存储结构,利用堆栈的后进先出,将最小的元素依次入栈,这样输出时就会按照成绩由大到小输出。且压栈时先压成绩ASCII码再压学号ASCII码,这样输出部分设计就非常容易,只需每次弹栈16位显示就可以。输入字符的处理也是程序设计的一大难点,输入时要判断字符的合法性,如果键入的字符在3个之内(两个数据一个回车或者一个三位数)均合法才能认为是合法数据,否则提示用户重新输入,其次当输入三位数时,实际存储的是两位数40H,40H因为0-9的ASCII码范围为30-39H

15、所以读到40H时自然认为是最大数,输出时只要判断是40H就显示字符串100'。显示模块只要进行相应的弹栈以及显示字符串即可。功能的聚类:由于实验中有些功能需要反复利用,所以将那部分功能写成了宏块或子函数。因为要显示的字符串不同,所以字符串的显示功能以及字符到ASCII的转换需要入口参数,因此选择了宏块设计。而判断字符合法性是通用的,每次字符都会存在AL中,只对AL进行判断即可,因此选择了子程序设计。实验中遇到的问题主要有跳转超出范围问题,可以通过添加中继节点解决;循环变量的修改问题,除法的扩展问题,以及寄存器的利用问题。由于程序变大导致通用寄存器不够用,有可能在调用宏块时修改了内部重要的值,因此在每次利用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论