Билет № 4:Событийные процедуры, общие процедуры.
При разработке сложного алгоритма целесообразно стараться выделить в нем последовательности действий, которые выполняют решение каких-либо подзадач и могут многократно вызываться из основного алгоритма. Такие алгоритмы называются вспомогательными и в процедурных языках программирования реализуются в форме подпрограмм, которые вызываются из основной программы.
В объектно-ориентированных языках программирования вспомогательные алгоритмы реализуются с помощью общих процедур. Общие процедуры создаются в тех случаях, когда в программном модуле можно выделить многократно повторяющиеся последовательности действий (алгоритмы).
Определение общей процедуры. Каждой общей процедуре дается уникальное название — имя процедуры и устанавливается список входных и выходных параметров процедуры.
Список входных параметров представляет собой набор переменных, значение которых должно быть установлено до начала выполнения процедуры.
Список выходных параметров представляет собой набор переменных, значение которых должно быть установлено после окончания выполнения процедуры.
Синтаксис общей процедуры:
Sub Имя Процедуры (Список Параметров)
программный код
End Sub
Вызов общей процедуры. Запуск общих процедур не связывается с какими-либо событиями, а реализуется путем вызова из других процедур.
Общая процедура представляет собой подпрограмму, которая начинает выполняться после ее вызова из другой процедуры. Общая процедура вызывается на выполнение либо с помощью оператора Call, либо по имени. В случае вызова процедуры с использованием оператора Call список параметров заключается в скобки:
|
Call Имя процедуры(Список параметров)
В случае вызова процедуры по имени список параметров приводится без скобок:
Имя процедуры(Список параметров)
Размещение общей процедуры в проекте. Общая процедура может входить в состав программного модуля одной из форм проекта (в файл с расширением frm). Общая процедура может быть также размещена в стандартном программном модуле (файле с расширением bas).
Область видимости процедуры. Общие и событийные процедуры могут быть локальными и глобальными. Локальная процедура доступна только внутри данного программного модуля и не может быть вызвана из другого модуля. Например, локальная общая процедура, размещенная в программном модуле некоторой формы, не может быть вызвана из программного модуля другой формы. Локальная процедура задается с помощью ключевого слова Private:
Private Sub Имя Процедуры
программный код
End Sub
Глобальные процедуры доступны, то есть могут быть вызваны, из всех программных модулей проекта. Глобальная процедура задается с помощью ключевого слова Public (по умолчанию, если перед ключевым словом Sub отсутствуют ключевые слова, процедура является глобальной):
Public Sub Имя Процедуры
программный код
End Sub
Область видимости переменной. Переменные также могут быть локальными и глобальными (открытыми). Локальная переменная доступна только внутри процедуры или программного модуля и к ней невозможно обращение из другой процедуры или модуля. Локальная переменная определяется с помощью ключевого слова Dim.
Если переменная определена перед процедурой//////, то она может быть вызвана только в этой процедуре; если она определена перед программным модулем в области (Gene-ral)(Declaration) программного кода, то она может быть вызвана только в этом модуле.
|
К глобальным переменным может быть произведено обращение из всех программных модулей проекта. Глобальная переменная определяется с помощью ключевого слова Global в области (General)(Declaration) программного кода.
Проект «Сортировка числового массива». Разработаем проект, который позволит заполнять числовой массив целыми случайными числами, а затем предоставит возможность сортировать массив различными способами.
Заполнение массива случайными числами. Для генерации последовательности целых случайных чисел используем функцию генерации псевдослучайных (то есть каждый раз повторяющихся) последовательностей чисел Rnd и функцию выделения целой части числа Int.
Заполнение массива bytA, состоящего из 10 элементов, реализуем с помощью цикла со счетчиком. В целях визуального контроля предусмотрим вывод массива в текстовое поле txtDim с использованием функции Str (преобразования числа в строковую форму).
Проект «Сортировка числового массива»
1) Создать новый проект. Разместить на форме текстовое поле txtDim и кнопку cmdDim. Присвоить свойству Caption значение Заполнить.
2) Установить для свойства MultiLine текстового поля значение True и подобрать размер шрифта так, чтобы массив распечатывался в одной строке текстового поля.
3) Ввести для кнопки событийную процедуру заполнения массива и его вывода в текстовое поле:
|
Dim bytl, bytA(l То 10) As Byte
Private Sub cmdDim_Click ()
Randomize
For bytl = 1 To 10
bytA(bytl) = Int(Rnd * 10)
txtDim.Text = txtDim.Text + Str(bytA(bytl))
Next bytl
End Sub
4) Запустить проект и несколько раз щелкнуть по кнопке Заполнить.
В текстовом поле появятся последовательности случайных чисел, различающиеся между собой.
Поиск минимального элемента. Будем считать сначала, что минимальный элемент равен первому элементу массива bytA (1) и присвоим переменной bytMin его значение.
Затем в цикле сравним последовательно элементы массива со значением переменной bytMin, если какой-либо элемент окажется меньше, присвоим его значение переменной bytMin, а его индекс присвоим переменной bytN. Распечатаем результаты.
5) Разместить на форме кнопку cmdMin и присвоить свойству Caption значение Мин. элемент. Создать для нее событийную процедуру поиска минимального элемента:
Private Sub cmdMin_Click()
bytMin = bytA(l)
bytN = 1
For bytl = 2 To 10
If bytA(bytl) < bytMin Then bytMin = bytA(bytl): bytN = bytl
Next bytl
Print "Минимальный элемент "; bytMin; "его индекс"; bytN
End Sub
6) Запустить проект. Последовательно щелкать на кнопках Заполнить и Мин. элемент.
В текстовом окне будет появляться заполненный массив, а на форме будет печататься минимальный элемент и его индекс.
Сортировка массива по возрастанию методом перестановок
Идея алгоритма сортировки по возрастанию массива, состоящего из N элементов, методом перестановок элементов состоит в последовательном поиске минимальных элементов и их перемещении к началу массива с помощью перестановок с элементами, имеющими меньший индекс.
На первом шаге находим минимальный элемент массива и меняем его местами с первым элементом массива. Остаются неупорядоченными N— 1 элемент. Проводим поиск минимального элемента среди элементов с индексами от 2 до N и делаем перестановку.
Повторяем процедуру поиска минимального элемента среди оставшихся неупорядоченных элементов многократно. Повторение реализуем с помощью цикла со счетчиком, максимальное значение которого составляет N—1. В результате массив сортируется по возрастанию.
Так как поиск минимального элемента массива проводится многократно, реализуем рассмотренную ранее событийную процедуру cmdMin_Click () как общую процедуру МинЭлемент (bytl, bytN As Byte), где bytl — является входным параметром, a bytN — выходным параметром.
7) Ввести программный код общей процедуры поиска минимального элемента и поместить ее в начало программного кода проекта. Объявить переменные, используемые во всех процедурах:
Dim bytA(l To 10), bytMin, bytl, bytj, bytK,
bytR, bytN As Byte,
'общая процедура поиска минимального элемента
Sub МинЭлемент (bytl, bytN As Byte)
bytMin = bytA(bytl)
bytN = bytl
For bytJ = bytl + 1 To 10
If bytA(bytJ) < bytMin
Then bytMin = bytA (bytJ): bytN = bytJ
Next bytJ
End Sub
Событийная процедура, реализующая сортировку массива, будет включать в себя вызов общей процедуры поиска минимального элемента и код перестановки элементов.
Процесс сортировки массива можно сделать наглядным, если в текстовое поле выводить состояние массива на каждом шаге сортировки.
8) Поместить на форму текстовое поле txtSort и кнопку cmdSort. Присвоить свойству кнопки Caption значение Сортировать.
9) Ввести программный код событийной процедуры сортировки массива:
'событийная процедура сортировки
Private Sub cmdSort_Click() txtSort.Text = ""
For bytl = 1 To 9
'вызов общей процедуры поиска минимального элемента
Call МинЭлемент(bytl, bytN)
'перестановка
bytR = bytA(bytl)
bytA(bytl) =bytA(bytN)
bytA(bytN) = bytR
'печать массива для каждого цикла сортировки
For bytK = 1 То 10
txtSort.Text = txtSort.Text + Str(bytA(bytK)) Next bytK
Next bytI
End Sub
10) Для большей наглядности разместить на форме две метки с номерами элементов массива (горизонтальная) и значениями счетчика цикла сортировки (вертикальная).
11) Запустить проект на выполнение. Щелкнуть по кнопкам Заполнить массив,
Мин. элемент и Сортировка.
12) Процедуру можно производить многократно и наблюдать процесс сортировки для различных вариантов заполнения массива.