Описание процедур и функций
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, соответствующим образом оформленные и снабженные именем (программные блоки). По правилам 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;