
- •Тема 4.7. Программирование алгоритмов формирования и обработки одномерных массивов
- •4.7.1. Структурированные данные
- •4.7.2. Средства описания и работы с одномерными массивами данных
- •4.7.3. Динамические массивы
- •4.7.4. Базовые алгоритмы обработки одномерных массивов
- •4.7.5. Обработка массивов с помощью методов класса Array
- •4.7.6. Элементы управления для работы со списками
- •4.7.7. Задачи для самостоятельного решения по теме «Программирование алгоритмов формирования и обработки одномерных массивов»
- •4.7.8. Тестовые задания по теме «Программирование алгоритмов формирования и обработки одномерных массивов»
- •Тема 4.7. Программа алгоритмов формирования и обработки одномерных массивов Страница 217
4.7.5. Обработка массивов с помощью методов класса Array
В п.п. 4.7.4. было рассмотрено использование массивов для хранения и обработки информации в программах VB.Здесь рассмотрим использование методов класса Array из библиотеки MS .NET Framework, которые позволяют быстро сортировать, выполнять поиски, менять порядок элементов массива, а также выполнять другие задачи с использованием готовых процедур.
Для реализации массивов в Visual Basic определен и используется базовый класс Array. Этот класс Array предоставляет набор следующих свойств и методов:
ИмяМассива.Rank
ИмяМассива.Length
ИмяМассива.GetLength( )
ИмяМассива.GetLowerBound( )
ИмяМассива.GetUpperBound( )
ИмяМассива1.CopyTo(ИмяМассива2, СтартовыйИндекс)
Array.Sort( ),
Array.Find( ),
Array .Reverse( ),
Array.Copy( )
Array.Clear( )
Проведя эксперименты с классом Array в окне CodeEditor и используя технологию MS IntelliSense, можно найти и другие интересные методы. Методы класса Array работают, как и все другие методы .NET Framework. Это означает, что они вызываются по имени и (в данном случае) в качестве аргумента требуют имя существующего массива. Например, чтобы отсортировать массив, такой, как массив Расстояния( ), следует использовать такую запись:
Array.Sort(Расстояния).
Когда Visual Basic выполняет метод Array.Sort( ), он создает в памяти временное хранилище для массива и использует процедуру сортировки для реорганизации. После завершения сортировки первоначальный массив переупорядочивается в порядке возрастания, когда наименьшее значение оказывается в элементе с индексом 0, а наибольшее – в последнем элементе массива. В случае показанного выше примера сортировка массива Растояния( )даст массив расстояний, отсортированный от наиболее низких к наиболее высоким значениям.
Далее рассмотрим, как использовать методы Array.Sort( )и Array.Reverse( ) для быстрой реорганизации большого массива, содержащего шестизначные числа, случайно выбранные из диапазона от 0 до 1000000. Также рассмотрим, как использовать элемент управления, который предоставляет визуальное отображение хода процесса длительной сортировки. Элемент управления ProgressBar расположен на вкладке CommonControls окна Элементы управления (Toolbox).
Пример 4.7.5-1.Создать проект, который использует методы класса Array для сортировки массива из 3000 элементов
В элементе меню Файл (File) щелкните на команде Создать проект Пример-4-7-5-1.
Создать интерфейс пользователя, как на рис. 4.7.5-1.
Эта форма содержит текстовое поле для отображения значений элементов массива, а также три кнопки и объект индикатора выполнения, который дает пользователю визуальное представление о ходе длительности операций с массивами. Такое представление полезно при вычислениях, которые требуют более нескольких секунд, и, когда используется программный код для сортировки массива из 3000 элементов, некоторая пауза неизбежна. Справа от объекта индикатора выполнения ProgressBar имеется объект надписи Label2, для определения количества элементов в массиве (на рис. 4.7.5.1 Label2.Text = 0).
Рис. 4.7.5-1
Далее необходимо щелкнуть на индикаторе выполнения (ProgressBar)формы.
Объект ProgressBar1 на форме выделится, и его имя появится в окне Свойства (Properties). Индикатор выполнения предназначен для отображения прогресса вычислений, показывая соответствующее число цветных прямоугольников, расположенных в виде горизонтальной полосы. Когда вычисления будут завершены, эта полоса будет полностью заполнена прямоугольниками.
Важными свойствами, которые заставляют индикатор выполнения работать, являются свойства Minimum (Mинимум), Maximum (Mаксимум) и Value (Значение), значения которых обычно задаются в коде программы. Чтобы увидеть, как задаются свойства Minimum и Maximum, необходимо посмотреть на процедуру события Form1_Load( )этого проекта.
4. Чтобы отобразить процедуру события Form1_Load( ),дважды щелкните мышью на
форме.
В окне отобразится соответствующий код (рис. 4.7.5-2).
Public Class Form1 Dim RandArray(0 To 499) As Long 'Инициализация ProgressBar и вывод количества элементов Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ HandlesMyBase.Load ProgressBar1.Minimum = 0 ProgressBar1.Maximum = UBound(RandArray) Label2.Text = UBound(RandArray) + 1 End Sub ' Заполняем массив случайными числами и отображаем их в текстовом поле Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click Dim i As Integer For i = 0 To UBound(RandArray) RandArray(i) = Int(Rnd() * 1000000) TextBox1.Text = TextBox1.Text & CStr(RandArray(i)) & vbCrLf ProgressBar1.Value = i ' перемещаем индикатор выполнения Next i End Sub 'Сортируем массив, используя метод Array.Sort, и отображаем его Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button2.Click Dim i AsInteger TextBox1.Text = "" Array.Sort(RandArray) For i = 0 To UBound(RandArray) TextBox1.Text = TextBox1.Text & CStr(RandArray(i)) & vbCrLf ProgressBar1.Value = i ' перемещаем индикатор выполнения Next i End Sub ' Изменяем порядок элементов массива с помощью Array.Reverse Sub Button3_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button3.Click Dim i AsInteger TextBox1.Text = "" Array.Reverse(RandArray) For i = 0 To UBound(RandArray) TextBox1.Text = TextBox1.Text &CStr(RandArray(i)) & vbCrLf ProgressBar1.Value = i 'перемещаем индикатор выполнения Next i End Sub End Class |
Рис. 4.7.5-2
Чтобы индикатор выполнения показывал правильное значение хода выполнения задачи, требуется установить относительные значения для начала и конца индикатора. Это делается с помощью свойств Minimum и Maximum, которые соответствуют первому и последнему элементам массива, с которым производится работа. Первый элемент массива всегда имеет индекс 0, но значение последнего индекса элемента зависит от размера массива. Так что для получения этого значения и установки свойства Maximum индикатора необходимо использовать функцию UBound( ). Массив, с которым работаем в этом примере, называется RandArray и является массивом целых чисел типа Long и содержит 500 элементов (от 0 до 499).
5. Чтобы запустить программу, щелкните на кнопке Начать отладку (Start Debugging). Программа запустится, и на экране появится форма Пример 4.7.5-1. Объект индикатора выполнения калибруется так, чтобы отслеживать вычисление 500 единиц (размер массива), и справа от индикатора появляется число 500 (работа объекта надписи Label2 и функции UBound( )).
6. Далее можно щелкнуть на кнопке Заполнить массив.
Программа сформирует массив RandArray 500 случайными числами (полученными с помощью функции Rnd( )), и отобразит их в текстовом поле. По мере обработки массива и заполнения объекта текстового поля данными индикатор выполнения начнет заполняться зелеными прямоугольниками. Когда этот процесс завершится, экран будет выглядеть примерно так, как на рис. 4.7.5-3
Рис. 4.7.5-3
Код, который привел к такому результату, находится в процедуре события Button1_Click( ).
Чтобы получить целые случайные числа, необходимо использовать вместе функции Int( )и Rnd( )и умножить случайное число, генерируемое Rnd( ),на 1000000, чтобы получить шестизначные целые числа. Запись этих чисел в массив выполняется с помощью цикла For...Next и индекса массива, равного счетчику этого цикла (i). Заполнение массива - это очень быстрая операция. Замедление связано с необходимостью поочередно присваивать элементы массива объекту текстового поля. Этот процесс требует 500 обновлений компоненты интерфейса пользователя и занимает несколько секунд. Однако это полезно – задержка дала возможность показать элемент управления ProgressBar. Так как объект индикатора выполнения откалиброван на использование максимального числа элементов массива, присвоение счетчика цикла (i) свойству Value индикатора позволяет точно отобразить, какой объем вычислений уже завершен.
7.Щелкните на кнопке Отсортировать массив.
Программа запустит процесс сортировки массива RandArray, для реорганизации массива в восходящем порядке будет использоваться метод Array.Sort и 500 элементов будут перечислены от наименьшего к наибольшему.
Экран при этом должен выглядеть примерно так, как на рис. 4.7.5-5.
Рис. 4.7.5-5
Код, который привел к такому результату, находится в процедуре события Button2_Click( ).
Эта процедура события при щелчке на кнопке Отсортировать массив очищает объект текстового поля, а затем сортирует массив с помощью метода Array.Sort. Процесс сортировки очень быстр. И снова единственным замедлением является перестройка объекта текстового поля по одной строке в цикле For...Next - процесс, который отображается в объекте ProgressBar1 и его свойстве Value.
8. Далее можно щелкнуть на кнопке Переупорядочить массив.
Программа использует метод Array.Reverse() для обработки RandArray, переупорядочивая его в обратном порядке. Это значит, что первый элемент становится последним, а последний - первым.
Код, который привел к такому результату, находится в процедуре события Button3_Click( ).
Эта процедура события идентична процедуре события Button2_Click( ), за одним исключением:
Array.Sort(RandArray)превратилась в Array.Reverse(RandArray)
Для завершения программы необходимо щелкнуть на кнопке Конец отладки (StopDebugging).
В окне Редактора кода (Edit Code) необходимо найти оператор программы,
который объявляет массив RandArray:
Dim RandArray(0 To 499) As Long
Заменить499 в объявлении массива на 2999. Теперь оператор должен выглядеть следующим образом:
Dim RandArray(0 To 2999) As Long
Снова запустить программу, чтобы посмотреть, как объявление и заполнение
массива из 3000 элементов влияет на производительность программы.
Так как обработка 3000 элементов требует гораздо больше работы, Visual Basic требует некоторого времени на заполнение объекта текстового поля при заполнении, сортировке и переупорядочивании массива RandArray. Однако индикатор выполнения информирует вас о ходе сортировки.