1、 显示学生名次表
编制一个程序,要求接受从键盘输入的一个班的学生成绩,并存放50字的grade数组中,其中grade+i保存的是学号为i+1的学生的成绩。然后根据grade中的学生的成绩,把学生名次填入50字的rank数组中,其中rank+1的内容是学号为i+1学生的名次。再按学号顺序把名次中终端显示出来。
2、 说明:该程序的模块如下
(1) 主模块:总控模块
输入:从键盘输入一个班的学生成绩
输出:显示一个班的学生名次
功能:根据输入的学生成绩,计算并显示学生的名次。
(2) 模块:input
输入:以学号为顺序从键盘上输入一个班的学生成绩。各个成绩之间用逗号隔开,最后以回车符结束。
输出:把一个班的学生成绩存入grade数组。
功能:接收一个班的成绩。调用子模块decibin(可自己命名)把从键盘输入的一个十进制转换为二进制数。
(3) 模块:rankp
输入:从grade数组中取得一个班的成绩
输出:以学号为序计算出该班每个学生的名次存入rank数组中。
功能:计算一个班的学生名次。算法:一个学生的名次等于成绩高于该生的学生人数加1。
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:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
call input
call rankp
call output
ret
main endp
input proc near
lea dx,mess1
mov ah,9
int 21h
mov si,0
mov count,0
enter:
call decbin
inc count
cmp dl,','
je store
cmp dl,13
je exit
jne error
store:
mov grade[si],bx
add si,2
jmp enter
error:
lea dx,mess2
mov ah,9
int 21h
exit:
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 ncount
inc word ptr rank[bx]
ncount:
add si,2
loop next
add bx,2
dec di
jnz loop1
ret
rankp endp
;
output proc near
lea dx,mess3
mov ah,9
int 21h
mov si,0
mov di,count
next1:
mov bx,rank[si]
call bindec
mov dl,','
mov ah,02h
int 21h
add si,2
dec di
jnz next1
call crlf
ret
output endp
;十进制转换成二进制
decbin proc near
mov bx,0
newchar:
mov ah,1
int 21h
mov dl,al
sub al,30h
jl exit0
cmp al,39h
jg exit0
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit0: ret
decbin endp
;二进制转换成十进制
bindec proc near
push bx
push cx
push si
push di
mov cx,100d
call decdiv
mov cx,10d
call decdiv
mov cx,1d
call decdiv
pop di
pop si
pop cx
pop bx
ret
bindec endp
;
decdiv proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
decdiv endp
;回车换行
crlf proc near
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
int 21h
ret
crlf endp
prognam ends
end start