子程序设计
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