山东大学汇编语言上机实验 - 实验五 - 图文

发布时间 : 星期日 文章山东大学汇编语言上机实验 - 实验五 - 图文更新完毕开始阅读

子程序设计

2.6显示学生名次表rank

编制一个程序,要求接受键盘输入的一个班的学生成绩,并存放于一个50字的grade数组中,其中grade+i保存学号为I+1的学生成绩。然后根据grade中的学生成绩,把学生成绩依次填入50字的rank数组中,其中rank+i的内容是学号为i+1的学生的名次。再按学号顺序把名次从终端上显示出来。

本题要做的主要工作和例2.2的内容是完全一样的,只是增加了由用户键入学生成绩及输出学生名次两个部分的内容,因此这三个部分可以用子程序结构来完成。子程序结构划分的层次图如图2.17所示,可以看出,main为主要模块,其下一层的三个模块为程序的三大部分。现将各模块说明如下:

1.模块名:main 为总模块

输入:从键盘输入一个班的学生成绩 输出:显示一个班的学生成绩

功能:根据输入的学生成绩,计算并显示学生名次。算法如下:

一个学生名次等于成绩高于该学生的人数+1.

2.模块名:input

输入:以学号为序型键盘输入一个班的学生成绩。各个成绩之间用逗号隔开,最后以回车符号结束。

输出:把一个班的学生成绩存入grade数组。 功能:接受一个班的学生成绩。

调用子模块decibin把键盘输入的一个十进制数转换为二进制数。 调用子模块crlf完成回车,换行功能。

3.模块名:rankp

输入:从grade数组取得一个班的学生成绩。

输出:以学号为序计算出该班每个学生的名次存入rank数组。

功能:计算一个班的学生成绩。算法为:一个学生的名次等于成绩高于该生的学生人数加1.

4,。模块名;output

输入:把rank数组取得一个班的学生名次。

输出:把一个班的学生名次以学号为序在总端上显示出来。 功能:先是一个班的学生名次。

调用子模块decibin把键盘输入的一个十进制数转换为二进制数。 调用子模块crlf完成回车,换行功能。

5:模块名:decilin

输入:从键盘输入一个十进制数。

输出:把该数转换成二进制数并存入BX寄存器中。

功能:从键盘输入一个十进制数转换成二进制数并存入BX寄存器中。

6.模块名:crlf

输出:向终端发出回车换行符。 功能:完成一次回车换行操作。 7.模块名:binidec

输入:从BX寄存器取得一个二进制数。 输出:在终端屏幕显示一个十进制数。

功能:把BX寄存器中的二进制数转换为十进制数,并在终端显示出来。调用子模块DCE_DIV用来作除法运算并显示字符。

8.模块名:dec_div

输入:从BX寄存器中的二进制数除以相应的十的幂,并在屏幕显示一位商。余数保存在BX寄存器中。

有了以上的层次图及模块说明,对程序的全貌有了基本了解。在图2.18中,我们给出了除rankp以外的其余各个子程序的程序框图。Rankp的框图与图2.4相同。图2.19是程序清单,图2.20是本例的运行情况。

;PROGRAM TITLE GOES HERE——Rank

;************************************************************************** datarea segment grade dw 50 dup(?) rank dw 50 dup(?) count dw ? mess1 db 'Grade? $' mess2 db 13,10,'Input Error!',13,10,'$' mess3 db 'Rank: $' datarea ends

;************************************************************************** prognam segment

;-------------------------------------------------------------------------- main proc far assume cs:prognam,ds:datarea start:

;set up stack for return push ds sub ax,ax push ax

;set DS register to current data segment mov ax,datarea mov ds,ax

;MAIN PART OF PROGRAM GOES HERE call input call rankp

call output ret main endp

;-------------------------------------------------------------------------- input proc near lea dx,mess1 mov ah,09 int 21h ; mov si,0 mov count,0 enter: call decibin inc count cmp dl,',' je store cmp dl,13 je exit2 jne error store: mov grade[si],bx add si,2 jmp enter error: lea dx,mess2 mov ah,09 int 21h exit2: mov grade[si],bx call crlf ret input endp

;-------------------------------------------------------------------------- rankp proc near mov di,count mov bx,0 loop1: mov ax,grade[bx] mov word ptr rank[bx],0 mov cx,count lea si,grade next: cmp ax,[si] jg no_count

inc word ptr rank[bx] no_count: add si,2 loop next add bx,2 dec di jne loop1 ret

rankp endp

;-------------------------------------------------------------------------- output proc near lea dx,mess3 mov ah,09 int 21h ; mov si,0 mov di,count next1: mov bx,rank[si] call binidec mov dl,',' mov ah,02 int 21h add si,2 dec di jnz next1 call crlf ret

output endp

;-------------------------------------------------------------------------- decibin proc near

;procedure to conver decimal on keybd to binary. ;result is left in BX register. mov bx,0

;get digit from keyboard,convert to binary newchar: mov ah,1 int 21h mov dl,al sub al,30h jl exit1 cmp al,9d jg exit1 cbw

联系合同范文客服:xxxxx#qq.com(#替换为@)