Turbo Pascal. Процедуры и функции

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

Определение

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

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

к содержанию ↑

Процедуры и функции.

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

Процедуры

Для использования процедуры в программе необходимы:

  • описание процедуры;
  • вызов процедуры.

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

Вызов процедуры приводит к выполнению операторов, составляющих тело процедуры.

Описание процедуры

Процедура в Турбо Паскале имеет структуру, подобную структуре программы.

Структура описания процедуры имеет следующий вид:

 Procedure <имя процедуры> (параметры);  заголовок процедуры;
 Label   объявление меток;  
 Const   объявление констант;  
 Type   объявление типов;  
 Var   объявление переменных;  
 procedure   описание процедур и функций, входящих
в данную процедуру (внутренние процедуры и функции);        
 function  
 Begin      
 Тело процедуры  операторы процедуры;  
 End;  точка с запятой «;» ставится всегда

 Таким образом, процедура состоит из:

  • заголовка;
  • раздела описаний;
  • раздела операторов.

Заголовок процедуры в отличие от заголовка программы не может быть опущен.

Формат заголовка

 Procedure <имя> (<список формальных параметров>); 

где  Procedure – зарезервированное слово;

имя – имя процедуры, определяемое в соответствии с общими правилами построения идентификаторов;
 <список формальных параметров> – перечень идентификаторов для обозначения исходных данных и результатов работы процедуры с указанием их типа.

Параметры в списке заголовка процедуры отделяются друг от друга точкой с запятой «;». Если параметры являются однотипными, их можно объединить и записать через запятую. Например:

 Procedure SUMMA(a,b:real;i,n:integer); 

Здесь SUMMA имя процедуры, a,b,i,n формальные параметры процедуры.

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

Раздел операторов ограничен операторными скобками BEGIN и END. При описании процедуры после END всегда ставится точка с запятой «;».

Вызов процедуры

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

 <имя процедуры> (<список фактических параметров>); 

где <имя процедуры> – имя процедуры, к которой происходит обращение;

 <список фактических параметров> – перечень конкретных значений (выражений) и имен, подставляемых на место формальных параметров процедуры при ее выполнении.

При описании подпрограмм и вызова их используются понятия формальных и фактических параметров.

Параметры, указываемые в заголовке процедуры при ее описании, называются формальными параметрами. Параметры, указываемые при вызове процедуры, называются фактическими параметрами.

Формальные параметры – это параметры, определяющие тип и место подстановки реальных объектов при вызове процедуры.

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

ЗАДАЧА 1. Ввести с клавиатуры 15 вещественных чисел в массив и найти сумму этих чисел с помощью процедуры.

program a21;Const n =15;Type mas=array[1..n] of real;Var a:Mas; i:integer;{——————описание процедуры —————-}procedure summa(b:mas;t:integer);{b-массив, t-количество чисел – формальные параметры, которые будут заменены на фактические параметры при вызове процедуры summa}var{———объявление внутренних переменных————}i:integer; {параметр цикла}s:real; {сумма чисел}begin s:=0; for i:=1 to t do s:=s+b[i]; writeln; writeln(‘Сумма равна:’, s:8:2);end; {конец процедуры}{———————-программа———————}begin writeln(‘Введите ’, n:4,’ чисел’); for i:=1 to n do begin write(‘a[‘,i,’]=’); readln(a[i]); end; summa(a,n); {вызов процедуры summa, сумма n чисел} summa(a,10); {вызов процедуры summa, сумма 10 чисел}end.

ЗАДАЧА 2. Найти наибольший элемент массива и определить его номер. Количество элементов массива и их значения ввести с клавиатуры. Оформить ввод данных, поиск наибольшего элемент массива и определение его номера с помощью процедур.

program a22;Const n =100; {допустимое количество чисел}Typemas=array[1..n] of real;Var a:mas; m:integer; {количество вводимых чисел}{—————процедура ввода массива—————}Procedure vvod_mas(b:mas;vart:integer);var i:integer;begin write(‘Введите количество чисел: ’); readln(t); writeln(‘Введите ’, t:4,’ чисел’); for i:=1 to t do begin write(‘b[‘,i,’]=’); readln(b[i]); {ввод элементов массива} end;end; {конец процедуры}{——процедура поиска максимального элемента——-}Procedure max_el_array(b:mas; t:integer);{b — массив, t- количество чисел}var i:integer; {параметр цикла} m:real; {максимальный элемент массива} k:integer; {его порядковый номер}begin m:=b[1]; k:=1; {присваиваем начальное значение} for i:=2 to t do if b[i]>m then begin m:=b[i]; k:=i; end; writeln; writeln(‘Номер наибольшего элемента:’,k:3); writeln(‘Его значение:’,m:8:2);end; {процедуры}{———————программа———————-}begin vvod_mas(a,m); max_el_array(a,m);end.

