78207

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

Лекция

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

Как отмечалось ранее, процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именем. Упоминание этого имени в тексте программы называется вызовом процедуры (функции). Отличие функции от процедуры заключается в том

Русский

2015-02-07

98 KB

1 чел.

екция: Процедуры и функции. Заголовок. Вызов. Собенности применения     Страница 6 из 6

Оглавление

[1] Оглавление

[2] Процедуры и функции

[2.1] Локализация имен

[2.2] Описание подпрограммы-процедуры

[2.3] Описание подпрограммы-функции

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

Комбинированный урок №9

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

Цель: изучить структуру подпрограмм (локальных блоков), получить знания по созданию и применению в основной программе процедур и функций.

Процедуры и функции

Как отмечалось ранее, процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и снабженные именем. Упоминание этого имени в тексте программы называется вызовом процедуры (функции). Отличие функции от процедуры заключается в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое единственное значение или указатель, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами. Далее будем называть процедуру или функцию общим именем «подпрограмма». Подпрограммой называется именованная логически законченная группа операторов, которую можно многократно вызвать для выполнения по имени из различных мест программы. Для организации подпрограмм используются процедуры и функции.

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

Локализация имен 

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

Описать подпрограмму - это значит указать ее заголовок и тело. В заголовке объявляются имя подпрограммы и формальные параметры, если они есть. Для функции, кроме того, указывается тип возвращаемого ею результата. За заголовком следует тело подпрограммы, которое, подобно программе, состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания подпрограмм низшего уровня, в тех - описания других подпрограмм и т.д.

 Рис. 1. Пример структуры программы

Или:

Program ...; 

Procedure А

Procedure A1;

.......

begin

.......

end {A1}; 

Procedure A2;

.......

begin

end {A2}; 

begin {A}

.......

end {A};

Procedure В

Procedure B1;

.......

begin {B};

end

Procedure B2

Procedure B21;

.......

и т.д.

Подпрограмма любого уровня имеет обычно множество имен констант, переменных, типов и вложенных в нее подпрограмм низшего уровня. Считается, что все имена, описанные внутри подпрограммы, как бы «невидимы» снаружи подпрограммы. Например, в рассмотренном выше примере из основной программы можно обратиться к процедурам А и В, но нельзя вызвать ни одну из вложенных в них процедур А1, А2, В1 и т.д.

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

При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Так, например, из подпрограммы В21 мы можем вызвать подпрограмму А, использовать имена, объявленные в основной программе, в подпрограммах В и В2, и даже обратиться к ним. Любая подпрограмма может, наконец, вызвать саму себя - такой способ вызова называется рекурсией.

Пусть имеем такое описание:

Program ..;

var V1 : ... ; 

Procedure A

var V2 :...;

.......

end {A}; 

Procedure B

var V3 :...;

Procedure Bl

var V4 :...;

Procedure В11

var V5;

.......

Из процедуры В11 доступны все пять переменных V1,...,V5, из процедуры В1 доступны переменные V1,..., V4, из центральной программы - только V1.

При взаимодействии подпрограмм одного уровня иерархии вступает в силу основное правило Турбо Паскаля: любая подпрограмма перед ее использованием должна быть описана. Поэтому из подпрограммы В можно вызвать подпрограмму А, но из А вызвать В невозможно (точнее, такая возможность появляется только с использованием опережающего описания). Подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной подпрограммы. Эти объекты называются глобальными по отношению к подпрограмме.

В отличие от стандартного Паскаля в Турбо Паскале допускается произвольная последовательность описания констант, переменных, типов, меток и подпрограмм. Например, раздел VAR описания переменных может появляться в пределах раздела описаний одной и той же подпрограммы много раз и перемежаться с объявлениями других объектов и подпрограмм. Для Турбо Паскаля совершенно безразличен порядок следования и количество разделов VAR, CONST, TYPE, LABEL, но при определении о6ласти действия этих описаний следует помнить, что имена, описанные ниже по тексту программы, недоступны из ранее описанных подпрограмм, например: 

