Ид 21 ОАиПр 4 пара 13.01. Процедуры и функции, определенные пользователем
Скачать 20.56 Kb.
|
ПРОЦЕДУРЫ И ФУНКЦИИ, ОПРЕДЕЛЕННЫЕ ПОЛЬЗОВАТЕЛЕМ Технология программирования с использованием процедур и функций, организованных пользователем, дает ряд преимуществ. Именно благодаря ним обеспечивается возможность: - организовать работу нескольких программистов над одной программой с последующим объединением отдельно отлаженных и относительно независимых блоков в единое целое; - проводить отладку отдельных блоков и только после этого программы в целом; - значительно экономить память, так как многократно используемый участок (процедура или функция) заносится в память только один раз; - упростить внесение изменений в программу, так как исправление ошибки в одном блоке не вызывает корректировку других блоков. ПАСКАЛЬ допускает пять основных способов использования и размещения подпрограмм: · основная программа, процедуры и функции расположены в одном файле; · подпрограммы расположены в отдельных файлах и включаются в основной файл с помощью директивы компилятора $; · подпрограммы организуются как оверлейные структуры и поочередно загружаются в одно и то же место памяти; · подпрограммы пишутся на машинном коде и включаются в программу одним из вышеуказанных способов; · подпрограммы оформляются как "внешние" и вызываются из основной программы. ПРОЦЕДУРЫ ПОЛЬЗОВАТЕЛЯ Процедура пользователя представляет собой именованную группу операторов, реализующую определенную часть обшей задачи и вызываемую при необходимости для выполнения по имени из любой позиции раздела операторов. Описание процедуры включает заголовок и тело процедуры. Заголовок состоит из зарезервированного слова Procedure, идентификатора (имени) процедуры и необязательного заключенного в круглые скобки списка формальных параметров с указанием типа каждого параметра. Формат: Procedure <имя>[( формальные параметры )]; Пример. Procedure Sort (A : integer; В : real); Procedure Kvadr (Alpha, Beta : integer; var Gamma: boolean); Procedure SumVed; {алгоритм, реализованный процедурой, не требует формальных параметров} Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе: Procedure <имя> [( формальные параметры )]; <разделы описаний> begin <раздел операторов> end; Для обращения к процедуре используется оператор вызова процедуры. Он состоит из идентификатора (имени) процедуры и списка фактических параметров, отделенных друг от друга запятыми и заключенных в круглые скобки. Список параметров может отсутствовать, если процедуре не передается никаких значений. Формат: <идентификатор процедуры> <(параметр, … т, параметр)>; Пример. Sort (А1,В1); {параметры – значения переменных} Kvadr (14,25, True); {параметры – непосредственно значения} Sunf/ed; {фактические параметры не указаны, так как в вызываемой процедуре нет формальных параметров} Параметры обеспечивают механизм замены, который позволяет выполнять процедуру с различными начальными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимно-однозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров равны количеству и типу фактических параметров. Ниже приведена программа, реализующая с помощью процедуры без параметров очищение экрана, установку курсора в его центр и вывод слова 'СПРАВОЧНИК'. Program DemoProcedure; Procedure Ekran; begin ClrScr; GoToXY(30,12); Write(‘ СПРАВОЧНИК’) end; Begin Ekran; {вызов процедуры Ekran} End. Если процедура возвращает в программу какие-то значения, соответствующие переменные должны быть описаны как параметры-переменные с использованием слова Var. ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ Хотя набор встроенных функций языка ПАСКАЛЬ достаточно широк, он вряд ли может удовлетворить требованиям каждого программиста. Поэтому пользователю предоставлена возможность самому реализовать нужные ему алгоритмы в виде функций и обращаться к ним из программ по мере необходимости. Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово Function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Формат. Function < имя> < (Формальные параметры)> :< тип результата > Пример. Function Prov (X, Y, T : integer) : real; Function Zx : boolean; Имя функции – уникальный в пределах блока идентификатор. Возвращаемый результат может иметь любой скалярный тип, тип string и тип "указатель". Тело функции представляет собой локальный блок, по структуре аналогичный программе: Function <имя> {( Формальные параметры )> : <тип результата> <разделы описаний> begin <раздел операторов> end; В разделе операторов должен находиться, по крайней мере, один оператор, присваивающий идентификатору функции значение. Если таких присваиваний несколько, то результатом выполнения функции будет значение последнего оператора присваивания. Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип. Для иллюстрации использования функций рассмотрим подпрограмму, которая возводит в степень положительное или отрицательное число. Program DewoFunction; Var Z : integer; К : real; Function Step (F : real; Exp : integer) : real; Var С : integer; T: real; begin if Exp = 0 then Step := 1 else begin T := F; for С : = 2 to Abs(Exp) do T : - T * F; if Exp < О then Step := 1 / T else Step : = T; end end; Begin wri teln (' Введите число:'); read (Z); writeln (Step(Z,3)); {вывод Z в 3-й степени} wri teln (Step(Z,4)); {вывод Z в 4-й степени} К: =1.4; wri teln (Step(K,4)) {вывод К в 4-й степени} End. Виды ПАРАМЕТРов Параметры могут иметь любой тип, включая структурированный. ПАСКАЛЬ поддерживает два различных метода передачи параметров: по значению и по ссылкам. Когда параметры передаются по значениям, формальный параметр является переменной, локальной в блоке. Фактический параметр может быть любым выражением того же типа, что и соответствующий ему формальный параметр. Такие параметры называются параметрами-значениями. Их главная отличительная черта – изменение формальных параметров не влечет за собой изменения фактических параметров. Пример типичной записи параметров-значений в описании процедур и функций: Procedure Копе (А, В, С : integer; D : real); Function Docs (S1, S2 : real; Flag : boolean) : real; Тип параметров в секции формальных параметров должен быть указан в виде определенного ранее идентификатора типа. Так, запись Procedure Okl (Mas1 : array [1. .12] of real); является ошибочной. Тип переменной следует определить ранее в разделе описания типов блока: Type Massiv = array [1. .12] of real; Procedure Okl (Mas1 : Massiv); Когда параметр передается посредством ссылки, фактический параметр является переменной. Формальный параметр обозначает эту фактическую переменную в течение всего времени активизации блока. Параметры, переданные посредством ссылки, называются параметрами-переменными. Их характерный признак – любое изменение формального параметра означает изменение фактического параметра. Для описания параметров-переменных в секции формальных параметров служит зарезервированное слово Var. При использовании параметров-переменных формальные и фактические параметры должны совпадать по количеству и типу. Однако возможны два исключения: Формальные параметры без типа несовместимы ни с каким типом. Допустимо сочетание параметров-значений и параметров-переменных в одной секции формальных параметров: Procedure Prots (Var А, В, С : real; S : boolean); Такая запись означает, что А, В, С – параметры-переменные, а S – параметр-значение. Напомним, что если процедура должна возвратить в программу определенные результаты, они должны быть специфицированы как параметры-переменные, т. е. в сочетании со словом Var, в противном случае результаты не будут возвращены. |