使用8086汇编,设计一个毕业生答辩成绩评分系统;通过输入评委的成绩然后统计出答辩学生的答辩成绩,最后显示毕业生的答辩成绩; 基本要求: 6名评委,每个评委给分范围为0~100,由键盘输入;6名评委给分中,平均分为毕业生答辩成绩(精确到小数点后两位,不考虑四舍五入);将最后得分在光标位置处显示出来;
时间: 2024-02-24 12:00:06 浏览: 28
好的,我可以为您提供一下思路和代码实现。
首先,我们需要定义一些变量和常量来存储数据和控制程序流程。
```
; 定义常量
MAX_SCORE EQU 100 ; 最大分数
NUM_JUDGES EQU 6 ; 评委的数量
; 定义数据段
DATA SEGMENT
SCORES DB NUM_JUDGES DUP(?) ; 定义一个NUM_JUDGES大小的数组用于存放评委的成绩
AVERAGE DW ? ; 存放毕业生的平均分数
DATA ENDS
```
接下来,我们需要编写输入评委成绩的子程序,这个子程序将从键盘读取评委的成绩并将其存储在SCORES数组中。
```
; 从键盘读取一个字节
READ_BYTE PROC
MOV AH, 01h ; 读取字符
INT 21h ; 调用DOS中断
RET
READ_BYTE ENDP
; 输入评委成绩
INPUT_SCORES PROC
MOV CX, NUM_JUDGES ; CX寄存器存放评委的数量
MOV SI, OFFSET SCORES ; SI寄存器存放SCORES数组的地址
; 循环读取每个评委的成绩
L1:
CALL READ_BYTE ; 读取一个字节
SUB AL, 30h ; 将ASCII码转换为数字
MOV [SI], AL ; 将成绩存入SCORES数组中
INC SI ; 移动指针到下一个位置
LOOP L1 ; 循环
RET
INPUT_SCORES ENDP
```
然后,我们需要编写一个子程序来计算毕业生的平均分数。
```
; 计算平均分数
CALC_AVERAGE PROC
MOV CX, NUM_JUDGES ; CX寄存器存放评委的数量
MOV SI, OFFSET SCORES ; SI寄存器存放SCORES数组的地址
MOV BX, 0 ; BX寄存器存放累加的分数
; 循环累加分数
L1:
ADD BL, [SI] ; 将分数加入累加器
INC SI ; 移动指针到下一个位置
LOOP L1 ; 循环
; 计算平均分数
MOV AX, BX ; 将累加的分数存入AX寄存器
MOV BX, NUM_JUDGES ; BX寄存器存放评委的数量
DIV BX ; AX除以BX,AX存放商,DX存放余数
MOV [AVERAGE], AX ; 将平均分数存入AVERAGE变量中
RET
CALC_AVERAGE ENDP
```
最后,我们需要编写一个子程序来显示毕业生的答辩成绩。
```
; 显示答辩成绩
DISPLAY_SCORE PROC
MOV AH, 02h ; 设置光标位置
MOV BH, 0 ; 页码
MOV DH, 10 ; 行号
MOV DL, 0 ; 列号
INT 10h ; 调用DOS中断
; 将平均分数转换为字符串
MOV AX, [AVERAGE] ; AX寄存器存放平均分数
MOV BX, 10 ; BX寄存器存放10
XOR CX, CX ; CX寄存器存放字符串长度,初始化为0
MOV DI, OFFSET SCORE_STR ; DI寄存器存放SCORE_STR数组的地址
; 将平均分数转换为字符串
L1:
XOR DX, DX ; DX寄存器存放余数,初始化为0
DIV BX ; AX除以BX,AX存放商,DX存放余数
ADD DL, '0' ; 将余数转换为ASCII码
MOV [DI], DL ; 将数字存入SCORE_STR数组中
INC DI ; 移动指针到下一个位置
; 判断是否除尽
CMP AX, 0
JNZ L1
; 计算字符串长度
SUB DI, OFFSET SCORE_STR ; DI寄存器存放SCORE_STR数组的地址
MOV CX, DI ; CX寄存器存放字符串长度
; 循环输出字符串
MOV AH, 02h ; 设置光标位置
MOV BH, 0 ; 页码
MOV DH, 10 ; 行号
ADD DL, 5 ; 列号
INT 10h ; 调用DOS中断
; 输出字符串
MOV DX, OFFSET SCORE_STR ; DX寄存器存放SCORE_STR数组的地址
MOV AH, 09h ; 输出字符串
INT 21h ; 调用DOS中断
RET
DISPLAY_SCORE ENDP
```
最后,我们需要编写主程序来调用以上编写的子程序。
```
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
MAIN PROC
MOV AX, DATA ; 初始化数据段寄存器
MOV DS, AX
CALL INPUT_SCORES ; 输入评委成绩
CALL CALC_AVERAGE ; 计算平均分数
CALL DISPLAY_SCORE ; 显示答辩成绩
MOV AH, 4Ch ; 退出程序
INT 21h
MAIN ENDP
CODE ENDS
END MAIN
```
以上就是8086汇编实现毕业生答辩成绩评分系统的代码。
需要注意的是,在计算平均分数时,我们使用了除法操作,这个操作可能会产生余数,但我们在本程序中没有考虑余数的处理。我们只需要保证评委给分范围为0~100,那么平均分数在计算时就不会产生余数。如果需要考虑余数的处理,可以在计算平均分数时使用乘法操作来进行计算。