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

下载本文档

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

文档简介

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

2、当输入为3 位数时自动结束读取,且最高分可限定为 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 输入结束运行结果为:03 C: W ii d:rr- DEEL j TEhiEscoreofstu0:09scoreof&tlj05;93ofV tilscoreofsiu67:6scrimofstu08;?lscoreofoy:scoreofstu10;77scoreofstu11:116Lscore0-fstu12:95Il

4、 he final ranlkis;'NlJ.Bl:STUitilsru:SCnRE:100NO.62;STU;12STU;SCCFM::95NO.03:STU:05STU:SCCRE:93HQ血:STU:M4SIU:SC«Rfc:89IND.05:STU;83STU;SCARE:88N0.H6:SIU:09SI LI:SCCttt: /NO.07:STUr10sru:SCXFIE:77No.ea:STU:02STU:SCORE 167N( R9:STU:11STU:SCARF:56NO 10:STU:06STU:SCCRC:50NO 41;STU:湘STU;$GCRf:21

5、NO.12:STU:ft?STU:SCCRE:06Programtcrminatfid norma 11 “五、代码分析CHG MACRO X将数字转换成ASCII码的宏块PUSH AXPUSH BXMOV AX,XMOV BL,10DIV BLADD AL,'0'ADD AH,'0'MOV BH,ALMOV BL,AHMOV X,BXPOP BXPOP AXENDMPRESENT MACRO X显示单个字符的宏块MOV AH,02HMOV DL,XINT 21HENDMSTR MACRO STRIN显示字符串宏块MOV AH,09HMOV DX,SEG STR

6、INGMOV DS,DXLEA DX,STRINGINT 21HENDMINPUT MACRO;输入单个字符宏块MOV AH,01HINT 21HENDMDATA SEGMENTBUFF DB 100 DUP(0存入输入数据STRING1 DB 0DH,'Input illegal!','$' STRING2 DB 'score of stu ','$'STRING3 DB '100','$'STRING4 DB 'NO.','$'STRING5 DB 'Th

7、e final rank is:','$'STRING6 DB ' STU:','$' STRING7 DB ' SCORE:','$'NUM DW 1;存入学生人数NUM2 DW 1P DW 1COUNT DB 0计; 数成绩位数COUNT1 DW 1DATA ENDSSTACK SEGMENT 'STACK'DB 300 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START: MOV DX,SEG DATAMO

8、V DS,DXLEA SI,BUFF; 输入模块LOOP1: MOV BH,'0'MOV BL,'0'STR STRING2MOV CX,NUM;移入CX进行转换显示CHG CX将当前学号变为 ASCIIPRESENT CHPRESENT CLPRESENT ':'L3: INPUTCMP AL,26输入是否结束JZ EXICMP AL,0DHJNZ L1L2: INC NUM;输入结束CMP COUNT,1JZ Y1MOV SI,BH;存成绩!!!MOV SI+1,BLJMP Y2Y1: MOV BYTE PTR SI,'0当输入为一位

9、数时,高位写 0 MOV SI+1,BHY2: INC SIINC SIMOV COUNT,。计数变量清零PRESENT 0DHPRESENT 0AHJMP LOOP1L1: CALL JUDGECMP DL,0JNZ LOOP1不合法重新输入INC COUNT合法代表已经输入了一位数CMP COUNT,1JNZ CNT2MOV BH,AL;输入第一位数JMP L3CNT2:CMP COUNT,2输入第二位数JNZ CNT3MOV BL,ALJMP L3CNT3:MOV BH,40HMOV BL,40HJMP L2输入三位数代表当前输入结束; 排序模块EXI:DEC NUMMOV AX,NUM

10、MOV NUM2,AX;存起来NUM输入的个数LEA SI,BUFFMOV BH,4 0H;最小数MOV BL,40HMOV DX,NUM;待比较的数的个数LOOP2: CMP NUM,0JZ WALILOOP3: MOV CL,SI当前待比较单元送人 SICMP CL,'!'是否为空单元JZ PLUS是则判断下一个CMP CL,BH判断高位JA PLUSSfc于最小数,跳转判断下一个JB IMOV CL,SI+1判断低位CMP CL,BLJA PLUSSfc于最小数,跳转判断下一个I: MOV BH,SI;更新最小值MOV BL,SI+1MOV DI,SI存最小值的指针PLU

11、SS: INC SI判断下一个数INC SIDEC DX还剩DX个数需要比较CMP DX,0JNZ LOOP3PUSH BX跳出循环一轮比较完毕LEA SI,BUFF;S重新指向待比较的数组首位PUSH CXMOV CX,DISUB DI,SI记录最小值是第几个学生MOV AX,DI;存下二者差值MOV BL,2DIV BL得到实际的学号偏移MOV DI,CXPOP CXMOV P,AXINC PCHG P将学号转换为ASCI I码入栈PUSH P学号入栈MOV BYTE PTR DI,'!入栈后相应位置置入特殊符号,下次读取到此符号可不进行判断MOV BYTE PTR DI+1,&#

12、39;!'DEC NUM待入栈的变量-1MOV DX,NUM2MOV BH,40H;保证每次寻找最小值前BH、BL中内容为最大值MOV BL,40HJMP LOOP2; 显示模块WALI:PRESENT 0DHSTR STRING5PRESENT 0DHPRESENT 0AHAGAIN: MOV CX,NUM2CMP CX,0是否栈空JNZ GOONENDD:MOV AX,4C00HINT 21HGOON: STR STRING4MOV CX,COUNT1CHG CXPRESENT CHPRESENT CLPRESENT ':'POP CX学号弹栈STR STRING6

13、PRESENT CH;出学号PRESENT CLPRESENT 20HSTR STRING6POP CX成绩弹栈STR STRING7CMP CH,40 H是否是满分JZ NEAR PTR FULPRESENT CHF满分显示分数的高低位PRESENT CLLINE:PRESENT 0DHPRESENT 0AHDEC NUM2INC COUNT1JMP AGAINFUL: PRESENT '1满'分直接显示 100PRESENT '0'PRESENT '0'JMP LINEDL=1且输出字符串提示JUDGE PROC判断输入是否合法,合法则DL=

14、0不合法修改MOV DL,0CMP AL,'0'JNB NEXT1W1: STR STRING1MOV DL,1JMP OVNEXT1: CMP AL,'9'JA W1OV: RETJUDGE ENDPCODE ENDSEND START六、流程图1、输入模块流程图:2、排名模块流程图3、输出模块流程图:七、程序设计思路与总结本实验主要联系了宏块和子程序调用, 属于排序问题。 在程序设计时, 一个好的存储结构显 得尤为重要。 一开始我并未采取堆栈结构, 而是在数据段开辟了两段内存空间, 将输入的成 绩段插入排序到另一个名次段,插入排序只需处理N (输入数)个元素

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

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

温馨提示

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

评论

0/150

提交评论