x86汇编利用dosbox写出该程序主要功能设计一个班级成绩管理系统;统计计算学生的成绩,然后对学生的按统计成绩进行排名,最后输出学生的名次; 基本要求 接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,各数据的格式为: 学号,成绩1,成绩2,...,成绩5 然后根据grade中的学生成绩,把学生名次填入rank数据组中,并显示出来, 格式为: 学号,名次
时间: 2023-11-09 19:08:31 浏览: 84
好的,下面是该班级成绩管理系统的x86汇编代码,使用dosbox运行:
```
; 定义常量
MAX_STUDENT_NUM equ 30 ; 最大学生数
MAX_SCORE_NUM equ 5 ; 每个学生的最大成绩数
SCORE_SIZE equ 2 ; 成绩数所占的字节数
; 定义数据段
data segment
prompt db "Please input student scores:", 0ah, 0dh, "$"
grade db MAX_STUDENT_NUM * (MAX_SCORE_NUM + 1) * SCORE_SIZE dup (0) ; 存储学生成绩
rank db MAX_STUDENT_NUM * SCORE_SIZE dup (0) ; 存储学生名次
data ends
; 定义堆栈段
stack segment
dw 100h dup (0) ; 堆栈
stack ends
; 定义代码段
code segment
start:
mov ax, data
mov ds, ax ; 初始化数据段
mov ax, stack
mov ss, ax ; 初始化堆栈段
mov sp, stack ; 初始化堆栈指针
; 输出提示信息
mov ah, 9
mov dx, offset prompt
int 21h
; 输入学生成绩
mov cx, MAX_STUDENT_NUM
mov di, offset grade
input_loop:
mov ah, 0ah
mov dx, di
int 21h ; 读入学生成绩
add di, MAX_SCORE_NUM * SCORE_SIZE + 1 ; 下一个学生
loop input_loop
; 计算学生总分并排序
mov cx, MAX_STUDENT_NUM
mov di, offset grade
calc_loop:
xor bx, bx ; 总分清零
mov si, di
add si, SCORE_SIZE ; 跳过学号
mov dx, MAX_SCORE_NUM
score_loop:
add bx, word ptr [si] ; 累加总分
add si, SCORE_SIZE ; 下一个成绩
loop score_loop
mov word ptr [di], bx ; 将总分存储到grade数组
add di, MAX_SCORE_NUM * SCORE_SIZE + 1 ; 下一个学生
loop calc_loop
mov cx, MAX_STUDENT_NUM
mov di, offset grade
mov si, offset rank
sort_loop:
xor bx, bx
mov dx, MAX_STUDENT_NUM
inner_loop:
mov ax, word ptr [di + SCORE_SIZE]
cmp ax, word ptr [di + MAX_SCORE_NUM * SCORE_SIZE + SCORE_SIZE] ; 比较总分
jg swap
add di, MAX_SCORE_NUM * SCORE_SIZE + 1 ; 下一个学生
loop inner_loop
mov ax, word ptr [si] ; 学号
mov word ptr [di + SCORE_SIZE], ax ; 交换学号
mov ax, word ptr [si + SCORE_SIZE] ; 名次
mov word ptr [di + MAX_SCORE_NUM * SCORE_SIZE + SCORE_SIZE], ax ; 交换名次
add si, SCORE_SIZE ; 下一个学生
jmp next
swap:
xchg ax, bx ; 交换总分
mov word ptr [di + SCORE_SIZE], ax
mov word ptr [di + MAX_SCORE_NUM * SCORE_SIZE + SCORE_SIZE], bx
next:
add di, MAX_SCORE_NUM * SCORE_SIZE + 1 ; 下一个学生
loop sort_loop
; 输出学生名次
mov cx, MAX_STUDENT_NUM
mov di, offset grade
mov si, offset rank
output_loop:
mov ah, 2 ; 输出学号
mov dl, [di]
int 21h
mov ah, 9
mov dl, ','
int 21h
mov ax, word ptr [si + SCORE_SIZE] ; 输出名次
add ax, '0'
mov dl, ah
int 21h
mov dl, al
int 21h
mov ah, 9
mov dl, 0ah
int 21h
add si, SCORE_SIZE ; 下一个学生
add di, MAX_SCORE_NUM * SCORE_SIZE + 1 ; 下一个学生
loop output_loop
; 退出程序
mov ah, 4ch
int 21h
code ends
end start
```
该程序的主要思路是先读入学生成绩,然后计算每个学生的总分,并将总分存储到grade数组中。接着使用冒泡排序算法对学生总分进行排序,并将名次存储到rank数组中。最后按照学生的学号和名次输出结果。
阅读全文