Описание процедур и функций

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

Заголовок блока определяет форму вызова подпрограммы. В разделе описаний блока объявляют внутренние локальные ресурсы блока (переменные, типы, внутренние подпрограммы). Раздел операторов содержит инструкции подпрограммы в операторных скобках begin ...end.

Заголовки процедур и функций описываются по-разному. В отличие от процедуры функция всегда возвращает в точку вызова скалярное значение, адрес или строку. Тип возвращаемого результата описывается в заголовке функции.

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

Из основной программы данные могут быть получены:

· неявно, с использованием глобальных констант и переменных;

· явно через параметры.

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

В свою очередь локальные ресурсы, объявленные в разделе описаний подпрограммы, из программного блока, в разделе описания которого она определена, не доступны. В том случае, если в подпрограмме объявляется ресурс, имя которого совпадает с именем глобального ресурса, соответствующий глобальный ресурс в подпрограмме становится не доступным, «перекрывается».

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

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

В Borland Pascal параметры в подпрограмму могут передаваться тремя способами:

· как значения - в подпрограмму передаются копии значений параметров, и никакие изменении этих копий не возвращаются в вызывающую программу;

· как переменные - в подпрограмму предаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме на самом деле происходят с переменными, переданными в качестве фактических параметров; такие параметры при описании помечаются служебным словом var; в качестве фактических значений параметров-переменных нельзя использовать –литералы.

· как неизменяемые переменные (именованные константы) — в подпрограмму, так же как и в предыдущем случае, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке: такие параметры при описании помечаются служебным словом const.

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

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

<имя процедуры>(<фактические параметры>).

Вызов процедуры и функции по-разному изображается па схеме алгоритма: вызов функции - в блоке «процесс» или блоке вывода, а для вызова процедуры используется специальный блок «предопределенный процесс». Схемы алгоритмов же самих подпрограмм в обоих случаях оформляются отдельно, причем вместо слова «начало» указывают имя подпрограммы, а вместо слова «конец» - указывают слово «возврат» или «return».

Пример. Разработать программу, которая определяет площадь четырехугольника по заданным длинам сторон и диагонали.

Будем считать площадь четырехугольника как сумму площадей двух треугольников, определенных по формуле Герона. Вычисление площади треугольника оформим как подпрограмму. Исходные данные такой подпрограммы -длины сторон треугольника. Подпрограмма не должна менять значения параметров, поэтому их можно передать как параметры-значения или параметры-константы. Результат работы этой подпрограммы - скалярное значение, значит, она может быть реализована как функция. Однако ее также можно реализовать как процедуру, которая возвращает результат через параметр-переменную.

Ниже приведены тексты соответствующих программ.

Вариант с использованием функции:

Var A,B,C,D,E:real; {глобальные переменные}

{описание функций}

Function Stf(const X,Y,Z: real) :real;

Var p: real; {локальная переменная}

begin {раздел операторов функции}

p:=(X+Y+Z)/2;

Stf:= sqrt(p*(p-X)*(p*Y *(p-Z);

end;

{раздел операторов основной программы}

Begin

Writeln('Введите длины сторон и диагонали');

Readln(А,B,C,D,Е);

Write ('Площадь четырехугольника', Stf(A,B,E)+StflC,D,E):7:3);

End

Вариант с использованием процедуры:

Program ex;

Var A,B,C,D,E:reaI; S1,S2:real; {глобальные переменные}

{описание процедуры}

Procedure Stp(const:X,Y,Z:real;var S:real);

Var p:real; {локальная переменная}

begin {раздел операторов процедуры }

p:=(X+Y+Z)/2;

S:=sqrt(p*(p-X)*(p- Y)*(p-Z));

end;

{раздел операторов основной программы}

Begin

WriteLn('Bвeдите длины сторон и диагонали');

ReadLn(A,B,C,D,E);

Stp(A,B,E,S1); {вызов процедуры}

Stp(C,D,E.S2); {вызов процедуры)

Writeln('Площадь четырехугольника ',S1+S2:7:3);

End.

Использование параметров структурных типов, таких как массивы, строки (кроме типа string), множества, записи, файлы, имеет одну общую особенность: тин таких параметров должен быть предварительно объявлен к инструкции описания типа type.

Например:

Type mas = array[1..10] of real;

Str80=string[80];

procedure A(M:mas; fout:str80);...

Пример. Разработать подпрограмму суммирования элементов массива размерности 10 целых чисел.

Поскольку результат - скалярное значение, то будем использовать подпрограмму-функцию. Описание типа «массив из 10 целых чисел» должно быть выполнено отдельно в разделе описаний. Новый тип mas затем используется при объявлении массива а и при объявлении типа массива, передаваемого через параметр-значение. Полный текст программы представлен ниже.

Program ex;

Type mas=array[1..10] of integer; {тип «массив из 10 целых чисел»}

Var a: mas;

i,n:integer;

function sum(b:mas; n:integer):integer;

Var s:integer; i: integer;

Begin s:=0;

for j:=1 to n do s:=s+b[i];

sum:=s;

End;

Begin

ReadLn(n);

for i:=1 to n do Read(a[i]);

ReadLn;

WriteLn('Сумма = ', sum(a,n));

End.

В соответствии с рекомендациями структурного программирования реализация и отладка программы также должны выполниться поэтапно. Сначала реализуют основную программу, используя вместо подпрограмм следующего уровня «заглушки» (подпрограммы, у которых отсутствуют операторы между begin и end). Затем реализуют эти подпрограммы, используя заглушки вместо подпрограмм следующего уровня и т.д.

 


Лекция 13. Схема передачи параметров-значений и параметров-переменных(2 часа)








Дата добавления: 2015-12-01; просмотров: 1312;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.02 сек.