28439

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

Лекция

Информатика, кибернетика и программирование

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

Русский

2013-08-20

51 KB

5 чел.

Тема 8. Процедуры и функции. Локализация имен. Описание подпрограммы. Параметры. Примеры использования подпрограмм.

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

Такое разбиение необходимо по двум причинам:

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

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

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

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

Процедуры.

Процедура состоит из заголовка и тела процедуры, называемого блоками. Блок процедуры имеет такую же структуру, что и основная программа, т.е. в блоке могут быть свои разделы LABEL, CONST, TYPE, VAR, разделы описания процедур и функций и выполняемая часть (от BEGIN до END).

Структура любой программной единицы (программы, процедуры или функции) должна быть такой:

<объявление программной единицы>

{раздел описаний}

BEGIN

{раздел исполняемых операторов}

END <символов конца программной единицы >

Заголовок процедуры имеет вид:

PROCEDURE <имя проц. > [(<сп.ф. п.>)];

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

Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовам. Для активизации процедуры (т.е. выполнения фрагмента программы, оформленного в виде процедуры) В нужном месте программы используется оператор вызова процедуры:

<имя процедуры> [(<факт. парам.>)];

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

Формальные и фактические параметры должны удовлетворять следующим требованиям:

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

соответствующие фактические и формальные параметры должны совпадать по типу и порядку следования.

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

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

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

параметр- константа.

Если параметры определены как параметры-переменные, перед ними записывается слово VAR , а если это параметры- константы - CONST. Например, PROCEDURE PROC1(X:REAL; VAR Y: REAL; CONST ST: STRING);

Если формальный параметр объявлен как параметр _ переменная, то при вызове процедуры ему должен соответствовать фактический параметр в виде переменной нужного типа; если формальный параметр объявлен как параметр – значение или параметр- константа, то при вызове ему может соответствовать произвольное выражение.

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

PROGRAM LAB4;

CONST N=5;

TYPE MATRIX= ARRAY [1.. N, 1..N] OF INTEGER;

VAR A, B, C, D: MATRIX;

I,J: INTEGER;

PROCEDURE MULT(R: MATRIX);

VAR I,J: INTEGER;

BEGIN

FOR I:=1 TO N DO

FOR G:=1 TO  DO

READ(R[I,J]);

END;

PROCEDURE MULT(X,Y: MATRIX; VAR Z: MATRIX);

VAR I,J,K,S: INTEGER;

BEGIN

FOR I:=1 TO N DO

FOR J:=1 TO  DO

BEGIN

S:=0;

FOR K:=1 TO N DO

S:=S+ X[I,K]*Y[K,J];

C[I,J]:=S;

END;

END;

BEGIN

VV(A);

VV(B);

VV(C);

VV(D);

MULT( A,B,A); MULT(A,C,A); MULT (A,D,A);

FOR I:=1 TO N DO

BEGIN

FOR J:=1 TO N DO

WRITE (A[I,J]:4);

WRITELN;

END;

END.

Функции

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

Заголовок функции имеет вид:

FUNCTION <имя функ.> [(<сп.ф.п.>)]: <тип >;

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

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

<тип >- тип возвращаемого функцией результата.

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

Описание подпрограмм.

Описание подпрограмм состоит из заголовка и тела подпрограммы.

Заголовок процедуры имеет вид :

PROCEDURE <имя проц.> [(<сп.ф.п>)];

Заголовок функции:

FUNCTION <имя функ.> [(<сп.ф.п.>)]: <тип >;

где <имя функ.>- имя процедуры (правильный идентификатор),

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

<тип >- тип возвращаемого функцией результата.

Сразу за заголовком подпрограммы  может следовать одна из стандартных директив ASSEMBLER, EXTERNAL, FAR, FORWARD, INLINE, INTERRUPT, NEAR. Эти директивы уточняют действия компилятора и распространяются на подпрограмму, за заголовком которой указаны стандартные директивы.

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

EXTERNAL- с помощью этой директивы объявляется внешняя подпрограмма.

