Использование массивов и коллекций для управления данными
Создание динамического массива
Массивы удобны для работы со списками чисел, особенно если вы обрабатываете их с помощью циклов For Next. Но что, если при запуске программы вы не знаете, сколько места в массиве вам понадобится? Например, если нужно, чтобы пользователь выбирал, сколько температур вводить в программу Fixed Array?
Visual Basic эффективно решает эту проблему с помощью специального "эластичного" контейнера, который называется динамическим массивом. Размерность динамических массивов определяется во время работы программы - либо тогда, когда пользователь указывает размер этого массива, либо когда логика программы определяет размер массива на основе некоторых условий. Выделение места под динамический массив требует нескольких действий. Хотя размер массива и не будет указан до тех пор, пока программа не будет запущена, при проектировании необходимо зарезервировать для него некоторые объем. Чтобы создать динамический массив, выполните такие базовые действия.
-
При разработке программы укажите имя и тип массива, не указывая при этом числа элементов этого массива. Например, чтобы создать динамический массив с именем Temperatures, введите
Dim Temperatures() As Single
-
Добавьте код для определения числа элементов, которые должны быть в массиве во время выполнения программы. Вы можете запросить это число у пользователя с помощью функции InputBox, или вычислить необходимый объем с помощью свойств или другой логики. Например, следующие операторы получают размер массива от пользователя и присваивают его короткой целочисленной переменной Days:
Dim Days As Short Days = InputBox("Сколько дней?", "Создание массива")
-
Чтобы задать размерность массива, используйте переменную в операторе ReDim (вычтите 1, так как массивы нумеруются с 0). Например, следующий оператор устанавливает размер массива Temperatures при выполнении программы с помощью переменной Days:
ReDim Temperatures(Days - 1)
- Единственным ограничением при использовании ReDim является то, что вы не должны пытаться изменить число измерений массива, который был объявлен ранее.
-
В цикле For Next для определения верхней границы массива используйте функцию UBound и произведите требуемую обработку массива, как показано здесь:
For i = 0 to UBound(Temperatures) Temperatures(i) = InputBox(Prompt, Title) Next
В следующем упражнении вы будете использовать эти шаги для доработки программы Fixed Array так, что она с помощью динамического массива сможет обрабатывать любое количество температур.
Использование динамического массива для хранения температур
- Чтобы отобразить код программы проекта Fixed Array, откройте Редактор кода.
- Прокрутите его вверх до начала кода формы, в которой вы первоначально объявили фиксированный массив Temperatures.
-
Удалите число 6 из объявления массива Temperatures, чтобы массив стал динамическим. Этот оператор должен выглядеть так:
Dim Temperatures() As Single
-
Добавьте под объявлением массива Temperatures следующее объявление переменной:
Dim Days As Integer
Целочисленная переменная Days будет использована для получения ввода от пользователя и для задания размера динамического массива во время выполнения.
-
Прокрутите Редактор кода вниз, чтобы отобразить процедуру события Button1_Click, и измените ее код так, как показано ниже.
Dim Prompt, Title As String Dim i As Short Prompt = "Введите максимальную температуру за день." Days = InputBox("Сколько дней?", "Создание массива") If Days > 0 Then ReDim Temperatures(Days - 1) For i = 0 To UBound (Temperatures) Title = "День " & (i + 1) Temperatures(i) = InputBox(Prompt, Title) Next
Четвертая и пятая строки запрашивают у пользователя количество температур, которые надо сохранить, а затем этот ввод используется для задания размера динамического массива. Оператор If...Then используется для того, чтобы проверить, что число дней больше 0. (Задание размера массива с помощью числа, которое меньше 0, приведет к возникновению ошибки.) Так как для хранения температуры для первого дня используется индекс 0 массива, переменная Days при задании размера массива уменьшается на 1. Переменная Days не нужна для определения верхней границы в цикле For Next - как и в предыдущем примере, вместо этого используется функция UBound.
-
Прокрутите Редактор кода вниз, чтобы отобразить процедуру события Button2_Click. Измените ее код так, как показано в следующем фрагменте кода. (Измененные элементы выделены жирным.)
Dim Result As String Dim i As Short Dim Total As Single = 0 Result = "Максимальные температуры:" & vbCrLf & vbCrLf For i = 0 To UBound(Temperatures) Result = Result & "День " & (i + 1) & vbTab & _ Temperatures(i) & vbCrLf Total = Total + Temperatures(i) Next Result = Result & vbCrLf & _ "Средняя температура: " & Format(Total / Days, "0.0") TextBox1.Text = Result
Переменная Days заменяет число 7 при вычислении средней температуры в нижней части этой процедуры события. Я также отредактировал заголовок "Максимальные температуры", который отображается в текстовом поле.
-
Сохраните изменения на диск.
- Чтобы запустить программу, щелкните на кнопке Start (Начать).
- Щелкните на кнопке Ввести температуры.
- Когда увидите запрос на число дней, для которых вы хотите записать температуры, введите 5 и нажмите на OK.
- Когда вас попросят ввести температуры, введите пять температур.
-
После того, как вы закончите вводить температуры, щелкните на кнопке Отобразить температуры. Программа отобразит в форме пять температур, а также их среднее значение. Ваш экран должен выглядеть примерно так.
- Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.