Использование программных массивов для обработки большого числа однотипных данных (на примере одномерного и двумерного массивов)
Вид материала | Документы |
СодержаниеPicture Box Имя объекта Печатать матрицу |
- Самостоятельная работа Найти произведение всех элементов двумерного массива, которые, 14.88kb.
- Обработка больших научных массивов данных, 11.46kb.
- Использование массивов элементов управления при создании приложений типа «Экранный, 79.53kb.
- Поэтому при написании программы будьте особенно внимательны, не путайте индексы элементов, 363.59kb.
- Поняття масиву. Одновимірний масив, 62.45kb.
- Лекция № Распределение памяти. Динамические переменные, 73.48kb.
- Обучение современным технологиям обработки больших массивов данных на кластерных системах, 107.94kb.
- Задачи на тему: Массивы. Понятие таблицы и массива. Различные виды массивов и их описание., 60.9kb.
- Типовые алгоритмы обработки двумерных массивов, 115.54kb.
- 1. Адаптивный алгоритм сжатия телемеханических данных, 21.8kb.
Работа № 6
Использование программных массивов для обработки большого числа однотипных данных (на примере одномерного и двумерного массивов)
Цель работы: изучение и использование понятия программного массива как обобщения понятия переменной при программировании процедур на языке VB 6, создание проектов, в программных модулях которых целесообразно использовать одномерные и многомерные программные массивы.
Контрольные вопросы:
- Как объявляется одномерный массив? Что такое индекс массива и диапазон изменения индекса?
- Как можно находить максимальный (или минимальный) элемент массива чисел? Значение индекса максимального (или минимального) элемента?
- В чем заключается идея «пузырьковой» сортировки одномерного массива чисел?
- Приведите примеры алгоритмов сортировки одномерного массива, более эффективных, чем алгоритм «пузырьковой» сортировки.
- Как можно использовать понятие динамического массива для ввода по одному элементу в одномерный массив произвольной (заранее не известной) длины?
- Как с помощью двумерного массива можно хранить и обрабатывать матрицу значений функции двух переменных f(x, y)?
- Как можно использовать понятие динамического массива для загрузки в двумерный массив значений цвета «точек» произвольного изображения?
Пример 6.1. Рассмотрим приложение, демонстрирующее «пузырьковую» сортировку одномерного массива чисел. Для определенности, будем считать, что числа в массиве целые, в диапазоне от 0 до 1000. Всего в массиве 100 чисел, которые создаются случайно, с помощью функции Rnd, например, так: X = CInt(Rnd * 1000).
На рис 6.1 показано окно приложения, на котором 2 поля списка и 2 команды меню: Заполнить массив и Сортировать массив.
Щелчок 1-й команды вызывает заполнение 1-го поля случайными числами, а щелчок 2-й команды – заполнение 2-го поля.
Рис. 6.1. Результат «пузырьковой» сортировки массива чисел
Опуская описание этапа проектирования интерфейса, представим лишь программный код:
Dim B(99) As Integer
Private Sub mnuLoad_Click()
List1.Clear: List2.Clear
Randomize
For i = 0 To 99
B(i) = CInt(1000 * Rnd)
List1.AddItem B(i)
Next i
End Sub
Private Sub mnuSort_Click()
List2.Clear
For i = 0 To 98 ‘ Алгоритм пузырьковой сортировки:
For j = i + 1 To 99
If B(j) < B(i) Then
A% = B(i): B(i) = B(j): B(j) = A
End If
Next j
Next i
For i = 0 To 99
List2.AddItem B(i)
Next i
End Sub
Пример 6.2. Рассмотрим приложение, которое демонстрирует возможность двумерного динамического массива хранить изображения произвольного размера с целью их обработки.
На экранной форме приложения 2 элемента Picture Box (Picture1 и Picture2) и 4 команды меню (рис. 6.2). Предварительно, на этапе проектирования, в первое графическое поле загружается изображение из графического файла произвольного формата. Чтобы размер графического окна автоматически «подстроился» под размер загружаемого изображения, его свойство AutoSize следует установить равным True.
При загрузке формы ее размеры и расположение обоих графических окон должны настроиться автоматически.
После щелчка команды меню To Array графические окна масштабируются в соответствии с размерами изображения в пикселях, динамический массив для хранения данных о цвете каждой «точки» изображения переопределяется, после чего в него заносятся данные, получаемые в ходе сканирования изображения.
Остальные команды меню относятся к обработке изображения – их действия не нуждаются в комментариях.
Отметим лишь, что меню From Array имеет подменю:
None,
To LeftRight,
To UpDown,
To LeftRight & UpDown.
(Назначение этих команд соответствует их мнемонике.)
Рис. 6.2. Вид окна после отработки команд меню:
To Array, To Negative, From Array → To LeftRight
Для реализации компьютерного интерфейса заполняется следующая таблица свойств:
Имя объекта | Класс объекта | Свойство объекта | Значение свойства |
Form1 | Form | Caption | “Двумерный динамический массив” |
MinButton | False | ||
MaxButton | False | ||
mnuToArray | Menu Command | Caption | “To Array” |
mnuToNegative | Menu Command | Caption | “To Negative” |
mnuToGrey | Menu Command | Caption | “To Grey” |
mnuFromeArray | Menu Command | Caption | “From Array” |
mnuNone | Menu Command | Caption | “None” |
mnuToLeftRight | Menu Command | Caption | “To Left-Right” |
mnuToUpDown | Menu Command | Caption | “To Up-Down” |
mnuToLR-UD | Menu Command | Caption | “To Left-Right And Up-Down” |
Picture1 | PictureBox | AutoSize | True |
Picture2 | PictureBox | AutoSize | False |
Ниже приводится код процедур лишь для некоторых команд меню из приведенной таблицы. Составление кода процедур для остальных команд – тема задания 2 данной работы.
Dim p() As Long
Dim w As Long, h As Long, i As Long, j As Long
Dim r As Byte, g As Byte, b As Byte
Private Sub Form_Load()
w = Picture1.Width: h = Picture1.Height
Width = 2 * Picture1.Width + 900
Height = Picture1.Height + 1200
Picture2.Width = Picture1.Width
Picture2.Height = Picture1.Height
Picture2.Left = Picture1.Width + 450
Picture2.Top = Picture1.Top
End Sub
Private Sub mnuToArray_Click()
w = w \ 15: h = h \ 15
Picture1.Scale (0, 0)-(w, h): Picture2.Scale (0, 0)-(w, h)
ReDim p(w, h)
For i = 1 To h - 1
For j = 1 To w - 1
p(j, i) = Picture1.Point(j, i)
Next j
Next i
End Sub
Private Sub mnuNone_Click()
For i = 1 To h - 1
For j = 1 To w - 1
Picture2.PSet (j, i), p(j, i)
Next j
Next i
End Sub
В ходе выполнения данной работы студент должен выполнить 3 задания.
Задание 1. В процессе выполнения задания студенты, взяв за основу проект из примера 6.1, реализуют и изучают действие различных алгоритмов сортировки одномерного числового массива.
Вариант 1. Внести единственное изменение в проект приложения, представленного в примере 6.1: вместо «пузырьковой» сортировки применить сортировку вставкой. (Алгоритм представлен в пособии [2], стр. 79 – 80.)
Вариант 2. Внести единственное изменение в проект приложения, представленного в примере 6.1: вместо «пузырьковой» сортировки применить сортировку выбором максимального элемента. (Алгоритм представлен в пособии [2], стр. 78 – 79.)
Задание 2. В ходе выполнения задания студенты, взяв за основу проект из примера 6.2, осваивают возможность обработки изображения с помощью двумерного массива.
Для обоих вариантов потребуется процедура «разложения» цвета точки изображения c на 3 его составляющих: красную, зеленую и синюю (r, g, b). Для этого следует решить уравнение с тремя неизвестными: . В целых числах это уравнение решается с помощью следующей процедуры:
Private Sub Separate(c As Long, r As Byte, g As Byte, b As Byte)
cc& = c
If cc > 0 Then
r = cc Mod 256: cc = cc \ 256: g = cc Mod 256: b = cc \ 256
Else
r = 0: g = 0: b = 0
End If
End Sub
Вариант 1. Реализовать алгоритм преобразования цветного изображения в черно-белое (написать процедуру для команды меню mnuToGrey из примера 6.2), а также алгоритм преобразования «позитивного» изображения в «негативное» (написать процедуру для команды меню mnuToNegative из примера 6.2).
Указание: Цвет каждой точки изображения – это элемент массива p(j,i) – значение типа Long. Преобразование этого значения в значение «серого» цвета означает следующее:
Separate p(j, i), r, g, b
gr = 0.33 * r + 0.33 * g + 0.33 * b
p(j, i) = RGB(gr, gr, gr)
Преобразование значения p(j,i) в значение «негативного» цвета:
Separate p(j, i), r, g, b
p(j, i) = RGB(255 - r, 255 - g, 255 - b)
Вариант 2. Реализовать алгоритм преобразования исходного изображения в отраженное относительно вертикальной оси (написать процедуру для команды меню mnuToLeftRight из примера 6.2). Реализовать также алгоритм преобразования исходного изображения в отраженное относительно горизонтальной оси (написать процедуру для команды меню mnuToUpDown из примера 6.2), а также алгоритм, совмещающий эти два преобразования (mnuToLR-UD из примера 6.2).
Указание: Цвет каждой точки изображения – это элемент массива p(j,i) – значение типа Long.
1-й индекс массива для исходного изображения меняется от 1 до w-1, где w – ширина изображения в пикселях. При построении «отраженного» изображения (рис. 6.2) этот индекс должен меняться от w-1 до 1:
Picture2.PSet (w - j, i), p(j, i)
2-й индекс массива для исходного изображения меняется от 1 до h-1, где h – высота изображения в пикселях. При построении «перевернутого» изображения этот индекс должен меняться от h-1 до 1:
Picture2.PSet (j, h - i), p(j, i)
Для обоих преобразований одновременно:
Picture2.PSet (w - j, h - i), p(j, i)
Задание 3. В ходе выполнения задания студенты приобретают навык использования двумерного массива для обработки матрицы чисел, представляющей значения функции двух переменных.
Для определенности, в обоих вариантах задания рассматривается одна функция - гиперболический параболоид:
с одним и тем же набором значений параметров:
Const a As Double = 5.2, b As Double = 9.5, p As Double = 1.1
Const c As Double = -1.3, d As Double = 10.7, q As Double = 1.3
Значения этой функции должны быть вычислены и помещены в двумерный массив z(x, y), где x - номер столбца, а y - номер строки матрицы. На рис. 6.3 показана матрица указанных значений с 8 столбцами и 15 строками.
Рис. 6.3. Матрица значений гиперболического параболоида для целочисленных аргументов x = [0, 7], y = [0, 14]
Код процедуры для команды меню Печатать матрицу:
Private Sub mnuPrint_Click()
Cls
Print "",
For x = 0 To 7
Print x,
Next x
Print: Print
For y = 0 To 14 ' 15 строк
Print y,
For x = 0 To 7 ' 8 столбцов
z(x, y) = (y - a) * (y - b) / p - (x - c) * (x - d) / q
z(x, y) = Round(z(x, y), 2)
Print z(x, y),
Next x
Next y
End Sub
Вариант 1. Написать процедуру для команды меню MinMax, с помощью которой «седловая точка» (x0, y0) гиперболического параболоида ищется как минимум по строкам максимумов по столбцам матрицы:
Вариант 2. Написать процедуру для команды меню MaxMin, с помощью которой «седловая точка» (x0, y0) гиперболического параболоида ищется как максимум по столбцам минимумов по строкам матрицы:
Очевидно, что результаты работы процедур 1-го и 2-го вариантов должны совпасть (рис. 6.4).
Рис. 6.4.
Отметим, что полученный результат хорошо согласуется с теоретическим значением: