我已编写此代码以按升序排序5个数字的数组,但我遇到错误:
ConsoleApplication1.exe中出现'System.IndexOutOfRangeException'类型的第一次机会异常
以下是代码:
Module Module1
Dim numbers(5) As Integer
Dim flag As Boolean
Dim i As Integer = 0
Sub InputNumbers()
For i = 0 To 4
Console.WriteLine("Input Numbers ")
numbers(i) = Console.ReadLine()
Next i
End Sub
Sub Sort()
Dim temp As Integer
Do
flag = False
For i = 0 To 4
If numbers(i) > numbers(i + 1) Then
temp = numbers(i + 1)
numbers(i + 1) = numbers(i)
numbers(i) = temp
End If
Next i
Loop Until flag = True
End Sub
Sub Output()
For i = 0 To 4
Console.WriteLine("The result is : " & numbers(i))
Next i
End Sub
Sub Main()
InputNumbers()
Sort()
Output()
Console.ReadKey()
End Sub
错误可在此处找到:
For i = 0 To 4
If numbers(i) > numbers(i + 1) Then
temp = numbers(i + 1)
numbers(i + 1) = numbers(i)
numbers(i) = temp
End If
Next i
有人可以帮忙吗?
答案 0 :(得分:2)
您的数组实际上包含6个元素。
'5 represents the upper bond (0 to 5)
Dim numbers(5) as integer
'Declare a single-dimension array of 5 values
Dim numbers(4) As Integer
然后,你的陈述是错误的
For i = 0 To 4
If numbers(i) > numbers(i + 1) Then
temp = numbers(i + 1)
numbers(i + 1) = numbers(i)
numbers(i) = temp
End If
Next i
通常,为了避免在更改数组大小时破坏代码,我会使用GetUpperBound来获取数组的最后一个索引。此外,你不能让for循环到最后一个元素,因为在你的循环中,你看看索引:i + 1,这将给你一个超出范围异常的索引在最后一个元素上(这就是为什么我添加&# 34; -1"在GetUpperbound之后。
For i = 0 To numbers.GetUpperBound(0) -1
If numbers(i) > numbers(i + 1) Then
temp = numbers(i + 1)
numbers(i + 1) = numbers(i)
numbers(i) = temp
End If
Next
然而,最终,无需麻烦地对数组进行排序的最有效方法就是这样做。
Array.Sort(numbers)
对于你的输出函数,我会使用GetUpperbound而不是4(如果数组大小被更改并且你忘记更改数字将会出现问题)或者对于每个语句将使自己适应任何数组大小而不使用改变那部分代码。
Sub Output()
For each i as integer in numbers
Console.WriteLine("The result is : " & numbers(i))
Next
End Sub
答案 1 :(得分:0)
正如Sage Pourpre指出的那样,在使用i + 1
引用数组中的下一个元素的位置时,必须确保i + 1
不大于数组的最后一个索引。有不止一种方法可以做到这一点。
此外,根据您的问题中的代码,您将有一个无休止的循环,因为您没有适当地设置flag
的值。我建议命名变量isSorted
,因为它更有意义:
Sub Sort()
' perform a bubble sort
Dim temp As Integer
Dim isSorted As Boolean
Do
isSorted = True
For i = 0 To numbers.Length - 2
If numbers(i) > numbers(i + 1) Then
temp = numbers(i + 1)
numbers(i + 1) = numbers(i)
numbers(i) = temp
isSorted = False
End If
Next i
Loop Until isSorted
End Sub