var V1 : ...; 

Procedure S

var V2 : ...;

end {S}; 

var V3 :...;

....... 

Из процедуры S можно обратиться к переменным V1 и V2, но нельзя использовать V3, так как описание V3 следует в программе за описанием процедуры S.

Имена, локализованные в подпрограмме, могут совпадать с ранее объявленными глобальными именами. В этом случае считается, что локальное имя «закрывает» глобальное и делает его недоступным, например: 

var i : Integer; 

Procedure P

var i : Integer

begin writeln(i) 

end {P}; 

begin i := 1; 

P;

end.

Что напечатает эта программа? Все, что угодно: значение внутренней переменной I при входе в процедуру Р не определено, хотя одноименная глобальная переменная имеет значение 1. Локальная переменная «закроет» глобальную и на экран будет выведено произвольное значение, содержащееся в неинициированной внутренней переменной. Если убрать описание

var

i : Integer;

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

Описание подпрограммы-процедуры

Описание процедуры имеет вид:

Procedure имя (формальные параметры);

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

Begin

раздел операторов

End;

и помещается в разделе описаний основной программы (глобальном блоке).

Здесь имя - имя процедуры. Раздел описаний, как и в основной программе, включает разделы Label, Const, Type, Var и раздел процедур и функций. Формальные параметры представляют собой список переменных с указанием их типа. Эти переменные не описываются в разделе описаний процедуры. Допускается использование процедур без формальных параметров.

Формальные параметры могут быть трех видов:

1) параметры-значения (входные параметры);

2) параметры-переменные (выходные параметры);

3) параметры процедурного типа.

Описание входных параметров имеет вид:

список переменных 1: тип 1; список переменных 2: тип 2;…

Описание выходных параметров соответственно:

Var список переменных 1: тип 1; Var список переменных 2: тип 2; ...

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

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

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

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

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

FAR - компилятор должен создавать код подпрограммы, рассчитанный на дальнюю модель вызова. Директива NEAR заставит компилятор создать код, рассчитанный на ближнюю модель памяти. По умолчанию все подпрограммы, объявленные в интерфейсной части модулей, генерируются с расчетом на дальнюю модель вызова, а все остальные подпрограммы - на ближнюю модель.

В соответствии с архитектурой микропроцессора ПК, в программах могут использоваться две модели памяти: ближняя и дальняя. Модель памяти определяет возможность вызова процедуры из различных частей программы: если используется ближняя модель, вызов возможен только в пределах 64 Кбайт (в пределах одного сегмента кода, который выделяется основной программе и каждому используемому в ней модулю); при дальней модели вызов возможен из любого сегмента. Ближняя модель экономит один байт и несколько микросекунд на каждом вызове подпрограммы, поэтому стандартный режим компиляции предполагает эту модель памяти. Однако при передаче процедурных параметров, а также в оверлейных модулях  соответствующие подпрограммы должны компилироваться с расчетом на универсальную - дальнюю - модель памяти, одинаково пригодную при любом расположении процедуры и вызывающей ее программы в памяти. Явное объявление модели памяти стандартными директивами имеет более высокий приоритет по сравнению с опциями настройки среды Турбо Паскаля.

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

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

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

Пример 1: Составить программу для вычисления суммы квадратов натуральных чисел от 1 до n и оформить ее в виде процедуры.

Procedure Lux (N:Integer; Var Sum:Integer);

Var i:Integer;

Begin

Sum:=0;

For i:=1 To N Do Sum:=Sum + Sqr(i);

End;

Вызов процедуры в основной программе имеет вид

Lux (10,s);

Здесь s - переменная типа Integer.

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

Пример 2: Перемножить две квадратные матрицы A и B. Результат занести в матрицу C. В основной программе описывается тип

Type Mat = Array [1..5, 1..5] Of Real;

и заголовок процедуры тогда может иметь вид

Procedure Umn (A,B:Mat; Var C:Mat);

Описание подпрограммы-функции

