Определение. Подпрограмма - это отдельная функционально независимая часть программы.
Подпрограммы решают три важные задачи:
- избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;
- улучшают структуру программы, облегчая ее понимание;
- повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификациях программы.
Очень важно понимать, что в подпрограмму может выделяться любой законченный фрагмент программы. В качестве ориентиров просмотрите следующие рекомендации:
- Когда Вы несколько раз перепишете в программе одну и ту же последовательность команд, необходимость введения подпрограммы приобретает характер острой внутренней потребности.
- Иногда слишком много мелочей заслоняют главное. Полезно убрать в подпрограмму подробности, скрывающие смысл основной программы.
- Полезно разбить длинную программу на составные части - просто как книгу разбивают на главы. При этом основная программа становится похожей на оглавление.
- Бывают сложные частные алгоритмы. Полезно отладить их отдельно в небольших тестирующих программах. Включение отлаженных алгоритмов в основную программу будет легким, если они оформлены как подпрограммы.
- Все, что Вы сделали хорошо в одной программе, Вам захочется перенести в новые. Для повторного использования таких частей лучше сразу выделять в программе полезные алгоритмы в отдельные подпрограммы.
Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.
Стандартная подпрограмма (процедура или функция) - подпрограмма, включенная в библиотеку программ, доступ к которой обеспечивается средствами языка программирования. Вызывается подпрограмма по имени с заданием фактических параметров. Типы фактических параметров должны соответствовать типам формальных параметров, указанным при описании данной процедуры в библиотечке процедур и функций.
Из набора стандартных процедур и функций по обработке одного типа информации составляются модули.
Формальные и фактические параметры
Формальные параметры подпрограммы указывают, с какими аргументами следует обращаться к этой подпрограмме (количество аргументов, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка.
Все формальные параметры можно разбить на четыре категории:
- параметры-значения;
- параметры-переменные;
- параметры-константы
- параметры-процедуры и параметры-функции.
Для каждого формального параметра следует указать имя и, как правило, тип, а в случае параметра-переменной или параметра-константы - его категорию. Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае объект основной программы с таким именем становится недоступным для непосредственного использования подпрограммой. Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип.
Вызов по ссылке и по значению
Список параметров, задаваемый в заголовке процедуры или функции, обеспечивает связь подпрограммы с вызывающей программой. Через него в подпрограмму передаются исходные данные и возвращается результат. При этом предусмотрено два принципиально отличающихся механизма передачи параметров - по значению и по ссылке.
При вызове по значению в подпрограмме создаются переменные в соответствии с объявлениями в заголовке подпрограммы. Эти переменные существуют только на время выполнения подпрограммы. В вызывающей программе в качестве аргумента подпрограммы может использоваться не только переменная, но и выражение. В начале выполнения подпрограммы значение этой переменной или выражения присваиваются внутренней временной переменной подпрограммы. Когда подпрограмма завершается, используемые подпрограммой переменные не сохраняют своего значения, поэтому передачу данных по значению можно использовать только для передачи данных в подпрограмму, но не для получения от нее результатов.
При вызове по ссылке в подпрограмме память под передаваемые переменные не отводится. Основная программа передает в подпрограмму не значение переменной, а ссылку на место в памяти основной программы, где расположена некоторая переменная. Подпрограмма, производя некоторые действия с этой переменной, в действительности производит действия с переменной основной программы, поэтому после выполнения процедуры изменения, совершенные с переменными основной программы, сохраняются. Этот механизм используется для получения от подпрограммы результатов ее выполнения. Понятно, что при вызове подпрограмм с передачей данных по ссылке невозможно использовать в качестве аргументов выражения или константы, так как они не имеют адреса для передачи.
Параметры–значения
Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий и, следовательно, соответствующие фактические параметры программы подпрограммой измениться не могут.
Параметр-значение указывает в заголовке подпрограммы своим именем и через двоеточие - типом. Тип параметра-значения может быть любым за исключением файлового.
Если параметров - значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать общий тип. Как отмечалось выше, отдельные группы параметров отделяются друг от друга точкой с запятой.
Функция
Другой вид подпрограммы – функция оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу.
Вызывается функция по её имени с указанием фактических параметров.
Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.
Различие между процедурами и функциями
Функции - это процедуры особого вида, результатом работы которых является некоторое значение, подобное переменной.
Функция, как и процедура, может иметь список параметров, следующих за именем функции в круглых скобках. Но если имя процедуры используется только для ее вызова, то с именем функции связывается ее значение
Модули, созданные программистом
Программы, написанные Вами и оформленные в виде готовых к употреблению процедур и функций, можно применять в других программах. Основная концепция такого подхода заключается в объединении своих процедур и функций в собственные библиотеки, которые могут подключаться к разрабатываемым программным продуктам.
Использование модулей считается прогрессивным подходом в программировании, т.к. модуль компилируется независимо от программы, а поэтому время компиляции для больших программ может существенно сократиться, что очень важно при отладке программ.
Модуль включает в себя определения констант, типов данных, переменных, процедур и функций, доступных для использования в вызывающих программах. Однако внутренняя структура модуля скрыта от пользователя.
Модуль можно разделить на несколько разделов: заголовок, интерфейсная часть, реализационная часть, инициализационная часть.
Процедуры Sub…End Sub
Синтаксис процедуры Sub.. .End Sub такой:
[Private I Public] [Static] Sub имя [(список)]
[операторы]
[Exit Sub]
[операторы]
End Sub
Процедура - подпрограмма, которую вызывают для выполнения каких либо действий, но от которой не требуется возвращать основной программе какие либо значения. Другими словами процедура это любая подпрограмма которая не является функцией.
Параметры
Private Процедуры объявленные как Private, можно вызывать только в текущем модуле.
Public Процедуры объявленные как Public, можно вызывать в любом модуле приложения.
Static Все переменные, объявленные в процедуре, будут статическими, т.е. их значения сохраняются между вызовами.
Имя Имя процедуры, удовлетворяющее стандартным правилам описания переменных. Этот идентификатор не может быть использован нигде, кроме обращения к процедуре.
Параметры Список формальных параметров, значения которых передаются в процедуру. Разделителем в списке параметров является запятая (,).
Операторы Любая группа операторов, выполняемых в процедуре или функции.
Тип Тип возвращаемого значения функции.
Выражение Возвращаемое значение функции.
Обращение к процедуре
Используется оператор вызова процедуры, который имеет следующий вид:
Call Имя [(Список фактических параметров)]
Имя – это имя вызываемой процедуры, определенной в программе при помощи оператора Sub.
Список фактических параметров – это список фактических параметров, разделенных запятыми.
В качестве фактических параметров можно использовать константы, переменные, выражения и массивы.
Если фактическим параметром является массив, то в списке параметров пишется имя массива, а затем ().
Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу.
Порядок обращения к процедуре
Вызов процедуры при помощи оператора Call.
Формальные параметры в процедуре заменяются на фактические.
Вычисление при помощи данной процедуры с фактическими параметрами.
Возврат в основную программу к оператору, следующему после обращения.
Пример обращения к процедуре:
Private Sub button1_Click()
Dim a() As Single, s As Single, i As Integer, n As Integer
n = CSng(InputBox("n"))
Redim a(0 to n-1)
For i = 0 To n-1
a(i) = CSng(InputBox("a(i)"))
Next i
Call sum(n, a, s)
ТextBox1.Text=TextBox1.Text + “s="+CStr(s)
End Sub
Формальные и фактические параметры
Формальные параметры подпрограммы указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Формальные параметры - это искусственные переменные, они показывают, что должно быть проделано с теми реальными переменными, которые будут указаны как фактические параметры.
Формальные параметры используются в операторе описания процедуры или функции.
Фактические параметры – это реальные переменные, с которыми происходит обращение к процедуре или ф-ции.
VB требует строгого соответствия типа между формальными и фактическими параметрами, т.е. например, Integer - Integer , Single – Single.