ОБЩИЕ ПРОЦЕДУРЫ Общая процедура - это обособленная часть программы, выполняющая действие, которое является типичным для данной программы. Общая процедура может быть реализована в виде подпрограммы (процедуры типа Sub) или в виде функции (процедуры типа Function). Отличие общих процедур от процедур обработки событий состоит в том, что они начинают работать не после какого–либо события, а после обращения к ним из какого– либо места программы. Кроме того, сам программист придумывает им названия, составляет алгоритмы и записывает коды для них. ПОДПРОГРАММЫ–ПРОЦЕДУРЫ Подпрограммой называется программа, имеющая собственное название, пользуясь которым, ее можно исполнить из другой программы. Ее название оформляется в самом начале подпрограммы строкой Private/Public Sub <НАЗВАНИЕ ПРОГРАММЫ> и заканчивается строкой End Sub. Подпрограммы Private доступны только в пределах формы, в кодовом окне элемента которой размещены, подпрограммы Public размещаются в модуле и доступны из любого места проекта. Если подпрограмме для ее работы должны передаваться какие–либо значения переменных, то в названии подпрограммы в скобках должны указываться наименования переменных того же типа, что и эти значения. При составлении подпрограммы следует использовать эти наименования. При выполнении же подпрограммы каждый раз вместо них будут автоматически подставляться значения, переданные при обращении к подпрограмме. Пример названия подпрограммы: Public Sub summir(a As Integer, b As String) . Обращение к подпрограмме производится любым из следующих способов, показанных на примере: summir 5, "Общий итог" Call summir(5, "Общий итог") Кстати, код любого элемента управления также оформлен как подпрограмма, поэтому к нему можно обратиться не только щелкнув мышью, но и программным путем. Создание подпрограммы–процедуры и обращение к ней из основной программы проследим на примере решения такой задачи: Задача 1. Составить проект программы, в котором по заданным координатам вершин выпуклого пятиугольника определяется его площадь. Программный код для решения задачи разделим на две части. В подпрограмму вынесем вычисление площади одного треугольника, а в основной программе выполним ввод исходных данных и вычисление площади пятиугольника. Программный код подпрограммы–процедуры можно представить в таком виде: Private Sub Square(X1 As Integer, Y1 As Integer, X2 As Integer, _ Y2 As Integer, X3 As Integer, Y3 As Integer, Sq As Single) Dim A As Single, B As Single, C As Single, P As Single A = Sqr((X2 - X1) ^ 2 + (Y2 - Y1) ^ 2) B = Sqr((X3 - X1) ^ 2 + (Y3 - Y1) ^ 2) C = Sqr((X2 - X3) ^ 2 + (Y2 - Y3) ^ 2) P = (A + B + C) / 2 Sq = Sqr(P * (P - A) * (P - B) * (P - C)) End Sub Программный код основной программы: Private Sub Command1_Click() Dim S As Single Dim XA As Integer, YA As Integer, XB As Integer, YB As Integer Dim XC As Integer, YC As Integer, XD As Integer, YD As Integer Dim XE As Integer, YE As Integer Dim S1 As Single, S2 As Single, S3 As Single XA = Val(InputBox("Введите координату Х точки А")) YA = Val(InputBox("Введите координату Y точки А")) XB = Val(InputBox("Введите координату Х точки B")) YB = Val(InputBox("Введите координату Y точки B")) XC = Val(InputBox("Введите координату Х точки C")) YC = Val(InputBox("Введите координату Y точки C")) XD = Val(InputBox("Введите координату Х точки D")) YD = Val(InputBox("Введите координату Y точки D")) XE = Val(InputBox("Введите координату Х точки E")) YE = Val(InputBox("Введите координату Y точки E")) Call Square(XA, YA, XB, YB, XC, YC, S1) Square XA, YA, XC, YC, XD, YD, S2 Square XA, YA, XD, YD, XE, YE, S3 S = S1 + S2 + S3 Print "Площадь пятиугольника=", S End Sub ПОДПРОГРАММЫ–ФУНКЦИИ Подпрограмма–функция отличается от подпрограммы–процедуры тем, что она не вызывается из какого либо места программы, а включается в состав выражения, значение которого как–то используется в каком–либо месте программы. Подпрограмма–функция также имеет свое название. Ее название оформляется в самом начале подпрограммы–функции строкой [Private/Public] Function <Название функции> As <Тип функции> и заканчивается строкой End Function. Назначение служебных слов Private и Public такое же, как для подпрограмм–процедур. Если подпрограмме– функции для ее работы должны передаваться какие–либо значения переменных, то в названии подпрограммы–функции в скобках должны указываться наименования переменных того же типа, что и эти значения. Подпрограмма–функция возвращает одно значение, которое присваивается названию функции в теле подпрограммы–функции, поэтому мы обязательно должны указать тип функции - тип возвращаемого значения. Обращение к подпрограмме–функции производится написанием имени подпрограммы–функции с указанием в скобках имен переменных того же типа, что и в подпрограмме–функции. Продемонстрируем использование подпрограмм–функций на примере решения такой задачи. Задача 2. Составить проект программы, в котором определяется: счастливый ли троллейбусный билет вы приобрели? Номера троллейбусных билетов представляют собой шестизначные числа. Счастливым считается тот билет, у которого сумма первых трех цифр равна сумме трех последних. Разобьем решение задачи на две составные части: в основной будем осуществлять ввод исходного числа, его проверку на принадлежность диапазону шестизначных чисел и вывод ответа, а во второй в подпрограмме– функции luck будем определять, является ли число счастливым, а в подпрограмме–функции s находить сумму трех цифр числа. Программный код подпрограммы–функции luck: Private Function s(x As Integer) As Integer s=0 For i = 1 To 3 s = s + x Mod 10: x = x \ 10 Next i End Function Программный код подпрограммы–функции s: Private Function luck(x As Long) As Boolean Dim x1 As Integer, x2 As Integer x1 = x \ 1000 x2 = x Mod 1000 luck = False If s(x1) = s(x2) Then luck = True End Function Программный код основной процедуры: Private Sub Command1_Click() Dim x As Long x = Val(InputBox("Введите номер билета")) If x >= 100000 And x <= 999999 Then If luck(x) = True Then Print "Билет счастливый" Else Print " Билет не счастливый " End If Else Print "Число не является шестизначным" End If End Sub Примечание. В VB есть два способа передачи аргументов в процедуру (общую или событийную) - по значению (ByVal) или по ссылке (ByRef). Различие между ними состоит в том, что при передаче аргумента по ссылке процедура может изменить это значение во время работы с ним, а при передаче по значению - нет. Следует отметить, что приведенные выше примеры демонстрируют использование подпрограмм-процедур и функций с передачей параметров по умолчанию “по значению”. Рассмотрим, как происходит передача значений по значению (ByVal) или по ссылке (ByRef), решая следующую простейшую задачу. Задача 3. Ввести в основной программе два числа, в подпрограмме – процедуре возвести эти числа в квадрат, передав первое число по значению, второе по ссылке, и в основной программе вывести числа до обращения к процедуре и после обращения к ней. Программный код подпрограммы–процедуры kv, расположенной в Области General формы: Dim x As Integer, y As Integer Sub kv(ByVal a, ByRef b) a=a^2 b=b^2 Print "Квадрат первого числа - "; a Print "Квадрат второго числа - "; b End Sub Программный код основной процедуры: Private Sub Command1_Click() x = Val(InputBox("Введите первое число")) y = Val(InputBox("Введите второе число")) Print "Исходное значение первого числа - "; x Print "Исходное значение второго числа - "; y kv x, y Print "Значение первого числа после обращения к подпрограмме - "; x Print "Значение второго числа после обращения к подпрограмме - "; y End Sub Результат работы программы представлен на рис. 1. Рис. 1. Результат работы программы задачи 3 РЕКУРСИЯ Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе. Можно создавать рекурсивные подпрограммы– процедуры и подпрограммы–функции. Использование рекурсивной функции и рекурсивной процедуры рассмотрим, решая такую задачу. Задача 1: Вычислить N! (вычисление факториала). Здесь N – натуральное число, введенное с клавиатуры. T – значение N!. Решение задачи с помощью рекурсивной функции можно выполнить с помощью такого программного кода. Программный код рекурсивной подпрограммы–функции fak, расположенной в Области General формы: Public Function fak(N As Integer) As Long If N = 0 Then fak = 1 Else fak = N * fak(N - 1) End If End Function Программный код основной процедуры: Private Sub Command1_Click() Dim N As Integer, P As Long N = Val(InputBox("Введите натуральное число")) If N > 0 Then P= fak(N) : Print " Факториал числа "; N; " равен="; P Else Print "Число должно быть натуральным" End If End Sub Решение этой же задачи с помощью рекурсивной процедуры можно выполнить с помощью такого программного кода. Программный код рекурсивной подпрограммы–процедуры fak, расположенной в Области General формы: Sub fak(N As Integer, T As Long) If N = 1 Then T=N*T Else T = N * T: Call fak(N - 1, T) End If End Sub Программный код основной процедуры: Private Sub Command1_Click() Dim N As Integer, T As Long N = Val(InputBox("Введите натуральное число")) T=1 If N > 0 Then Call fak(N, T) : Print " Факториал числа "; N; " равен="; T Else Print "Число должно быть натуральным" End If End Sub