Подпрограмма-функция аналогична процедуре, но имеет следующие отличия.

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

Function имя (формальные параметры): тип функции;

2. Функция имеет только один результат выполнения.

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

4. Вызов функции в основной программе осуществляется непосредственно внутри выражения по ее имени с указанием фактических параметров.

Пример 3: Оформить вычисления суммы квадратов натуральных чисел от 1 до n  в виде функции:

Function Lux (N:Integer): Integer;

Var s,i: Integer;

Begin

S:=0;

For i:=1 To N Do S:=S + Sqr(i);

Lux:=S;

End;

Вызов функции в основной программе может иметь вид

W:=Lux (10);

Здесь W – переменная типа Integer.

Замечание. При использовании подпрограмм процедур и функций следует иметь в виду, что переменные, представленные в разделе описания основной программы (Program), действуют в разделе операторов основной программы и в любой ее подпрограмме. Эти переменные называются глобальными. Переменные, описанные в подпрограмме, действуют только в этой подпрограмме и в любой объявленной в ней процедуре и функции. Такие переменные называются локальными. Они недоступны для операторов основной программы и других подпрограмм.

Пример 4:  В программе вводится пара чисел X и Y и выводится на экран дисплея результат возведения X сначала в степень +Y, а затем - в степень -Y. Для выхода из программы нужно ввести Ctrl-Z и Enter.

var  х,у:Real;

Function Power (a, b : Real): Real; 

begin {Power} 

if a > 0 then Power := exp(b * Ln (a)) 

