5.3. Стандартные и определенные пользователем подпрограммы. Процедуры пользователя

В языке Turbo Pascal подпрограммы реализованы посредством процедур и функций. Имея один и тот же смысл и аналогичную структуру, они различаются назначением и способом их использования. Все процедуры и функции подразделяются на две группы: встроенные и определенные пользователем.

Встроенные (стандартные) процедуры и функции являются частью языка и могут вызываться по имени без предварительного описания. Некоторые, наиболее часто используемые стандартные функции, типы их аргумента и результата были представлены в табл. 3.1. Их наличие существенно облегчает разработку прикладных программ. Однако в большинстве случаев некоторые специфичные для данной программы действия не находят прямых аналогов в библиотеках Turbo Pascal, и тогда программисту приходится разрабатывать свои нестандартные процедуры и функции (см. листинг 5.3).

Процедуры и функции пользователя пишутся самим программистом в соответствии с синтаксисом языка в разделе описаний процедур и функций (см. разд. 2.2.7). Их вызов для последующего выполнения записывается обычно в разделе операторов. Возможен и такой вариант, когда в процедуре или функции выполняется вызов другой процедуры или функции. Передача данных из главной программы в подпрограмму и возврат результата выполнения осуществляются с помощью параметров (см. разд. 5.5).

Процедура — это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени из по следующих частей программы для выполнения определенных действии. Процедура не может выступать как операнд в выражении.

Структура процедуры повторяет структуру программы, это "программа в миниатюре" — она также представлена заголовком и телом. В отличие от программы для процедур и функций наличие заголовка обязательно.

Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра:

procedure ИмяПроцедуры(ФормальныеПараметры);

Например, заголовок процедуры без формальных параметров (см. листинг 5.1):

procedure horline;

Процедура, использующая формальные параметры (см. листинг 5.2):

procedure horline(len:integer; s:char); { len,s — формальные параметры }

Имя процедуры должно быть уникально, т. е. его нельзя использовать повторно в программе для именования других процедур.

Тело процедуры по своей структуре аналогично обычной программе:

procedure ИмяПроцедуры(ФормальныеПараметры);
    { Описательная часть процедуры }
begin
    { Инструкции исполнительной части процедуры }
end;

Обратите внимание — в конце тела процедуры, как и программы, стоит end, однако после него ставится точка с запятой.

Для обращения к процедуре используется оператор вызова процедуры. Он состоит из имени процедуры и списка фактических параметров, отделенных друг от друга запятыми и заключенных в круглые скобки. Список параметров отсутствует, если процедуре не передается никаких значений.

Параметры обеспечивают механизм замены, который позволяет выполнять процедуру с различными начальными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимнооднозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров равны количеству и типу фактических параметров. Соответствующие друг другу параметры не обязательно должны одинаково обозначаться.

Если процедура возвращает в программу какие-то значения, соответствующие переменные должны быть описаны как параметры — переменные с использованием слова var (см. разд. 5.5).

При вызове процедуры работа главной программы приостанавливается и начинает выполняться вызванная процедура. Когда процедура выполнит свою задачу, программа продолжится с оператора, следующего за оператором вызова процедуры.

Описания меток, констант, типов и т. п. действительны только в пределах данной пользовательской процедуры. В теле процедуры можно использовать любые глобальные константы и переменные (см. разд. 5.6).

Для принудительного выхода из процедуры используется оператор завершения exit, который обеспечивает выход во внешний блок (обычно — основную программу).

Листинг 5.1 содержит программу с простейшей процедурой без параметров, которая выводит на экран горизонтальную линию и 3 раза вызывается в программе, выводящей таблицу перевода из сантиметров в дюймы.

Листинг 5.1. Программа перевода сантиметров в дюймы

var inch: integer; ( дюймы }
  sm: real; { сантиметры }
{ процедура для вывода горизонтальной линии }
procedure horline;
var i: integer;
begin
  for i:=1 to 30 do write('-');
  writeln;
