Опубликован: 31.08.2006 | Уровень: специалист | Доступ: свободно
Лекция 12:

Использование массивов и коллекций для управления данными

Создание динамического массива

Массивы удобны для работы со списками чисел, особенно если вы обрабатываете их с помощью циклов For \dots 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 \dots Next для определения верхней границы массива используйте функцию UBound и произведите требуемую обработку массива, как показано здесь:

    For i = 0 to UBound(Temperatures)
      Temperatures(i) = InputBox(Prompt, Title)
    Next

В следующем упражнении вы будете использовать эти шаги для доработки программы Fixed Array так, что она с помощью динамического массива сможет обрабатывать любое количество температур.

Использование динамического массива для хранения температур
  1. Чтобы отобразить код программы проекта Fixed Array, откройте Редактор кода.
  2. Прокрутите его вверх до начала кода формы, в которой вы первоначально объявили фиксированный массив Temperatures.
  3. Удалите число 6 из объявления массива Temperatures, чтобы массив стал динамическим. Этот оператор должен выглядеть так:

    Dim Temperatures() As Single
  4. Добавьте под объявлением массива Temperatures следующее объявление переменной:

    Dim Days As Integer

    Целочисленная переменная Days будет использована для получения ввода от пользователя и для задания размера динамического массива во время выполнения.

  5. Прокрутите Редактор кода вниз, чтобы отобразить процедуру события 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 \dots Next - как и в предыдущем примере, вместо этого используется функция UBound.

  6. Прокрутите Редактор кода вниз, чтобы отобразить процедуру события 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 при вычислении средней температуры в нижней части этой процедуры события. Я также отредактировал заголовок "Максимальные температуры", который отображается в текстовом поле.

  7. Сохраните изменения на диск.

    Примечание. На прилагаемом компакт-диске я дал этому проекту отдельное имя, чтобы отделить его от проекта Fixed Array. Готовая программа Dynamic Array лежит в папке c:\vbnet03sbs\ Гл.11\dynamic array.
  8. Чтобы запустить программу, щелкните на кнопке Start (Начать).
  9. Щелкните на кнопке Ввести температуры.
  10. Когда увидите запрос на число дней, для которых вы хотите записать температуры, введите 5 и нажмите на OK.
  11. Когда вас попросят ввести температуры, введите пять температур.
  12. После того, как вы закончите вводить температуры, щелкните на кнопке Отобразить температуры. Программа отобразит в форме пять температур, а также их среднее значение. Ваш экран должен выглядеть примерно так.


  13. Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.
Сайдахмад Зарипов
Сайдахмад Зарипов
Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?