按学号顺序把学生名次从终端上显示出来
一、实验内容
开发一个程序,功能包括:输入一个班级的学生成绩,存储在50字节的ERGADE数组中;根据ERGADE数组中的成绩,将学生的排名信息填充到50字节的RANK数组中;最后,按学号顺序在终端上显示每位学生的排名。
提示:
① 主程序MAIN
功能:基于输入的学生成绩,计算并展示学生排名。
② 子程序INPUT
功能:接收并记录一个班级学生的成绩,成绩间以空格分隔。
③ 子程序RANKP
功能:计算一个班级学生的排名。
④ 子程序OUTPUT
功能:显示一个班级学生的排名。
⑤ 子程序DECIBIN
功能:将十进制数转换为二进制,并存储在BX寄存器中。
⑥ 子程序BINDEC
功能:将二进制数转换为十进制,并在屏幕上显示。
⑦ 子程序DEC_DIV
功能:将BX寄存器中的内容除以CX寄存器的内容,并显示结果的一位商。
二、实验步骤
1.自行编写主程序和子程序。
2.输入本班学生某门基础课程的成绩。
三、实验报告
- 程序说明。说明程序的功能、结构。
功能:键入一个班的学生成绩,然后根据成绩,按学号顺序把名次从终端上显示出来。
结构:
- 调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。
问题1:如何输入两位数
先输入一个数,乘以10,作为十位上的数,在输入一个数,作为个位上的数,两者相加,结果放入一个寄存器中。
问题2:成绩排序
将成绩存入另一个数组中,每次选出最大的数,记录下最大数的位置,并把排名写入名次列表对应的位置上,将数组最大的数置为-1,循环直至所有的数变为-1。
编译
连接
运行
- 源程序清单
数据段
data segment
id dw 50 dup(?) ; 数组id,存储50个学生的学号
erade dw 50 dup(?) ; 数组erade,存储50个学生的成绩
rank dw 50 dup(?) ; 数组rank,存储50个学生的排名
e2 dw 50 dup(?) ; 数组e2,用于排序操作的辅助数组
s1 db 'Please input the score','0DH','0AH','$' ; 提示输入成绩的字符串
s2 db '| id |score|rank|','$' ; 显示表格标题的字符串
s3 db '----------------','$' ; 表格分隔线
s4 db '| ','$' ; 表格列分隔符
ente db 0DH,0AH,'$' ; 换行符
count dw 0 ; 学生计数器
data ends
代码段
code segment
assume cs:code,ds:data
start:
mov ax,data ; 初始化数据段
mov ds,ax
; 输入部分
mov si,0 ; 初始化偏移指针
call input ; 调用输入子程序
; 换行
call ent
; 排序
mov dx,1 ; 初始化排名
mov bx,count ; 设置外循环次数
call sort ; 调用排序子程序
; 显示成绩和排名
mov dx,offset s3
mov ah,09h
int 21h ; 打印分隔线
call ent ; 换行
mov dx,offset s2
mov ah,09h
int 21h ; 打印标题
call ent ; 换行
mov cx,count
mov si,0
call display ; 调用显示子程序
mov dx,offset s3
mov ah,09h
int 21h ; 打印分隔线
; 结束程序
mov ah,4ch
int 21h
输入子程序
input proc
; 输入并处理学生成绩,转换为数字存储
; 循环直到输入非空格字符
; 保存学生学号和成绩
ret
input endp
输出子程序
output proc
; 显示学生的学号、成绩或排名
ret
output endp
总输出子程序
display proc
; 依次显示每个学生的学号、成绩和排名
ret
display endp
排序子程序
sort proc
; 对学生成绩进行排序,计算排名
; 使用选择排序算法
ret
sort endp
其他辅助子程序
ent proc
; 执行换行
ret
ent endp
edg proc
; 输出表格的列分隔符
ret
edg endp
程序结束
code ends
end start