-
Подпрограммы
В практике программирования часто складываются ситуации, когда одну и ту же группу операторов, реализующих определенную цель, требуется повторить без изменений в нескольких местах программы. Для избавления от нерациональной траты времени была предложена концепция подпрограммы.
Подпрограмма – именованная, логически законченная группа операторов языка, которую можно вызвать для выполнения любое количество раз из различных мест программы. В Паскаль существуют два вида подпрограмм: процедуры и функции.
Процедура – независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Структура процедуры повторяет структуру программы. Процедура не может выступать как операнд в выражении. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом. Например, Read(F) читает с клавиатуры некоторое значение и присваивает его переменной F.
Функция - аналогична процедуре, но имеются два отличия: функция передает в точку вызова скалярное значение; имя функции может входить в выражение как операнд. Например, Sqr(x) – возведет в квадрат значения целого или вещественного х и возвратит в точку вызова вычисленное значение квадрата числа х.
Все процедуры и функции языка Паскаль делятся на две группы: встроенные (стандартные), пользовательские.
Процедуры и функции пользователя
Задаются в описательной части программы. Вызываются в основной части (в разделе операторов).
При вызове подпрограммы (процедуры или функции), определенной программистом, работа главной программы на некоторое время приостанавливается и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из главной программы. По завершении выполнения подпрограмма-функция возвращает главной программе результат, а подпрограмма-процедура не возвращает явно результирующего значения.
Передача данных из главной программы в подпрограмму и возврат результата выполнения функции осуществляются с помощью параметров.
Параметром называется переменная, которой присваивается некоторое значение в рамках указанного применения. Различают формальные и фактические параметры.
Формальные параметры – параметры, определенные в заголовке подпрограммы.
Фактические параметры – выражения, задающие конкретные значения при обращении к подпрограмме. При обращении к подпрограмме ее формальные параметры замещаются фактическими, переданными из главной программы.
1. Описание процедуры.
Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Формальные параметры отделяются точкой с запятой (список однотипных параметров может быть перечислен через запятую). Например, procedure P1(a: real; b,c: real). Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичен программе.
Формат:
procedure <имя> (список формальных параметров);
Const ...;
Type ...;
Var...;
begin
<операторы>;
end;
Описания меток, констант, типов и т.д. действительны только в пределах данной процедуры. В теле процедуры можно использовать любые глобальные константы и переменные.
Формальные параметры нельзя описывать в разделе описаний процедуры.
Для обращения к процедуре необходимо использовать оператор вызова процедуры. Он имеет следующий формат:
<имя процедуры> (список фактических параметров);
Например: f(n, fn);
Фактические параметры в списке отделяются друг от друга запятой. Механизм применения формальных-фактических параметров обеспечивает замену формальных параметров фактическими, что позволяет выполнять процедуру с различными данными. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Пример. Подсчитать сумму десяти введенных целых положительных чисел. Если будет введено отрицательное число, то необходимо прервать выполнение программы.
program primer6;
var i,c,Sum:integer;
procedure St(M:string);
begin
writeln('Ошибка:',M);
halt(1);
end;
begin
c:=0;
Sum:=0;
while c<10 do
begin
c:=c+1;
write('введите ',c,'-e число: ');
readln(i);
if i<0 then St('введено отрицательное число');
Sum:=Sum+i;
end;
writeln('Сумма чисел равна ',Sum);
end.
Описание процедуры. В данной процедуре пользователя использована переменная М типа string, в которой хранится текст сообщения о характере ошибки, вызвавшей прерывание программы. Для прерывания выполнения программы используется стандартная процедура Halt.
Описание программы. В начале программы обнуляются значения количества введенных чисел с и их сумма Sum. Потом выполняется цикл, пока номер очередного вводимого числа меньше 10. Сначала устанавливается номер очередного числа, затем на экран выводится приглашение «Введите 1-е (2-е и т.п.) число», считывается значение числа с клавиатуры в переменную i. Затем проверяется условие I<0.
Если условие выполняется, то вызывается процедура St, которой передается фактический параметр-значение «введено отрицательное число». Это значение присваивается формальному параметру М процедуры St. процедура выводит на экран сообщение «Ошибка: введено отрицательное число», после чего вызывает стандартную процедуру Halt, которая прерывает выполнения программы.
Если условие I<0 не выполняется, то значение суммы увеличивается на значение введенного числа I, и управление передается в заголовок цикла для проверки условия. После окончания цикла на экран выводится значение суммы.
2. Описание функции.
Описание функции состоит из заголовка функции и ее тела. Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, список формальных параметров с указанием их типа и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе.
Формат:
function <имя> (список формальных параметров): <тип результата>;
Const ...;
Type ...;
Var...;
begin
<операторы>;
end;
В теле функции всегда должен быть хотя бы один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего присваивания.
Обращение к функции осуществляется по имени с указанием списка фактических параметров. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Формат:
<имя функции> (список фактических параметров);
Пример.
program primer6;
var x,y:real;
function tan(c:real):real;
begin
tan:=sin(c)/cos(c);
end;
begin
read(x,y);
writeln('tg(x)= ',tan(x));
writeln('tg(y)= ',tan(y));
end.