else

 if a < 0 then Power := exp(b * Ln(abs(a)) 

 else

  if b = 0 then Power := 1 

  else Power := 0 

end {Power} ;

{--------------------}

begin {main} 

repeat

readln(x,y) ;

 writeln (Power (x,y) :12:10, Power (x, -y) : 15 : 10) 

 until EOF 

end {main} .

Пример 5:  В программе задаются два целых числа 5 и 7, эти числа передаются процедуре INC2, в которой они удваиваются. Один из параметров передается как параметр-переменная, другой - как параметр-значение. Значения параметров до и после вызова процедуры, а также результат их удвоения выводятся на экран.

а : Integer = 5; 

b : Integer = 7 ;

{-----------------}

Procedure Inc2 (var c: Integer; b: Integer) ; 

begin {Inc2} 

с := с + с; 

b := b + b; 

WriteLn ( 'удвоенные: ', c:5, b:5)

end {inc2}; 

{--------------}

begin {main}

WriteLn('исходные: ', a:5, b:5);

 Inc2(a,b);

WriteLn('результат: ', a:5, b:5) 

end {main}.

В результате прогона программы будет выведено:

исходные:   5  7

удвоенные: 10 14

результат: 10  7

Как видно из примера, удвоение второго формального параметра в процедуре INC2 не вызвало изменения фактической переменной В, так как этот параметр описан в заголовке процедуры как параметр-значение. Этот пример может служить еще и иллюстрацией механизма «накрывания» глобальной переменной одноименной локальной: хотя переменная В объявлена как глобальная (она описана в вызывающей программе перед описанием процедуры), в теле процедуры ее «закрыла» локальная переменная В, объявленная как параметр-значение.

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

1. Что называется подпрограммой?

2. Структура подпрограммы. Описать входящие в нее компоненты.

3. Как определяется порядок обращения подпрограмм к друг другу?

4. Дайте описание подпрограмме-процедуре.

5. Что такое формальные параметры? Опишите их виды.

6. Определение стандартных директив. Какое действие они задают компилятору.

7. Вызов процедуры. Примеры.

8. Дайте описание подпрограмме-функции.

9. В чем различие между глобальными и локальными переменными?


 

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

32797. Античная философия: этапы развития и характерные черты. Первые греческие мыслители 22.71 KB
  Античная философия: этапы развития и характерные черты. Античная философия возникла в Древней Греции в середине I тысячелетия до н. В центре внимания философии данного периода проблемы природы космоса в целом; 2классическая греческая философия учения Сократа Платона Аристотеля V IV вв. Главное внимание здесь уделяется проблеме человека его познавательных возможностей; 3философия эпохи эллинизма III в.
32798. Философия Платона, Теория познания Платона 14.35 KB
  Наиболее известные диалоги Платона: Государство Пир диалоги Софист и Федр посвящены проблеме души Тимей вопросу возникновения Космоса Протагор проблеме добродетели. Человек по Платону единство души и тела которые в то же время противоположны. Смертное тело только тюрьма для души оно источник страданий причина всех зол; душа гибнет если она слишком срослась с телом в процессе удовлетворения своих страстей. Стимулом к совершенствованию души является любовь к прекрасному.
32799. Философия эпохи эллинизма, ее основные направления 14.57 KB
  На развитие античной философии значительное влияние оказал распад империи А. Неоплатонизм получил распространение в период когда античный способ философствования уступал место философии основанной на христианской догматике. Это последняя попытка решить задачу создания целостного философского учения в рамках дохристианской философии. Главное отличие от философии Платона заключается в том что мир идей Платона это неподвижный безличный образец мира а в неоплатонизме появляется активное мыслящее начало Ум.
32800. Вклад Аристотеля в развитие мировой философской культуры (учение о материи и форме). Учение о душе 13.19 KB
  Аристотель 384 322 гг. Аристотель считается величайшим энциклопедистом древности и систематизатором всех философских и научных знаний накопленных до него в области логики физики биологии психологии этики экономии искусствознания и др. Высоко оценивая Платона Аристотель подверг его идеалистическое учение серьезной критике Платон мне друг но истина дороже. Аристотель формулирует свое представление о бытии.
32801. Условия формирования западноевропейской философии в Средние века. Роль христианства в развитии культуры 15.27 KB
  Условия формирования западноевропейской философии в Средние века. Этапы развития и характерные черты средневековой философии. В развитии философии Средних веков можно выделить несколько основных этапов: 1 апологетика II IV вв. В этот период не было создано философских систем но был намечен круг вопросов ставших центральными в средневековой философии: о Боге и соотношении Бога и мира о сотворении мира и структуре мироздания о сущности человека и его месте в мире; 2 патристика V IX вв.
32802. Философия Августина Аврелия (Блаженного). И Фомы Аквинского 14.95 KB
  Учение о Боге и мире. Бог рассматривается им как начало всего сущего как единственная причина возникновения вещей. Бог вечен и неизменен. Мир созданных богом вещей изменчив и пребывает во времени.
32803. Особенности философии Возрождения. Её связь с наукой и искусством. Учения о природе и познании 18.84 KB
  Особенности философии Возрождения. Эпоха Возрождения Ренессанса переходный период от Средних веков к Новому времени XV [в Италии с XIV] XVI вв. Возрождение художественноэстетическая эпоха провозгласившая что высшее призвание человека в мире быть творцом и созидателем Этапы развития и характерные черты философии Возрождения. В философии эпохи Возрождения можно выделить 3 этапа: гуманистический сер.
32804. Эмпиризм и сенсуализм в философии нового времени 16.32 KB
  Локк подчеркивает особую роль органов чувств в процессе познания.Бэкон сделал научное познание в центре его внимания вопросы о целях и методах научного познания.Однако он утверждает что на пути познания имеется множество заблуждений препятствующих получению достоверного знания. Бэкон выделяет 4 вида идолов познания: 1 идолы рода являются следствием ограниченности человеческого ума несовершенством органов чувств; 2 идолы пещеры обусловлены индивидуальными особенностями человека: каждый человек имеет свой внутренний субъективный мир...
32805. Рационализм в философии нового времени 17.35 KB
  Эти две субстанции пересекаются и активно взаимодействуют однако их взаимосвязь является лишь механической. В человеке материальная и духовная субстанции проявляются как тело и душа. В понятии единой субстанции т. Спиноза называет следующие свойства единой субстанции: независимое ни от чего существование; вечность; бесконечность; является внутренней причиной самой себя и всего сущего.