
- •7.1. Необходимость структуризации в программировании
- •7.2. Подпрограммы в языке паскаль
- •7.2.1. Стандартные библиотечные модули
- •7.2.2. Встроенные функции и процедуры
- •7.3. Процедуры и функции пользователя
- •7.3.1. Процедуры
- •7.3,2. Функции
- •7.3.3. Механизм передачи параметров
- •7.3.4. Область действия параметров
- •7.3.5. Рекурсии
- •7.3.6. Нетрадиционное использование подпрограмм
7.3. Процедуры и функции пользователя
Если в программе возникает необходимость частого обращения к некоторой группе операторов, выполняющих действия или вычисляющих значение какого-ли бо выражения, то рационально сгруппировать такую группу операторов в само стоятельный блок, к которому можно обращаться, указывая его имя. Такие разра ботанные программистом самостоятельные программные блоки называются под программами пользователя. Они являются основой модульного программирова ния. Разбивая задачу на части и формируя логически обособленные модули как процедуры и функции, программист реализует основные принципы широко ис пользуемого в практике системного подхода и методов нисходящего программиро вания. ,
При вызове подпрограммы (процедуры или функции), определенной программистом, работа главной программы на некоторое время приостанавливается и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из главной программы. По завершении выполнения подпрограмма-функция
зозвращает главной программе результат (подпрограмма-процедура не возвращает ibho результирующего значения).
Передача данных из главной программы в подпрограмму и возврат результата выполнения функции осуществляются с помощью параметров.
Параметром называется переменная, которой присваивается некоторое значение в рамках указанного применения. Различают формальные параметры — параметры, определенные в заголовке подпрограммы, и фактические параметры — выражения, задающие конкретные значения при обращении к подпрограмме. При обращении к подпрограмме ее формальные параметры замещаются фактическими, переданными из главной программы. Механизм передачи параметров рассмотрим далее.
7.3.1. Процедуры
' Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Имя процедуры — идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе. Общая структура описания процедур и функций иллюстрируется следующими синтаксическими диаграммами.
Описание процедуры:
Описание функции:
Заголовок процедуры:
Заголовок функции:
Описания меток, констант, типов и т. д. действительны только в пределах данной процедуры. В теле процедуры можно использовать любые глобальные константы и переменные.
В качестве примера опишем процедуру, которая прерывает, выполнение про граммы и выдает соответствующее сообщение об ошибке: г
В данной процедуре пользователя использована переменная Msg типа string, в которой хранится текст сообщения о характере ошибки, вызвавшей прерывание программы. Для прерывания выполнения программы используется стандартная процедура Halt из стандартного библиотечного модуля System.
Процедура не может выполниться сама, ее необходимо вызвать по имени и указать фактические параметры того же типа, что и формальные. Количество и тип формальных параметров равны количеству и типу фактических параметров. В качестве примера приведем фрагмент программы, в котором используется описанная выше процедура Abort:
В разделе описания программы описываются константа Limit, ограничивающая количество вводимых чисел; в разделе описания переменных описываются переменные Count, Item, Sum типа integer. Затем в блоке описания записана директива компилятору {$1 ABORT.PAS}, указывающая, что при компиляции данной программы в нее нужно включить в качестве процедуры программу ABORT.PAS.
В начале программы обнуляются значения количества введенных чисел Count и их сумма Sum. Потом выполняется цикл, пока очередное вводимое число меньше предельного, заданного значением константы Limit. Сначала устанавливается номер очередного числа, затем на экран выводится приглашение "Введите 1—е (2—е и т.п.) число", считывается значение числа с клавиатуры в переменную Item. Затем проверяется условие Item<0.
Если условие выполняется, то вызывается внешняя процедура Abort, которой передается фактический параметр-значение "введено отрицательное число". Это значение присваивается формальному параметру Msg процедуры Abort. Процедура Abort выводит на экран сообщение "Ошибка: и печатает текст сообщения — значение параметра Msg "введено отрицательное число", после чего вызывает стандартную процедуру Halt(l), которая прерывает выполнение программы.
Если условие Item<0 не выполняется, то значение суммы Sum увеличивается на значение введенного числа Item, и управление передается в заголовок цикла для проверки условия Count < Limit. Если условие соблюдается, то тело цикла выполняется еще раз, иначе цикл завершается, а управление в программе передается на оператор, следующий за циклом, т. е. за резервированным словом end;, обозначающим окончание составного оператора в теле цикла. После этого на экран выводится
сообщение "Сумма введенных чисел равна" и печатается значение переменной Sum. На этом выполнение программы завершается.
Упражнение 1. Запустите интегрированную среду программирования. Введите в первое окно редактора текст программы DemoProc, а во второе окно — текст процедуры Abort и запишите файлы на диск под соответствующими именами.
Примечание. Чтобы открыть новое окно в пункте File главного меню интегрированной среды программирования, выберите опцию New. Для перехода из одного окна в другое нажимайте F6.
Откомпилируйте файл DemoProc. Если появятся сообщения об ошибке, внесите исправления и откомпилируйте вновь. После того как компиляция выполнится успешно, задайте для просмотра в окне отладчика величины Sum, Item и выражение Count < Limit. Для того чтобы одновременно на экране наблюдать окна с текстами программы и процедуры, а также окно просмотра значений переменных в пункте Window главного меню интегрированной среды, задайте опцию Tile. Нажатием клавиши F7 запустите программу на исполнение в пошаговом режиме с заходом в процедуры. Экран компьютера будет выглядеть, как показано на рис. 7.1.
Нажимая клавишу F7, наблюдайте за значениями переменных и выражениями в окне просмотра.
В ответ на запрос "Введите число" введите отрицательное число и обратите внимание на соблюдение условия Item < 0, вследствие чего из основной программы вызывается процедура Abort. При этом в формальный параметр процедуры — переменную Msg передается значение сообщения "Введено отрицательное число". Результатом действия процедуры будет вывод на экран сообщения "Ошибка: введено отрицательное число" и прерывание работы программы.
Как видно из примера, параметры обеспечивают механизм замены, который "озволяет выполнять процедуру с различными строковыми сообщениями.
Если процедура возвращает в программу какие-то значения, соответствующие переменные должны быть описаны, как параметры-переменные с использованием :лова var (см. Параметры).