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


 

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

59292. КОЗАЦЬКІ ЗАБАВИ 59 KB
  Чи любите діти ви подорожувати Відповіді дітей. Хто такі козаки Діти. Що ви знаєте про Січ Діти. Правда діти рабства каламутну ніч Переборювала Січ.
59293. ВЕСНА 57.5 KB
  В народі про мене кажуть: Березень - з водою, квітень - з травою, а травень - з квітами. Які чудові мої квіти! Які весняні квіти ви знаєте? Учні: 1.Весна-чарівниця...
59294. ПОДОРОЖ ПО СТОРІНКАХ УЛЮБЛЕНИХ КАЗОК 73.5 KB
  Дорогі діти я знаю що ви дуже любите читати і слухати казки. Поміркуйте поспішіть Як же звуть його скажіть Діти відгадують казку Золотий ключик О. Добрий день шановні діти Дуже радий бачить вас Хочу з вами подружитись Тож у подорож зібравсь.
59295. Свято 8 Березня 44 KB
  Виходить хлопчик на лісову галявину і шукає весняні квіточки. Хлопчик. Хлопчик знайшовши Зайчика Привіт Зайчику біленький Чом ти плачеш чом сумненький Зайчик витираючи слізки.
59296. ЩО ТАКЕ ПРИРОДА 117 KB
  Виховувати бережливе ставлення до рослин і тварин потребу у збереженні та збагаченні природних багатств. Роздавальні картки звірів птахів риб індивідуальні картки зашифровки щоденники спостережень підручники учнівські малюнки...
59297. Проведення народних ігор в початковій школі 51.5 KB
  За ким була хустина той ловить утікаючого що повинен стати на місце доганяю чого. Місце проведення: довільне. Якщо ходієві не вдається зайняти місце він бере найближчого гравця за руку залучає інших і веде за собою цілий ряд за коло.
59299. Свято здоровя в літньому таборі 49.5 KB
  Зараз ми спробуємо поставити виставу €œПригоди Катрусі в країні Невмивайній Катруся і Бруднуля разом ти хто Бруднуля: Я Бруднуля Бруднулькун Знаменитий неуважний З вулиці Вантажної. Тут гарно живеться Катруся: А я сама не знаю як сюди потрапила.
59300. Гра-подорож у країну чистоти у порядку 31.5 KB
  Діти не чистять своє взуття не слідкують за одягом не вміють користуватися носовою хустиночкою. Хочу я напитись чаю Але що це Сам не знаю Самовар мій повний вщерть Утікає напереберть Що зробилось Діти чому в бруднулі всі речі повтікали...