You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 00:54:05