2016-05-21 3 views
0

я написал этот код для сортировки массива из 5 чисел в порядке возрастания, но я получил сообщение об ошибке:сортировки массива целых чисел Vb консоли

A first chance exception of type 'System.IndexOutOfRangeException' occurred in ConsoleApplication1.exe

Вот код:

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

Вы, кажется, забыли установить 'flag' соответствующим образом. –

ответ

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 
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, чтобы получить последний индекс вашего массива. Кроме того, вы не можете сделать цикл для последнего элемента, поскольку в вашем цикле вы смотрите индекс: i + 1, который даст вам исключение из диапазона исключений из последнего элемента (вот почему я добавил «- 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 (что будет проблематично, если размер массива либо изменится, либо вы забудете изменить номер), либо a Для каждого утверждения, которое будет адаптироваться к любому размеру массива без изменений ng, что часть кода.

Sub Output() 
For each i as integer in numbers 
    Console.WriteLine("The result is : " & numbers(i)) 
Next 
End Sub 
Смежные вопросы