Тема. Подпрограммы
Очень часто в процессе выполнения программы требуется многократное выполнение какой-либо ее части. Логичнее всего эту часть программы выделить, обозначить ее имя, задать ей необходимые параметры и вызвать эту часть по ее имени.
Для этого используются процедуры и функции. Все процедуры и функции подразделяются на две группы:
- встроенные (стандартные)
- и пользовательские.
Стандартные подпрограммы входят в состав языка и вызываются для выполнения по строго фиксированному имени. Использовать имена встроенных процедур и функций для именования собственных нельзя.
Встроенные процедуры и функции расположены в специальных библиотечных модулях, которые имеют системные имена (system - основной модуль, crt - средства управления дисплеем и клавиатурой, dos - средства реализации различных функций DOS, graph - пакет графических средств...). В свою очередь, подключаемые модули подключаются с помощью зарезервированного слова Uses.
1. Процедуры пользователя
Процедура - независимая поименованная часть программы, которую можно вызвать по ее имени для выполнения определенных действий. Структура процедуры такая же, как и структура программы.
Описание процедуры включает заголовок (имя) и тело процедуры.
- Заголовок процедуры состоит из зарезервированного слова Procedure, имени процедуры и списка формальных параметров.
- Список формальных параметров необязателен и может отсутствовать, если же он есть, то в нем должны быть перечислены имена формальных параметров и их типы, например:
Procedure sb (a: real, b: integer, c: char); - Имя процедуры создается по тем же правилам, что и имена переменных. Все, что идет после имени процедуры, называют телом процедуры.
Синтаксис описания процедуры имеет следующий вид:
procedure <имя>[(список формальных параметров)]
const...;
var...;
begin
<операторы>;
end.
Обмен аргументами и результатами между основной программой и процедурой производится :
- через формальные и фактические параметры,
- существует еще один механизм обмена - через глобальные переменные.
Если подпрограмма описана с формальными параметрами, то обращение к ней производится оператором подпрограммы с фактическими параметрами.
Правила соответствия между формальными параметрами и фактическими: соответствие по количеству, по последовательности, по типам.
Пример 12. Вывести на экран все четные числа до указанного. Выполните программу в режиме пошагового выполнения, используйте функциональную клавишу F7.
program pr12;
var n,i:word;
procedure pr(x:word);// подпрограмма определения четности введенного с клавиатуры числа, х – формальный параметр процедуры
begin
if x mod 2 =0 then write(' ',x);
end;
BEGIN
write('введите число ');
read(n);
for i:=1 to n do pr(i); // вызов процедуры, i – фактический параметр
readln;
readln;
END.
2. Пользовательские функции.
Ранее мы сталкивались со стандартными функциями: sqr(x). Возможно создавать собственные функции.
- Функция очень похожа на процедуру. В некоторых языках нет понятия процедуры. Ее заменяет функция как общая подпрограмма.
- Функция отличается от процедуры тем, что результат ее работы возвращается в виде значения этой функции, и, следовательно, вызов функции может использоваться наряду с операндами и выражениями.
Function <имя> [(список формальных параметров)]: <тип>;
Const …;
Var …;
Begin
<Операторы>;
End.
Пример 13. Составить программу вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя подпрограмму вычисления площади круга.
program pr13;
var r1,r2:integer;
function p(r:integer):real; // r – формальный параметр функции
var p1:real;
const pi=3.14;
begin
p1:=pi*sqr(r);
p:=p1;
end;
BEGIN
write('r1 - ? ');readln(r1);
write('r2 - ? ');readln(r2);
writeln(abs(p(r1)-p(r2))); //вызов функции и вычисление значений функции за фактическими
END.
3. Локальные и глобальные переменные.
Деление переменных на локальные и глобальные является способом повысить надежность больших программ и понизить вероятность запутаться при их написании. Областью действия описания любого программного объекта (переменной, типа, константы...) является тот блок, в котором расположено это описание. Если в данный блок вложен другой (подпрограмма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока. Описания же, стоящие во внешнем блоке, называют глобальными.
Языки, в которых предусмотрены механизмы структурирования программ посредством подпрограммы, называются процедурно- ориентированными.
Пример 14. По координатам вершин треугольника вычислить его периметр, используя подпрограмму вычисления длины отрезка, соединяющего две точки
program pr14;
var x1,x2,x3,y1,y2,y3:integer;
p,a,b,c:real;
function dlina(a1,b1,a2,b2:integer):real; //пользовательская функция определения длины отрезка, где a1,b1,a2,b2- формальные параметры
var p1:real;
begin
p1:=sqrt(sqr(a1-a2)+sqr(b1-b2));
dlina:=p1;
end;
BEGIN
write('x1, y1 - ? ');readln(x1 , y1);
write('x2, y2 - ? ');readln(x2, y2);
write('x3, y3 - ? ');readln(x3, y3);
a:=dlina(x1,y1,x2,y2); //вызов функции, вычисление значения функции по фактическим параметрам программы, передача результата вычисления функции фактическим параметрам программы
b:=dlina(x1,y1,x3,y3);
c:=dlina(x3,y3,x2,y2);
p:= a+b+c;
writeln('p = ',p);
END