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


 

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

29104. Общая собственность и ее виды 27.5 KB
  В зависимости от количества субъектов которым определенное имущество принадлежит на праве собственности выделяю два вида собственности: односубъектную право собственности на имущество принадлежит какомуто одному лицу будь то гражданин юридическое лицо государство или муниципальное образование; многосубъектную общую имущество находится в собственности двух или более лиц сособственников которые сообща осуществляют правомочия собственника. Отличительными признаками права общей собственности являются: 1 общее имущество; 2...
29105. Общая совместная собственность 26.5 KB
  Общая совместная собственность Доля участника совместной собственности в общем имуществе заранее не определена. Она устанавливается при разделе между участниками совместной собственности а также при выделе доли одного из них. Особенности: Доли не выявлены но предполагаются равными Владение пользование и распоряжение осуществляется при согласии в случае спора в суд Режим общей совместной собственности всеми проживающими в жилом помещении вне зависимости от родства и свойства. Виды совместной собственности: общая собственность супругов...
29106. Долевая собственность. Преимущественное право покупки доли 35.5 KB
  Преимущественное право покупки доли. Доли в праве долевой собственности могут быть: Равными Неравными Размер доли может быть изменен при осуществление неотделимых улучшений Долевая собственность может возникать: закону договору в порядке наследования в силу приобретательной давности. Особенности содержания: владение и пользование по соглашению участников по решению суда в случае спора распоряжение по соглашению участников при отсутствие согласия с обязательным учетом на право преимущественной покупки При продаже доли...
29108. Виндикационный иск 29.5 KB
  При этом субъектом права на виндикацию является собственник законный владелец который должен доказать свое право на истребуемое имущество. Имущество у добросовестного приобретателя можно истребовать: в случае если такое имущество было им получено безвозмездно дарение наследование и т. При этом такое изъятие не несет имущественных убытков добросовестному приобретателю но способствует восстановлению нарушенного права собственности; в случае возмездного приобретения имущества добросовестным приобретателем у лица которое не имело права...
29109. Негаторный иск 21 KB
  Субъектом негаторного иска является собственник или владелец сохраняющий вещь в своем владении но испытывающий препятствия в ее использовании. Объект требований по негаторному иску составляет устранение длящегося правонарушения противоправного состояния сохраняющегося к моменту предъявления иска. Поэтому к подобного рода искам не применяется срок исковой давности требование можно предъявить в любой момент пока сохраняется правонарушение.
29110. Классификация и сущность способов защиты гражданских прав 28.5 KB
  В зависимости от характера посягательства на права собственника и содержания предоставляемой защиты можно выделить обязательственноправовые вещноправовые иные способы защиты. Обязательноправовые способы защиты права собственности основаны на охране имущественных интересов сторон в гражданской сделке а также лиц которые понесли ущерб в результате внедоговорного причинения вреда их имуществу. Вещноправовые способы защиты права собственности направлены на устранение препятствий к осуществлению права собственности. Негаторный иск это...
29111. Понятие и виды гражданско-правовой ответственности (особенности, функции, гражданско-правовые санкции, классификация, основания и условия ответственности) 37.5 KB
  Понятие и виды гражданскоправовой ответственности особенности функции гражданскоправовые санкции классификация основания и условия ответственности. Гражданская ответственность вид юридической ответственности; установленные нормами гражданского права юридические последствия неисполнения или ненадлежащего исполнения лицом предусмотренных гражданским правом обязанностей что связано с нарушением субъективных гражданских прав другого лица. Классификация: от основания возникновения ответственности: договорную ответственность в случаях...