不使用内置函数计算中位数:VB代码无法正确求解求助
问题排查与修正方案
你的代码主要在中位数计算逻辑、变量类型匹配和拼写错误这几个地方存在问题,下面逐一说明并给出修正后的完整代码:
主要错误点
- 中位数索引计算错误:
- 奇数个数时,原代码
n(aantal + 1) / 2逻辑完全错误,正确逻辑是取数组第(aantal + 1) \ 2位(1索引数组,用整数除法定位中间位置)。 - 偶数个数时,存在拼写错误
aatnal(应为aantal),且公式错误,正确逻辑是取中间两个数的平均值:(n(aantal\2) + n(aantal\2 + 1)) / 2。
- 奇数个数时,原代码
- 变量类型不匹配:排序时使用的
temp是Integer类型,但数组n是Single类型,交换时会丢失小数精度,应将temp改为Single。 - 注释混淆:排序部分注释写的是"bubble sort names",但实际是排序数字,建议修正注释避免混淆。
修正后的完整代码
Sub CalculateMedian() Dim i As Integer Dim passNum As Integer Dim temp As Single ' 修正类型,匹配数组n的Single类型 Dim aantal As Integer Dim n(1 To 50) As Single Dim p As Integer Dim t As Integer ' 改为Integer,Mod运算结果为整数 Dim median As Single aantal = InputBox("how many n variables do you want max 50") For p = 1 To aantal n(p) = InputBox("geef " & aantal & " nummers") Next ' Bubble sort numbers(修正注释) For passNum = 1 To aantal - 1 For i = 1 To aantal - passNum If n(i) < n(i + 1) Then ' 降序排序,不影响中位数计算,需升序可改为> temp = n(i) n(i) = n(i + 1) n(i + 1) = temp End If Next i Next passNum ' Display sorted list For i = 1 To aantal Worksheets(1).Cells(i, 1) = n(i) Next i ' Calculate median t = aantal Mod 2 If t > 0 Then ' 奇数:取中间位置的元素 median = n((aantal + 1) \ 2) Else ' 偶数:取中间两个元素的平均值 median = (n(aantal \ 2) + n(aantal \ 2 + 1)) / 2 End If Worksheets(1).Cells(1, 2) = median End Sub
测试验证
- 输入5个数字:1,3,5,7,9,排序后为9,7,5,3,1,中位数为第3位的5,代码会正确输出5。
- 输入4个数字:2,4,6,8,排序后为8,6,4,2,中位数为(6+4)/2=5,代码会正确输出5。
内容的提问来源于stack exchange,提问作者Suop
相关产品推荐
相关产品推荐

