Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Подпрограммы




Для оформления функционально законченных фрагментов алгоритмов в языке ТР предназначены процедуры и функции. Процедура может возвращать одно или несколько значений и обращение к ней осуществляется при помощи оператора процедуры. Функция возвращает только одно значение, а обращение к ней осуществляется по имени из выражения. Указание имени подпрограммы в тексте программы называется вызовом подпрограммы. В последних версиях Delphi (32-разрядных) функцию можно вызвать так же как и процедуру – без использования возвращаемого ею значения. Для этого надо установить флажок Extended Syntax на вкладке Proect>Options>Compiler или задать директиву компилятора {$X+}.

 

4.10.1. Подпрограмма процедура.

Форма записи процедуры имеет вид:

Procedure имя (список формальных параметров);

Раздел описаний

Begin

раздел операторов

End;

Где имя - формируется по общим правилам (последовательность букв и цифр, начинающаяся с буквы).

Список формальных параметров содержит имена данных, через которые значения данных передаются в процедуру и возвращаются результаты из процедуры. Заметим, что список может отсутствовать.

Список формальных параметров записывается в виде совокупности секций, разделенных символом "; ", каждая из которых содержит одно или несколько имен переменных и идентификатор типа.

Пример.

Procedure РР1(N: Integer; A, B: Extended);

Правило.

В списке формальных параметров можно указывать только идентификатор типа, но нельзя объявлять тип. Например, если в процедуру передается массив, то сначала надо в разделе TYPE определить идентификатор типа а затем использовать его в списке формальных параметров.

Пример.

Type Rm1 = Array [1.. 20 ] Of Extended;

Rm2 = Array [1.. 30 ] Of Integer;

...........

Procedure РР2 (N: Integer; Y: Rm1; Z,Rtk: Rm2;....);

 

Существует три типа параметров процедуры: параметр-переменная, параметр-значение и параметр- константа.

Группа параметров, перед которыми стоит ключевое слово Var и за которыми следует идентификатор типа, является списком параметров-переменных.

Группа параметров, перед которой отсутствует ключевое слово Var и за которыми следует идентификатор типа, является списком параметров-значений.

Группа параметров, перед которыми стоит ключевое слово Const, является списком параметров-констант.

Пример.


Рис.4.17.1.

Параметр-переменная используется, когда значение должно передаваться из процедуры в программу. Фактический параметр, в операторе вызова процедуры, соответствующий формальному параметру переменной, должен быть ссылкой на переменную (нельзя выражение). При активизации процедуры формальный параметр-переменная замещается фактической переменной, то есть для этой переменной в процессе выполнения процедуры используется ячейка памяти фактического параметра, поэтому любое изменение формального параметра-переменной отражается на значении фактического параметра.

Тип фактического параметра должен совпадать с типом соответствующего параметра-переменной. Если формальный параметр имеет строковый тип, то ему присваивается атрибут длины равный 255. Соответствующий фактический параметр должен иметь строковый тип с атрибутом длины равным 255. Файловый тип может передаваться только как параметр переменная.

Формальный параметр-значение обрабатывается как локальная по отношению к подпрограмме переменная (для нее выделяется ячейка памяти соответствующего типа). При обращении к процедуре этим параметрам присваиваются значения соответствующих фактических параметров, но при возврате из процедуры в вызывающую программу никаких присваиваний не делается. Изменения параметра-значения в процессе выполнения процедуры не влияет на значение соответствующего ему фактического параметра. Фактический параметр должен иметь тип, совместимый по присваиванию с типом формального параметра-значения. Если фактический параметр имеет строковый тип, то формальный параметр будет иметь атрибут размера, равный 255. Фактический параметр соответствующий формальному параметру-значению, не может иметь файловый тип.

Если параметр определен как параметр-константа, то в подпрограмму также передается адрес области памяти, в которой располагается переменная или вычесленное значение. Однако компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.

