•随机⽣成N个score值,范围[0,100],统计:
•当score>=90时,记为A;
•当90>score>=75时,记为B;
•当75>score>=60时,记为C;
•当60>score时,记为D;
•汇总:
•显示出N个score值
•显示输出A、B、C、D四组成绩的百分⽐
•加分项:
•交互UI;
•分数⽀持浮点、汇总结果⽀持浮点
•当Score > 100 或 Score < 0时提示异常
•随机⽣成N个score值,范围[0,100],统计:
•当score>=90时,记为A;
•当90>score>=75时,记为B;
•当75>score>=60时,记为C;
•当60>score时,记为D;
•汇总:
•显示出N个score值
•显示输出A、B、C、D四组成绩的百分⽐
•加分项:
•交互UI;
•分数⽀持浮点、汇总结果⽀持浮点
•当Score > 100 或 Score < 0时提示异常
首先生成随机的分数,然后统计每个等级的分数个数,最后计算并显示每个等级所占的百分比。请确保在适当的环境中运行此代码,例如 DOSBox 或其他支持 x86 汇编语言的模拟器。
.model small
.stack 100h
.data
N dw 20 ; 生成的分数个数
scores db 20 dup(?) ; 存储分数的数组
countA dw 0 ; A 等级计数
countB dw 0 ; B 等级计数
countC dw 0 ; C 等级计数
countD dw 0 ; D 等级计数
msgA db 'Percentage of A: $'
msgB db 'Percentage of B: $'
msgC db 'Percentage of C: $'
msgD db 'Percentage of D: $'
buffer db 6, ' $' ; 缓存用于转换数字为字符串
.code
main proc
mov ax, @data
mov ds, ax
mov es, ax
; 初始化随机数种子
mov ax, 0
mov cx, N
call generate_scores
; 统计各等级计数
mov cx, N
lea si, scores
xor di, di
count_loop:
lodsb
mov bx, ax
cmp bx, 90
jge A_grade
cmp bx, 75
jge B_grade
cmp bx, 60
jge C_grade
jmp D_grade
A_grade:
inc word ptr countA
jmp next_score
B_grade:
inc word ptr countB
jmp next_score
C_grade:
inc word ptr countC
jmp next_score
D_grade:
inc word ptr countD
jmp next_score
next_score:
loop count_loop
; 显示分数
mov cx, N
lea si, scores
call print_scores
; 计算和显示百分比
mov ax, countA
call print_percentage
lea dx, msgA
call print_string
mov ax, countB
call print_percentage
lea dx, msgB
call print_string
mov ax, countC
call print_percentage
lea dx, msgC
call print_string
mov ax, countD
call print_percentage
lea dx, msgD
call print_string
; 结束程序
mov ax, 4c00h
int 21h
main endp
; 生成随机分数的过程
generate_scores proc
mov dx, 40h
mov ah, 2ch
int 21h
add ax, dx
mov word ptr [si], ax
xor di, di
generate_loop:
call random
mov [si+di], al
inc di
loop generate_loop
ret
generate_scores endp
; 生成随机数的过程
random proc
; 这里使用简单的线性同余生成器
mov ax, word ptr [si]
mov dx, 0
mov cx, 75
mul cx
add ax, 74
mov word ptr [si], ax
mov al, ah
ret
random endp
; 打印分数的过程
print_scores proc
lea dx, scores
mov cx, N
print_loop:
lodsb
call print_num
loop print_loop
ret
print_scores endp
; 打印字符串的过程
print_string proc
mov ah, 09h
int 21h
ret
print_string endp
; 打印百分比的过程
print_percentage proc
mov bx, N
mov dx, 0
div bx
call print_num
mov ah, 09h
lea dx, buffer+2
int 21h
ret
print_percentage endp
; 打印数字的过程
print_num proc
mov bx, 10
xor cx, cx
print_num_loop:
xor dx, dx
div bx
add dl, '0'
push dx
inc cx
cmp ax, 0
jne print_num_loop
lea si, buffer
add si, cx
mov byte ptr [si], '$'
print_num_pop:
pop dx
mov [si-1], dl
dec si
loop print_num_pop
lea dx, buffer+2
mov ah, 09h
int 21h
ret
print_num endp
end main