MIPS语言初学者求数组均值、中位数、众数实现代码
MIPS 实现数组均值、中位数、众数的可运行参考实现
以下代码适配MARS 4.5及以上版本模拟器,无外部依赖,初学者可直接载入运行,测试数组可自行修改.data段的存储值。
完整可执行代码
# 数据段定义 .data arr: .word 12, 7, 19, 7, 4, 7, 22, 15 # 测试数组,共8个元素 arr_len: .word 8 # 数组长度 mean_str: .asciiz "MEAN 均值: " median_str: .asciiz "MEDIAN 中位数: " mode_str: .asciiz "MODE 众数: " newline: .asciiz "\n" # 代码段 .text .globl main main: # -------------------------- # 1. 计算均值MEAN # -------------------------- la $t0, arr # 取数组基地址 lw $t1, arr_len # 取数组长度 li $t2, 0 # 初始化累加和 li $t3, 0 # 初始化循环计数器 mean_loop: bge $t3, $t1, mean_calc sll $t4, $t3, 2 # 计算元素偏移:索引*4字节(字长) add $t5, $t0, $t4 lw $t6, 0($t5) # 加载当前元素 add $t2, $t2, $t6 # 累加到总和 addi $t3, $t3, 1 j mean_loop mean_calc: # 均值 = 总和 / 长度,整数除法得到整数部分,余数*10/长度得到小数点后1位 div $t2, $t1 mflo $t7 # 整数部分存$t7 mfhi $t8 # 余数存$t8 li $t9, 10 mul $t8, $t8, $t9 div $t8, $t1 mflo $t8 # 小数第一位存$t8 # 打印均值结果 li $v0, 4 la $a0, mean_str syscall li $v0, 1 move $a0, $t7 syscall li $v0, 11 li $a0, '.' syscall li $v0, 1 move $a0, $t8 syscall li $v0, 4 la $a0, newline syscall # -------------------------- # 2. 计算中位数MEDIAN # 前置步骤:对数组做升序冒泡排序 # -------------------------- la $t0, arr lw $t1, arr_len li $t2, 0 # 外层循环计数器i sort_outer: sub $t3, $t1, 1 bge $t2, $t3, sort_done li $t4, 0 # 内层循环计数器j sort_inner: sub $t5, $t1, 1 sub $t5, $t5, $t2 bge $t4, $t5, sort_inner_end sll $t6, $t4, 2 add $t7, $t0, $t6 lw $t8, 0($t7) # 取arr[j] addi $t9, $t4, 1 sll $t9, $t9, 2 add $t6, $t0, $t9 lw $t9, 0($t6) # 取arr[j+1] ble $t8, $t9, sort_no_swap # 交换两个相邻元素 sw $t8, 0($t6) sw $t9, 0($t7) sort_no_swap: addi $t4, $t4, 1 j sort_inner sort_inner_end: addi $t2, $t2, 1 j sort_outer sort_done: # 取中位数规则:长度为奇数取中间索引元素,偶数取中间两个元素的平均值 lw $t1, arr_len li $t0, 2 div $t1, $t0 mfhi $t2 # 存长度除以2的余数,判断数组长度奇偶 mflo $t3 # 存中间位置索引 la $t0, arr beq $t2, 0, median_even # 奇数长度分支 sll $t4, $t3, 2 add $t5, $t0, $t4 lw $t6, 0($t5) j median_print median_even: # 偶数长度分支:取索引(n/2-1)和(n/2)的元素计算平均值 addi $t3, $t3, -1 sll $t4, $t3, 2 add $t5, $t0, $t4 lw $t6, 0($t5) # arr[n/2 -1] addi $t3, $t3, 1 sll $t4, $t3, 2 add $t5, $t0, $t4 lw $t7, 0($t5) # arr[n/2] add $t6, $t6, $t7 li $t7, 2 div $t6, $t7 mflo $t6 median_print: li $v0, 4 la $a0, median_str syscall li $v0, 1 move $a0, $t6 syscall li $v0, 4 la $a0, newline syscall # -------------------------- # 3. 计算众数MODE # -------------------------- la $t0, arr lw $t1, arr_len li $t2, 0 # 初始化最高元素出现次数 li $t3, 0 # 初始化众数值 li $t4, 0 # 外层循环计数器i,遍历每个元素 mode_outer: bge $t4, $t1, mode_done sll $t5, $t4, 2 add $t6, $t0, $t5 lw $t7, 0($t6) # 取当前对比元素arr[i] li $t8, 0 # 初始化当前元素的累计出现次数 li $t9, 0 # 内层循环计数器j mode_inner: bge $t9, $t1, mode_inner_end sll $t5, $t9, 2 add $t6, $t0, $t5 lw $t5, 0($t6) bne $t5, $t7, mode_no_count addi $t8, $t8, 1 mode_no_count: addi $t9, $t9, 1 j mode_inner mode_inner_end: ble $t8, $t2, mode_skip move $t2, $t8 # 更新最高出现次数 move $t3, $t7 # 更新当前众数 mode_skip: addi $t4, $t4, 1 j mode_outer mode_done: # 打印众数结果 li $v0, 4 la $a0, mode_str syscall li $v0, 1 move $a0, $t3 syscall # 程序退出 li $v0, 10 syscall
使用说明
- 代码未使用过度抽象的函数封装,每个统计量的计算模块独立带注释,方便初学者逐行调试、理解执行流
- 默认测试数组为
[12,7,19,7,4,7,22,15],运行后控制台预期输出为:- MEAN 均值: 11.6
- MEDIAN 中位数: 9
- MODE 众数: 7
- 如需替换自定义数组,仅需修改
.data段下arr字段的.word列表,同步调整arr_len对应的数组长度值即可 - 均值输出采用整数除法实现1位小数的定点格式,未引入浮点运算逻辑,降低入门学习的理解成本
内容的提问来源于stack exchange,提问作者Alycia
相关产品推荐
相关产品推荐

