排序整数数组vb console

时间:2016-05-21 12:37:54

标签: arrays vb.net sorting

我已编写此代码以按升序排序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

有人可以帮忙吗?

2 个答案:

答案 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