Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uchebnoe_posobie_Programirovanie.docx
Скачиваний:
5
Добавлен:
08.12.2018
Размер:
217.65 Кб
Скачать

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

6.1. Подпрограммы

Процедуры и функции аналогичны программам в миниатюре и имеют общее название – подпрограммы (п/п). Применение п/п дает возможность:

  • уменьшить число повторений одной и той же последовательности операторов;

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

Пример структурированный программы

Блок А

Блок А1

Блок А2

Блок В

Блок В1

Блок В2

Блок В21

Программа

Блок С

Блок В22

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

В программе описание процедур и функций должно располагаться в разделе объявлений программы. Каждая подпрограмма определяется один раз, но может быть использована многократно. Структура подпрограммы аналогична структуре полной программы на языке Т-П, но заканчивается END;.

Описать блок значит указать его заголовок и тело:

PROCEDURE A;

В заголовке указываются имя блока и формальные параметры, если таковые есть. Тело блока подобно телу любой программы.

6.2. Параметры. Глобальные и локальные описания

При введении в программу подпрограммы возникает разделение данных и их типов на глобальные и локальные.

Глобальными по отношению к данному блоку являются объекты верхнего уровня, описанные до появления данного блока.

Локальные объекты – объекты, существующие внутри данного блока. Объявлены либо в списке параметров (только переменные), либо в разделах CONST, VAR, TYPE, внутри подпрограммы.

Для программистов, использующих обращение к блоку, блок представляется как «черный ящик», в котором реализуется тот или иной алгоритм. В примере, рассмотренном нами, из основной программы можно обратиться к процедурам А, В, С, но нельзя вызвать А1, А2, В1, В2. Образно говоря, блок как бы окружен полупрозрачными стенками, снаружи не видно, что делается внутри, но попав в блок можно увидеть, что делается вне его, но только «сверху», а не «снизу». Так, из блока В21 можно обратиться к В2 , В1, В, а, к основной программе.

При совпадении глобальных и локальных имен сильнее оказывается локальное имя, и именно оно используется внутри подпрограммы. Существует неписанное правило: если блок содержит цикл FOR, то параметры должны быть описаны как локальные переменные. Это предотвратит неразбериху при циклическом вызове процедур.

6.3. Процедуры

Процедура состоит из заголовка и тела.

Заголовок: PROCEDURE (ИМЯ) [(список формальных параметров)]

(имя – имя процедуры (правильный идентификатор)

(список формальных параметров) - список формальных параметров (может отсутствовать)

Затем идут те же разделы, что и в основной программе. Завершается «;».

Пример. Процедура ввода N целых чисел.

Пусть в основной программе определен TYPE и VAR

TYPE

arr:=array[1…10]of integer;

VAR

m:arr;

k:integer;

Процедура может иметь вид:

{заголовок}

PROCEDURE INPINT (var mas :arr; n: integer);

Var

i:integer; (локальный параметр процедуры)

Begin

Writeln (‘Введите’, n:3,‘целых чисел’);

For i:=1 to n do

read (mas[i])

End;

Синтаксис вызова процедур прост: выполнение активизируется указанием ее имени и списком var или значений, подставляемых на место формальных параметров (фактические параметры):

<имя процедуры> (параметр 1, параметр 2,…….);

K:=40;

Inpint (m,k); или inpint (m,40);

Вызывается процедура input для ввода 40 целых чисел в массив М.

Параметры, описываемые в заголовке подпрограммы, являются по сути локальными переменными. Но, кроме того, они обеспечивают обмен значениями между вызывающими и вызываемыми программами. Описываемые в заголовке параметры называются формальными, а те которые подставляются на их место при вызове – фактическими, т.к. замещают все вхождения в подпрограмму своих формальных «двойников». Между формальными и фактическими параметрами должно быть полное соответствие:

- одинаковое количество;

- один и тот же порядок следования;

- тип фактических параметров должен совпадать с типом формальных параметров.

Пример. Программа подсчитывает количество точек (.) в первой вводимой с терминала строке, а во второй строке – количество букв «А».

Program A;

Const

Point=‘.’;

Var

S:=integer;

Procedure P (simb:char; var kol:integer);

Var

C:char;

begin

Kol:=0;

Writeln (‘Введите строку’);

Repeat

Read (c);

If c=simb then inc(kol);

Until eoln

end;

Begin

P(point,s);

Writeln (‘Количество точек=’,s:3);

P(‘A’,s);

Writeln (‘Количество букв «А»=’,s:3);

end.

Процедура имеет два формальных параметра:

  • simb - входной параметр (параметр-значение), определяет символ, который подсчитывается в строке;

  • kol – выходной параметр (параметр-переменная), через который передается в программу количество подсчитанных символов.

Таким образом мы столкнулись с двумя видами параметров:

  • параметр-переменная;

  • параметр-значение.

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

Рассмотрим внутренний механизм передачи параметров в подпрограмму.

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

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

Процедура Р может передавать результат своей работы через глобальную переменную S:

Procedure P(simb:char);

If c=simb then s:=s+1;

S:=0; P(point);

……………………………….

S:=0; P(‘A’);

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]