Очень часто в программах встречаются однотипные участки, которые выполняют одни и те же вычисления с различными данными. Такие части программ целесообразно выполнять с помощью подпрограмм. Использование подпрограмм позволяет:
1) сделать основную программу более наглядной и компактной;
2) уменьшить объем используемой памяти ЭВМ;
3) сократить время написания и отладки программы, так как различные подпрограммы могут быть написаны различными людьми параллельно.
В Турбо Паскале имеется две разновидности подпрограмм: процедуры и функции. Структура любой подпрограммы аналогична структуре всей программ. Подпрограмма должна быть описана в разделе описания подпрограмм до того, как она будет использована в программе или другой подпрограмме.
Все параметры, которые использует подпрограмма, можно разбить на две категории: локальные параметры, объявленные внутри подпрограммы и доступные только ей самой, и глобальные – объявленные в основной программе и доступные как программе, так и всем её подпрограммам.
По мимо этого можно выделить ещё два вида параметров: фактические и формальные. Формальные параметры – параметры, определённые в заголовке подпрограммы. Фактические параметры – выражения, задающие конкретные значения при обращении к подпрограмме. При обращении к подпрограмме её формальные параметры замещаются фактическими, переданными из главной программы.
Раздел описаний, как и в основной программе, может включать разделы Uses, Label, Const, Type, Var и раздел вложенных процедур и функций.
Формальные параметры не описываются в разделе описания процедур. Допускается использования процедур без параметров.
Параметры процедур бывают двух видов:
1) параметры – значения (входные параметры);
2) параметры – переменнные (выходные параметры).
Описание входных параметров процедуры в списке формальных параметров имеет также вид:
Список переменных1: тип1; список переменных2: тип2; и т.д.
Описание выходных параметров выглядит следующим образом:
VarСписок переменных1: тип1; Var список переменных2: тип2; и т.д.
Вызов процедуры в основной программе имеет следующий вид:
имя процедуры (список фактических параметров);
Фактические параметры перечисляются через запятую, без указания их типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, порядку из следования и типу данных. Имена соответствующих параметров могут быть одинаковыми или разными. Входными фактическими параметрами могут быть константы, переменные или выражения, выходными фактическими параметрами могут быть только переменные.
Пример:
Другой вид подпрограммы в языке Турбо-Паскаль – функция – оформляется аналогично процедуре и отличается от нее по структуре только заголовком, общий вид которого выглядит следующим образом:
Functionимя (список формальных параметров): тип;
Функции имеют несколько отличительных особенностей.
1. Функция имеет только один результат выполнения (но может иметь несколько входных параметров, выходных параметров у функции нет);
2. Результат обозначается именем функции. Поэтому в разделе операторов функции обязательно должен присутствовать оператор присваивания, в левой части которого стоит имя этой функции.
3. Вызов функции в основной программе осуществляется непосредственно в выражениях по ее имени с указанием фактических параметров.
Использование процедур и функций на примере вычисления площади выпуклого четырехугольника
Задание: вычислить площадь плоского четырехугольника, заданного длинами четырех сторон и диагонали.
Диагональ делит выпуклый четырехугольник на два треугольника, площадь каждого из которых можно вычислить по формуле Герона:
S=Sqrt(p(p-a)(p-b)(p-c)), где p=(a+b+c)/2;
Простейшее решение – дважды записать в программе вычисление площади треугольника, но этого повторения можно избежать при использовании подпрограмм. Запишем программу вычисления площади выпуклого четрырехугольника с помощью процедуры без параметров:
Program F1;
var AB,BC,CD,DA, AC,s1,s,a,b,c,p:real;
procedure TriangleSquare;
begin
p:=(a+b+c)/2;
s1:=Sqrt(p*(p-a)*(p-b)*(p-c));
end;
Begin
Read(AB,BC,CD,DA,AC);
a:=AB;b:=BC;c:=AC;
TriangleSquare;
s:=s1;
a:=DA;b:=AC;c:=CD;
TriangleSquare;
WriteLn(s+s1);
End.
В данной программе выполняется два обращения к процедуре TriangleSquare непосредственно перед каждым обращением идет группа операторов присваивания, задающих значения переменных a,d,c. Этого нагромождения операторов присваивания можно избежать, используя процедуру с параметрами.
Кроме того, в данной программе переменная p используется как вспомогательная переменная внутри процедуры и в основной программе не используется. Поэтому имеет смысл описать эту переменную внутри процедуры.
Запишем теперь эту же программу, но используя процедуру с параметрами.
Program F2;
var AB,BC,CD,DA,AC,s1,s:real;
procedure TriangleSquare(a,b,c:Real;Var s:Real);
var p:Real;
begin
p:=(a+b+c)/2;
s:=Sqrt(p*(p-a)*(p-b)*(p-c));
end;
Begin
Read(AB,BC,CD,DA,AC);
TriangleSquare(AB,BC,AC,s1);
TriangleSquare(DA,AC,CD,s);
WriteLn(s+s1);
End.
Не трудно заметить, что данная программа, записанная с помощью процедуры с параметрами, гораздо нагляднее, понятнее, компактнее, чем программа, записанная с использованием процедуры без параметров, и, тем более, без использования подпрограмм. Но в случае, когда имеется только один выходной параметр, гораздо удобнее использовать подпрограмму – функцию. Так при использовании функции вычисления площади треугольника методом Герона данная программа будет выглядеть следующим образом.