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.  Что необходимо для реализации рекурсии в программе?


 

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

60520. Історія комп’ютеризації освіти Голованівського району 817.5 KB
  У газеті Аспект була надрукована стаття у якій автор детально описує початок комп’ютеризації освіти Голованівського району. Дядьки чемно відмовляються від вечері і зникають так само несподівано як і з’явились...
60521. Архитектурный план дома 442.5 KB
  Сегодня мы поговорим про проектирование дома коттеджа и т. Рассмотрим какие рекомендации должен соблюдать дизайнер разрабатывая план частного дома а также план капитального ремонта жилых домов план каркасного дома архитектурный план...
60522. Демографический кризис – проблема нравственности 7.63 MB
  Учитель: Добрый день дорогие ребята Я приветствую вас на нашем классном часе. Раскроем тайны библейских и заповедей: а Почитай отца твоего и мать твою б Не прелюбодействуй...