Для передачи результатов в программу можно использовать параметры переменные, которым предшествует зарезервированное слово Out. Параметры Out нельзя использовать в подпрограмме как входные, они предназначены только для передачи результатов в вызывающую программу.

При выборе вида формальных параметров надо учитывать, что при объявлении параметра-значения осуществляется копирование фактического параметра во временную память. Если этим параметром будет массив большого размера, то могут существенно возрасти затраты памяти и времени на копирование при многократных обращениях к подпрограмме. Эти затраты можно минимизировать, объявив эти параметры как параметры-константы. Параметры-константы не копируются во временную область памяти, что сокращает затраты времени на вызов подпрограммы, а любые изменения параметра-константы невозможны – за этим строго следит компилятор.

Тело процедуры записывается по общим правилам языка ТР и может содержать все те же разделы, что и сама программа, а именно: разделы констант, меток, типов, переменных, процедур и функций и раздел операторов.

Правила.

- В разделе переменных должен быть указан тип всех внутренних переменных, используемых в подпрограмме.

- В разделе процедур и функций подпрограммы можно размещать другие процедуры и функции, которые использует эта подпрограмма. Но эти подпрограммы будут недоступны главной программе и другим подпрограммам.

- Область действия меток, указываемых в разделе меток подпрограммы, ограничивается рамками подпрограммы. На них нельзя ссылаться из главной программы и других подпрограмм.

- Если переменная, используемая в процедуре, не указана в разделе переменных процедуры и отсутствует в списке формальных параметров, то считается, что это переменная из блока более высокого уровня. Такие переменные называются глобальными.

Пример записи программы с процедурой.

 

Схемы алгоритмов главной программы и процедуры FX(A, B, X, Y); приведены на рис.4.17.2.

Текст программы.

Program PRP;

Var A, B, X, Y: Extended;

Procedure FX (A, B, X: Extended; Var Y:Extended;

Var Z: Extended;

Begin;

Z: = A * X * X + Exp (B * X);

If X > 0 Then Y:= B * Z * Z + A

Else Y: = A * Z * Z + B;

End; { конец Fx }

Begin

Read (A, B, X);

Writeln (‘ A = ‘, A, ‘ B = ‘, B, ‘ X = ‘, X);

FX (A, B, X, Y);

Writeln (‘ результат Y = ‘, Y: 14);

End.

 

4.10.2. Подпрограмма функция.

Подпрограммы функции предназначены для оформления алгоритмов, результатом выполнения которых является одно значение. Это значение возвращается из подпрограммы через имя функции. Форма записи функции имеет вид

Function имя (список): идт;

. Раздел объявлений........

........

Begin

.. раздел операторов....

имя функции: = выражение;

.......

End;

 

Где имя - это имя подпрограммы функции;

список - список формальных параметров с указанием их типа;

Идт - идентификатор типа значения имени функции.

В отличие от процедуры имя подпрограммы функции получает значение (то есть имя функции используется и для обозначения подпрограммы и в качестве переменной для возврата значения из подпрограммы), поэтому необходимо указать тип имени функции.

После заголовка записывается тело функции по общим правилам языка ТР. В теле функции хотя бы один раз должен появиться оператор присваивания значения имени функции.

Пример. Вычисление N!

Function Fact (N: Integer): Integer;

Var M, K: Integer;

Begin

K: = 1;

For I: = 2 To N Do

K: = K * M;

Fact: = K

End;

Правила.

Имя функции нельзя использовать в правой части оператора присваивания, то есть в этом примере нельзя записать Fact: = Fact * M.

В теле функции хотя бы один раз должен появиться оператор присваивания значения имени функции.

Так как функция возвращает только одно значение, то тип имени функции может быть только простым (или строковым).

Вызов имени функции осуществляется по имени из выражения, например

Y: = (A + B * X) / Fact (P);

В списке параметров могут быть параметры значения и параметры переменные. Параметры переменные обычно используют при обработке больших массивов для экономии памяти.




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 322; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.