FAR- компилятор, должен создавать код подпрограммы, рассчитанной на дальнюю модель вызова. Директива NEAR заставляет компилятор создать код, рассчитанный на ближнюю модель памяти. По умолчанию все подпрограммы, объявленные в интерфейсной части модуля, генерируются с расчетом на дальнюю модель вызова, а все остальные подпрограммы – на ближнюю модель. В соответствии с архитектурой микропроцессора ПК, в программах могут использоваться две модели памяти : ближняя и дальняя. Модель памяти определяет возможность процедуры из различных частей программы:  если используется ближняя модель, вызов возможен только в пределах 64 кбайт ( в пределах одного сегмента кода, который выделяется в основной программе и каждому используемому в ней модулю); при дальней вызов возможен из любого сегмента.

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

  1.  FORWARD- используется при опережающем описании для сообщения компилятору, что описание подпрограммы следует где-то по тексту программы (но в пределах текущего программного модуля).

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

INTERRUPT – используется при создании процедур обработки прерываний.

Рекурсия

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

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

PROGRAM OFACT;

{$$+} {}

VAR n: INTEGER;

FUNCTION FACT(n: INTEGER): REAL;

{}

begin{ FACT}

IF n<0 THEN WRITELN (‘n’)

ELSE IF n=0 THEN FACT:= 1

ELSE FACT:= n* FACT(n-1);

end{FACT};

{ _ _ _ _}

BEGIN {main}

REPEAT

READLN (n);

WRITELN(‘n!=’, FACT(n));

UNTIL EOF;

END.

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

1осн.[161-181]

5доп. [16-19], 10доп.[104-116], 11доп.[187-211], 12доп.[121-134]

Контрольные вопросы

1. Могут ли имена формальных и фактических параметров подпрограмм совпадать между собой?

  1.  Будет ли видима глобальная переменная внутри подпрограммы, если в этой подпрограмме  имеется локальная переменная с таким же именем?
  2.  Возможна ли передача управления внутрь процедуры (функции) посредством оператора перехода  goto и почему?
  3.  В чем состоит отличие описания процедуры и функции?
  4.  Что такое область действия идентификаторов?
  5.  Какие параметры называются формальными и какие - фактическими?
  6.  Каковы правила передачи параметров-значений и параметров-переменных?
  7.  Что необходимо для реализации рекурсии в программе?


 

А также другие работы, которые могут Вас заинтересовать

61978. Я – гражданин Республики Беларусь 21.94 KB
  Ход учебного занятия Сообщение темы и цели учебного занятия. Тема нашего сегодняшнего урока Я гражданин Республики Беларусь. Мы носим имя гражданин Республики Беларусь. Беседа Наша Родина Беларусь.
61979. British Traditions and Customs 22.04 KB
  British nation is considered to be the most conservative in Europe. It is not a secret that every nation and every country has its own customs and traditions. In Great Britain people attach greater importance...
61982. А. Гайдар «Тимур и его команда» 19.58 KB
  Цели: познакомить учащихся с жизнью и творчеством Гайдара его повестью Тимур и его команда продолжить работу над совершенствованием качеств полноценного навыка чтения и умения работать с текстом произведения.
61983. Совершенствование прыжка в длину с места 74.73 KB
  Воспитание волевых качеств целеустремлённости Место проведения: спортивный зал Оборудование: свисток скакалки Содержание Дозировка Организационно-методические указания Вводная часть Построение приветствие сообщение темы и задач урока...
61984. Наложение повязок на конечности 101.24 KB
  Применение теоретических знаний в практической деятельности умение накладывать повязки. В зависимости от цели накладывания повязок различают: защитные повязки защищающие раны от высыхания и механического раздражения...
61985. Сталинградская битва 21.13 KB
  Предполагалось сначала изморить противника оборонительными боями сорвать его летнее наступление и подготовить условия для последующего наступления Красной Армии. Положение войск Приморской армии с каждым днём становилось всё тяжелее.