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


 

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

47263. Процедура построения полного дерева поиска и ее особенности 20.87 KB
  Процедура построения полного дерева поиска и ее особенности. Бинарное дерево-это конечное множество элементов, которое либо пусто, либо содержит один элемент, называемый корнем дерева, а остальные элементы множества делятся на два непересекающихся подмножества, каждое из которых само является бинарным деревом
47264. Электроснабжение нового микрорайона города с реконструкцией существующей электрической сети 6.09 MB
  Значения расчетных электрических нагрузок жилых домов зависит от количества квартир, типа энергоносителя для приготовления пищи и количества и номинальной мощности двигателей лифтовых установок.
47265. Электроснабжение жилого района города 1.21 MB
  Проверка выбранных сечений жил кабелей 380 В по допустимым потерям напряжения. Проверка кабелей 10 кВ по потерям напряжения. КАЧЕСТВО НАПРЯЖЕНИЯ НА ЭЛЕКТРОПРИЕМНИКАХ ЖИЛЫХ И ОБЩЕСТВЕННЫХ ЗДАНИЙ. Оценка обеспечение качества напряжения по его отклонениям от номинального.
47268. Разработка модуля добавления и редактирования алгоритмов в системе тестирования учащихся на понимание алгоритмов «СТУПА» 2.81 MB
  Учебный процесс с использованием компьютерных технологий может быть представлен как моделирование учебной деятельности при которой компьютер выполняет ряд функций преподавателя в частности организацию диалога в виде сценария алгоритма управления учебной и познавательной деятельностью обучаемого. Технический аспект связан в первую очередь с проблемой реализации планируемого контроля знаний с выбором подходящего алгоритма для оценки контрольных работ. К техническим аспектам относятся: формирование набора контрольных заданий на основе...
47270. Автоматизация рабочего места специалиста отдела контроля выбросов загрязняющих веществ в атмосферу на предприятии (на примере ЗАО «Каучук» г. Стерлитамак) 3.53 MB
  Основы проектирования базы данных. Проектирование баз данных. Структура всего отчета на основе исходных данных. Для оперативного управления информацией необходимо создание базы данных позволяющей вести точный полный учет заказчиков исполнителей сырья и материалов объема выполненных работ.
47271. Разработка системы электроснабжения новой застройки района крупного города от сети 110 кВ 3.06 MB
  Основные показатели системы электроснабжения города определяются местными условиями: размерами города, наличием источников питания, характеристиками потребителей и т.д. Для принятия той или иной системы построения электрической сети необходимо учитывать мощность и число потребителей,