end;
{ основная программа }
begin
  horline;
  writeln (' | дюймы | см | ') ;
  horline;
  { считаем и выводим строки таблицы }
  for inch:=1 to 10 do
    begin
      sm:=2.54*inch;
      writelnf (| ', inch: 13, ' | ', sm: 14 : 3, ' | ');
    end;
  horline;
end.

Результатом работы подпрограммы является изображение линии на экране монитора. Никакие числовые данные в подпрограмму не передаются и в основную программу не возвращаются.

Отметим еще одно преимущество использования процедур, которое сразу не бросается в глаза — если в нашем случае потребуется изменить размер линии или изобразить ее другим символом, то эти исправления делаются один раз в процедуре, а не три раза в программе.

Усовершенствуем процедуру вывода линии, введя в нее два параметра: длину выводимой строки и символ, которым рисуется линия (листинг 5.2).

Листинг 5.2. Программа, демонстрирующая вывод линий

procedure horline(len:integer; s:char);
( len — размер линии в символах, s — символ, которым рисуется линия }
var i: integer;
begin
  for i:=1 to len do write(s);
  writeln;
end;
{ основная программа выводит три совершенно разных линии }
begin
  horline(10,'-') ;
  horline(20,'*') ;
  horline(30,'#') ;
end.

Запишем процедуру, выполняющую возведение в целую неотрицательную степень любого числа (вспомним, что в языке Turbo Pascal нет подобной стандартной операции). С помощью данной процедуры вычислим, сколько байтов содержится в килобайте, мегабайте и гигабайте, используя известные соотношения: 1 Кбайт=210 байт, 1 Мбайт =220 байт, 1 Гбайт =230 байт (листинг 5.3).

Листинг 5.3. Программа возведения в целую неотрицательную степень

procedure degree(х: real; n: byte; var res: real);
{ процедура возведения числа x в целую неотрицательную степень n }
{ результатом является параметр-переменная res }
var i: integer;
begin
  res:=1;
  for i:=1 to n do res:=res*x;
end;
{ основная программа }
var kb,mb,gb: real;
begin
  degree(2,10,kb);
  degree(2,20,mb);
  degree(2,30,gb);
  writeln('l Kb = ',kb:4:0, ' byte');
  writeln('1 Mb = ',mb:7:0,' byte');
  writelnd('1 Gb = ',gb:10:0,'byte');
end.

Данную процедуру можно было бы оформить в виде функции, т. к. она возвращает только один результат (см. разд. 5.4).

В 1202 г. итальянский математик Леонард Пизанский, известный под именем Фибоначчи, предложил следующую задачу. Пара кроликов каждый месяц дает приплод — двух кроликов (самца и самку), от которых через два месяца уже получается новый приплод. Сколько пар кроликов будет через год, если в начале года мы имели одну пару только что родившихся кроликов? Обратим внимание на то, что числа, соответствующие количеству пар кроликов по месяцам, составляют последовательность 1, 1, 2, 3, 5, 8, 13, 21, 34, .... Каждый из членов этой последовательности, начиная с третьего, равен сумме двух предыдущих членов. Эта последовательность называется рядом Фибоначчи, а ее члены — числами Фибоначчи. Числа Фибоначчи имеют много интересных свойств. Ряд Фибоначчи определяют так: F0 = F1 =1; Fn = Fn-1 + Fn-2

Листинг 5.4 содержит программу с процедурой, которая вычисляет и выводит члены ряда Фибоначчи.

Листинг 5.4. Программа вычисления членов ряда Фибоначчи (вариант № 1)

procedure fibonfn: integer);
{ процедура вычисления и печати чисел Фибоначчи }
var fn,fn1,fn2,k: integer;
begin
  fn1:=1;
  fn:=0;
  for k:=1 to n do
    begin
      fn2:=fn1;
      fn1:=fn;
      fn:= fn1+fn2;
      writeln(fn);
   end;
end;
{ основная программа }
var n: integer;
begin
 write('Введите число членов ряда Фибоначчи: '); readln(n);
 fibon(n); { вызов процедуры }
end.

В связи с тем, что ряд Фибоначчи является быстрорастущим, его 24 член уже превышает верхнюю границу диапазона типа integer (см. табл. 2.1).

 предыдущая         меню        вверх         следующая

Hosted by uCoz