Спецификация процедуры.

Спецификация процедуры описывает действия при вызове процедуры и имеет следующий синтаксис:

спецификация процедуры::=procedure имя процедуры[(список параметров)] is
       {объявление в подпрограмме}
       begin
       {последовательный оператор}
       end [procedure][имя процедуры];

список параметров::=(элемент списка {; элемент списка})
       элемент списка::=[constant | variable | signal ]

       идентификатор{,идентификатор}: [in | out | inout] тип параметра
       [ := статическое выражение]

Здесь имя процедуры — идентификатор процедуры. В списке параметров указывается информация о формальных параметрах процедуры. Вместо формальных параметров подставляются фактические параметры во время вызова процедуры. В каждом из элементов списка параметров может объявляться какой это параметр (константа, переменная или сигнал) направление передачи параметра (in, out или inout) его тип или подтип и его значение по умолчанию, равное статическому выражению.

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

Объявленными в процессе могут быть: объявление и тело другой процедуры или функции, объявление типа и подтипа, объявление константы, переменной, файла, псевдонима, объявление и спецификация атрибута, объявление группы, описание use.

Рассмотрим пример программирования и использования процедуры в процессе для сортировки трех целых чисел.

process(a1,a2,a3) varіable b1,b2,b3:іnteger; procedure sort2(varіable x1,x2:іnout іnteger) іs varіable t:іnteger; begіn іf x1>x2 then return; else t:=x1; x1:=x2; x2:=t; end іf; end procedure; begіn b1:=a1; b2:=a2; b3:=a3; sort2(b2,b3); sort2(b1,b2); sort2(b2,b3); c1

Здесь процедура sort2 выполняет сортировку двух переменных х1, х2, которые являются входными — выходными формальными параметрами процедуры. Вызов процедуры выполняется с позиционным связыванием.

Оператор return досрочно прерывает исполнение процедуры. Последовательный оператор return -оператор возврата из подпрограммы — немедленно прерывает выполнение процедуры или вызова функции и возвращает управление в программу, вызвавшую процедуру.

Сравнение

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

Заголовок функции содержит слово “function”, идентификатор (собственное имя функции), вариативно список параметров и обязательно — тип результата. В теле функции обязательно прописывается оператор, присваивающий значение имени функции, которое она вернет в качестве результата. Заголовок процедуры содержит слово “procedure”, идентификатор (имя процедуры) и вариативно список параметров. Вызов функции осуществляется в составе выражений там, где эти выражения применяются, вызов процедуры требует отдельного оператора. Вызов процедуры осуществляется только по имени, имя функции же связано с ее значением. На схемах алгоритмов вызов функции изображается в блоке вывода или в блоке процесса, вызов процедуры — в специальном блоке “предопределенный процесс”.

к содержанию ↑

Основные отличия

  • Функция должна возвращать значение, но в хранимых процедурах это необязательно: процедура может возвращать значения 0 или n.
  • Функции могут иметь только входные параметры для него, тогда как процедуры могут иметь параметры ввода/вывода.
  • Для функции обязательно принимать один входной параметр, но хранимая процедура может принимать от 0 до n входных параметров.
  • Функции можно вызывать из процедуры, тогда как процедуры не могут быть вызваны из функции.

Возврат из процедуры или функции.

Оператор возврата из подпрограммы — последовательный оператор return — немедленно прерывает выполнение процедуры или вызова функции и возвращает управление в программу, вызвавшую процедуру.

Перезагрузка процедур и функций.

В языке VHDL допускается определять несколько процедур и функций с одинаковыми названиями. При вызове функции или процедуры из числа функций или процедур с одинаковым названием выбирается такая, которая подходит по типам и числу входных и выходных параметров. Такая функция перезагружает (overloads) остальные функции. Перезагрузка процедур и функций удобна при вычислениях с различными типами. Например, над типами integer, real, подтипами signed, unsigned определены одни и те же арифметические функции, но имеющие различное сочетание типов аргументов и результатов.

Примером перезагрузки служит следующая функция, которая не входит ни в один стандартный пакет:

functіon «and»(x1,x2:bіt) return boolean іs begіn return (x1 and x2) =’1′;end;

Если эта функция объявлена, то теперь транслятор не выдаст сообщения об ошибке при выполнении оператора if, вызывающего эту функцию:

varіable a,b,c: bіt;…іf (a and b and c) then…end іf;

так как выражение в скобках будет иметь правильный тип boolean.

Анатолий Сергиенко
E-mail: aser@comsys.kpi.ua

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: