Процедуры и функции
Процедуры и функции предназначены для решения отдельных подзадач, по своей структуре подобны обычным программам и имеют общее название подпрограммы. В программе описания процедур и функций располагается между разделами переменных и операторов. Каждая процедура или функция определяется только один раз, но может использоваться многократно.
Оператор процедуры
Описание каждой процедуры начинается с заголовка, в который задается имя процедуры и список формальных параметров с указанием их типов. С помощью параметров осуществляется передача исходных данных в процедуру, а также передача результатов работы обратно в вызывающую ее программу.
Формат заголовка процедуры:
Procedure имя процедуры(список формальных параметров).
Перед списком формальных параметров должно стоять зарезервированное слово var.
Вызов и выполнение процедуры осуществляется следующим образом:
Имя процедуры (список фактических параметров).
Между формальными и фактическими параметрами должно быть полное соответствие: количество, тип фактического параметра должен совпадать с типом формального параметра.
При вызове процедуры сначала передается параметры, при этом параметры значения передаются по значению, а параметры переменные по ссылке.
Работа процедуры: присваивание значений параметру переменной внутри процедуры одновременно выполняется и для соответствующего аргумента - фактического параметра. Это связано с тем, что параметр переменная содержит не само передаваемое значение, а его адрес, по которому оно располагается в оперативной памяти. Имея в своем распоряжении адрес, процедура может произвольно изменять находящиеся по этому адресу данные.
Пример: Сравнить площади треугольников. Площадь найти в процедуре.
program proc;
var a,b,c:integer;s1,s2,u:real;
procedure tr(x,y,z:integer;var s:real);
begin
read(x,y,z);
s:=sqrt((x+y+z)/2*(9x+y+z)/2-x)*((x+y+z)/2-y)*((x+y+z)/2-z));
end;
begin
tr(a,b,c,s1);
writeln(‘площадь 1 тр’,s1:5:2);
u:=s1;
tr(a,b,c,s2);
writeln(‘площадь 2 тр’,s2:5:2);
u:=s2;
if s1>s2 then
writeln(‘пл 1 тр >’)
else writeln(‘пл 2 тр >’);
end.
Пример 2. Описать процедуру diskrimenant(A, B, C) целого типа, определяющую количество корней квадратного уравнения A∙x2 + B∙x + C = 0 (A, B, C — вещественные параметры, А 0). С ее помощью найти количество корней для каждого из трех квадратных уравнений. Количество корней определять по значению дискриминанта:D = B2 −4∙A∙C.
program proz;
var a1,b1,c1,s,x1,x2:real;
procedure discrimenant(a,b,c:real;var d:real);
begin
d:=sqr(b)-4*a*c;
writeln('d=',s);
if s<0 then writeln('noy')else
if s=0 then begin x1:=-b/(2*a); writeln('x=',x1); end
else begin
x1:=(-b-sqrt(s))/(2*a);
x1:=(-b+sqrt(s))/(2*a);
writeln('x1=',x1,' x2=',x2)
end;
end;
begin
writeln('vvod a,b,c');
readln(a1,b1,c1);
discrimenant(a1,b1,c1,s);
end.
Ответ
d=-3
noy
vvod a,b,c
d=0
x=-1
vvod a,b,c
d=1
x1=-1 x2=0
vvod a,b,c
d=5
x1=-0.381966011250105 x2=0
Функции
Работа функции подобна работе процедуры, но результатом работы функции является одно значение.
Формат:
Function имя функции(список формальных параметров):тип результата.
Среди входящих в функцию операторов должен обязательно присутствовать хотя бы один оператор присваивания, в левой части которого стоит имя стандартной переменной result, которая трактуется как результат. Этот оператор и определяет значение, вырабатываемое функцией.
Вызов функции: