2016-01-04 3 views
0

В результате я столкнулся с проблемой при добавлении размеров переменных массивов. Цикл работает один раз, а затем по существу. Но мне любопытно, что может вызвать такое поведение? Разве я не совсем понимаю, как вызывается функция выхода цикла?Динамически изменяемые размеры массивов

Вот код:

Module Module1 

Sub Main() 
    Dim num(-1) 
    Dim i = 0 
    Console.WriteLine("Input numbers to be added, q to stop:") 
    Dim input 
    Dim total = 0 
    Do 
     ReDim Preserve num(UBound(num) + 1) : num(UBound(num)) = i 'resize the array each time before an element is added. 
     input = Console.ReadLine 
     If IsNumeric(input) Then 'attempt to break loop on non numeric input 
      num(i) = CInt(input) 
      i += 1 
     Else 
      Exit Do 
     End If 
    Loop 
    total = 0 
    For Each n In num 
     total += n 
    Next 
    Console.WriteLine(Join(num)) 
    Console.WriteLine("Total: " & total) 

    Console.ReadLine() 

Для ввода: 1 2 3 4 5 q, выход я получаю:

1 2 3 4 5 5 
Total: 20

Он добавляет последний элемент дважды, который интересен, поскольку он не только работает в два раза но каким-то образом используя последний числовой ввод, хотя конечный ввод не был числовым. Кто-нибудь знает, почему это было бы?

+0

Пара вопросов - 1) Ваш скрипт не похож на правильный VBScript. Вы уверены, что используете правильный язык? 2) Почему вы назначаете 'num', когда вы его отменяете? –

+0

1) Может быть? Я просто просматриваю учебник, и я просто пытаюсь понять, что могу и чего не могу. 2) Я хотел посмотреть, можно ли было переделать, ничего не сломав. – jnb92

ответ

0

Я использовал свой сценарий и пытался создать рабочий раствор

Dim num, input, total, i 
    num = Array() 

    i = 0 
    Do 
     input = Inputbox("Input numbers to be added, q to stop:") 
     If IsNumeric(input) Then 'attempt to break loop on non numeric input 
      ReDim Preserve num(UBound(num) + 1) 'resize the array each time before an element is added. 
      num(i) = CInt(input) 
      i = i + 1 
     Else 
      Exit Do 
     End If 
    Loop 

    total = 0 
    For Each n In num 
     total = total + n 
    Next 
    msgbox Join(num) 
    msgbox "Total: " & total 

Edit - Обновленный ответ, основанный на @ Ekkehard.Horner комментарии

+0

Это может «работать», но добавляет пустой элемент в num. –

+0

Спасибо, что указали это. Я просто преобразовал его код в рабочий vbscript. –

3

Вы оба (jnb92, PankajJaju) должен не разрасти массив до, вы уверены, что ввод числен и должен быть сохранен.

Dim input 
Do 
    input = Console.ReadLine() 
    If IsNumeric(input) Then 'attempt to break loop on non numeric input 
     ReDim Preserve num(UBound(num) + 1) 
     num(UBound(num)) = CInt(input) 
    Else 
     Exit Do 
    End If 
Loop 

Update WRT комментарий:

Ваш

ReDim Preserve num(UBound(num) + 1) : num(UBound(num)) = i 

назначает i к num для каждого входа; Ваш

num(i) = CInt(input) 

переписывает, что с цифровым вводом, но не для завершающего "q". Итак, для вашего (одного и единственного?) Тестового случая ложный последний элемент (случайно) 5.

+0

Ах, спасибо, имеет смысл, но почему вы думаете, что он добавил бы последнее число дважды, если бы последний элемент был пуст? – jnb92

+0

Я не думаю (и никогда не говорил), что последнее число было добавлено дважды. Я знаю (и сказал), что последний элемент получил текущее значение i-5 - и не был перезаписан. –

Смежные вопросы