使用8086汇编设计一个班级成绩管理系统;统计计算学生的成绩,然后对学生的按统计成绩进行排名,最后输出学生的名次; 基本要求 接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2024-02-03 18:02:49 浏览: 126
以下是一个简单的班级成绩管理系统的8086汇编代码,实现了输入学生成绩、计算学生总成绩和排名,并将结果输出到屏幕上。
```
.model small
.stack 100h
.data
grade db 30, 5 dup('$') ; 存放学生成绩的数组
rank db 30, 5 dup('$') ; 存放学生名次的数组
newline db 10, 13, '$' ; 换行符
.code
mov ax, @data
mov ds, ax
; 输入学生成绩
mov cx, 30 ; 循环30次,输入30个学生的成绩
mov si, offset grade
input:
mov ah, 0ah ; 调用DOS中断21h的0ah功能,从键盘输入字符串
mov dx, si ; 存放字符串的地址
int 21h
; 计算总成绩
mov al, [si+2] ; al = 成绩1
add al, [si+4] ; al = 成绩1 + 成绩2
add al, [si+6] ; al = 成绩1 + 成绩2 + 成绩3
add al, [si+8] ; al = 成绩1 + 成绩2 + 成绩3 + 成绩4
add al, [si+10]; al = 总成绩
mov [si+12], al; 将总成绩存入数组中
add si, 14 ; 移动到下一个学生的成绩
loop input
; 排名
mov cx, 30 ; 循环30次,对30个学生进行排名
mov si, offset grade
rank_loop:
mov al, [si+12] ; al = 总成绩
mov bh, 0 ; bh = 0,用于比较
; 比较当前学生的总成绩和其他学生的总成绩
inner_loop:
cmp si, offset grade + 14*cx ; 如果是最后一个学生,则跳过比较
jz end_inner_loop
mov bl, [si+14] ; bl = 另一个学生的总成绩
cmp al, bl ; 比较两个学生的总成绩
jbe not_greater ; 如果当前学生的总成绩不大于另一个学生的总成绩,则跳过交换名次
inc bh ; 否则,当前学生的名次加1
not_greater:
add si, 14 ; 移动到下一个学生的成绩
loop inner_loop
end_inner_loop:
; 将当前学生的名次存入数组中
mov [offset rank + cx], bh
dec cx
cmp cx, 0
jne rank_loop
; 输出结果
mov cx, 30 ; 循环30次,输出30个学生的成绩和名次
mov si, offset grade
mov di, offset rank
output:
mov ah, 9 ; 调用DOS中断21h的09h功能,输出字符串
mov dx, si ; 输出学生成绩
int 21h
mov ah, 9
mov dx, di ; 输出学生名次
int 21h
mov dx, offset newline ; 输出换行符
int 21h
add si, 14 ; 移动到下一个学生的成绩
add di, 5 ; 移动到下一个学生的名次
loop output
mov ax, 4c00h ; 退出程序
int 21h
end
```
阅读全文