Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Организация работ с процедурами и функциями пользователя в языке программирования turbo pascal. Передача параметров. Рекурсия и ее использование.



Читайте также:
  1. I. Задание для самостоятельной работы
  2. I. Задания для самостоятельной работы
  3. I. Задания для самостоятельной работы
  4. I. Задания для самостоятельной работы
  5. I. Задания для самостоятельной работы
  6. I. Задания для самостоятельной работы
  7. I. Задания для самостоятельной работы

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

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

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

Процедура - подпр-ма, сост–щая из заголовка и тела. По своей стр–ре проц–ра копирует построение программы Паскаля. Стр–ра проц–ры имеет вид.

Procedure Имя (Список формальн. пар-ов (пар–р1: тип, параметр2: тип,…));Список формальных пар–ров опр–ет кол-во, тип, имена констант или перем–х зн–й кот–х передаются в процедуру в кач–ве внешнего пар–ра. Разумеется, наличие внешних пар–ров не обязательно, следовательно списка пар–ров может и не быть. Тогда прог-ра работает как автономная программа. Далее идет label const type var – Описание локальн. меток, конст, типов и перемен-ых. procedure function –Опис-ие внутр-их проц-р и функ-ий. begin…end; – Операторы. Подпр-мой – функцией в Паскале наз–ют тип подпр-м, кот–ый имеет несколько отличий от процедуры.

1)Заголовок функции имеет вид: Function Имя (Список форма–ных пар–ов): тип рез–та;

Имя функции исп–ется внутри ф–ции как идентификатор некоторой перем–ной, тип кот–ой указ–ется в заголовке.

2) begin…end; – Операторы, среди кот-х должен быть хотя бы один, кот-ый присваивает имени фун-ии знач-ие рез-та.Ф–ция обяз–но должна передать вызывающей программе свое зн–ние (скалярного типа), поэтому внутри тела фун-ции обязательно д/б опер–р, присваив–й идентиф–ру ф–ии его зн–ния.3) Вызов ф–ции можно производить в любом варианте, в том числе в алгебр–ком выр–нии, вызове проц–ры или др–й ф–ии.

Вызов проц-ры осущ–ся из основной программы или другой подпр-мы. Для вызова проц-ры необходимо отдельным опер–ром записать имя проц-ры и указать ее пар–ры. Идентификаторы пар–ров д/б описаны в вызывающей прог–ме. Для совм–ти прог-ры и вызывающей прог–мы необх–мо соотв–вие пар–ров.

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

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

Структура описания процедур и функций похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит собственно операторы процедур.

Формат описания процедуры:

procedure имя процедуры (формальные параметры);

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

begin

исполняемая часть процедуры

end;

Формат описания функции:

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

раздел описаний функции

begin

исполняемая часть функции

end;

Формальные параметры в заголовке процедур и функций:

var имя параметра: имя типа

и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать. Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type. Список формальных параметров может отсутствовать.

Вызов процедуры:

имя процедуры (список фактических параметров);

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

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

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

имя функции:= результат;

При вызове процедур и функций необходимо соблюдать следущие правила:

· количество фактических параметров должно совпадать с количеством формальных;

· соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

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

var x,y,m,n: integer;

procedure MaxNumber(a,b: integer; var max: integer);

begin

if a>b then max:=a else max:=b;

end;

begin

rite('Введите x,y ');

readln(x,y);

MaxNumber(x,y,m);

MaxNumber(2,x+y,n);

writeln('m=',m,'n=',n);

end.

Аналогичная с функцией:

var x,y,m,n: integer;

function MaxNumber(a,b: integer): integer;

var max: integer;

begin

if a>b then max:=a else max:=b;

MaxNumber:= max;

end;

begin

write('Введите x,y ');

readln(x,y);

m:= MaxNumber(x,y);

n:= MaxNumber(2,x+y);

writeln('m=',m,'n=',n);

end.

Передача параметров

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

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

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

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

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

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

Основные правила работы с глобальными и локальными именами:

· Локальные имена доступны (считаются известными, "видимыми") только внутри того блока, где они описаны. Сам этот блок, и все другие, вложенные в него, называют областью видимости для этих локальных имен.

· Имена, описанные в одном блоке, могут совпадать с именами из других, как содержащих данный блок, так и вложенных в него. Это объясняется тем, что переменные, описанные в разных блоках (даже если они имеют одинаковые имена), хранятся в разных областях оперативной памяти.

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

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

Имя, описанное в блоке, "закрывает" совпадающие с ним имена из блоков, содержащие данный. Это означает, что если в двух блоках, один из которых содержится внутри другого, есть переменные с одинаковыми именами, то после входа во вложенный блок работа будет идти с локальной для данного блока переменной. Переменная с тем же именем, описанная в объемлющем блоке, становится временно недоступной и это продолжается до момента выхода из вложенного блока.

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

Понятие рекурсии

Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя. Факториал – пример рекурсивного объекта

Если вычисление факториала n реализовать как функцию, то в теле этой функции будет инструкция вызова функции вычисления факториала числа (n-1), т.е. функция будет вызывать сама себя. Такой способ вызова называется рекурсией, а функция, которая обращается сама к себе, называется рекурсивной функцией.

function factorial (k:integer): integer;

Begin

if k=1

then factorial:=1

else factorial:=k*factorial(k-1);

end;

Функция вызывает сама себя только в том случае, если значение параметра больше единицы. Если значение параметра равно единице, то функция сама себя не вызывает, а возвращает значение, и рекурсивный процесс завершается.

program usefac:

Var

n:integer; {число, факториал которого надо вычислить}

f:integer; {факториал числа n}

function factorial(k:integer):integer;

Begin

if k=1

then factorial:=1

else factorial:=k*factorial(k-1);

end;

begin {основная программа}

writeln(‘Вычисление факториала с использованием рекурсивной ’,’функции.’);

write(‘Ведите число, факториал которого надо вычислить ->’);

readln(n);

f:=factorial(n);

writeln(‘Факториал числа ’,n,’ равен ’,f);

end.

Использование рекурсии позволяет легко (почти дословно) запрограммировать вычисления по рекуррентным формулам.

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

Максимальное число рекурсивных вызовов процедуры без возвратов, которое происходит во время выполнения программы, называется глубиной рекурсии.

Число рекурсивных вызовов в каждый конкретный момент времени, называется текущим уровнем рекурсии.

Главное требование к рекурсивным процедурам заключает­ся в том, что вызов рекурсивной процедуры должен выполняться по усло­вию, которое на каком-то уровне рекурсии станет ложным.

Формы рекурсивной процедуры:

1. Форма с выполнением действий до рекурсивного вызова (с выполнением действии на рекурсивном спуске).

2. Форма с выполнением действий после рекурсивного вызова (с выполнением действий на рекурсивном возврате).

3. Форма с выполнением действий как до, так и после рекурсивного вызова (с выполнением действий как на рекурсивном спуске, так и на рекурсивном возврате).

Дополнение

Рас-м возможные варианты исп–мых в Турбо Паскале пар–ров подпр-м:

1)Параметры- переменные. Параметр- переменная исп–ся для передачи зн–ния из проц–ры в вызыв–ую прог–му. Для выделения пар–ров-перем–х исп–ся зарезер–ное слово var:Пример- Procedure ot (var a, b:integer);

Поскольку данный тип пар–ров действует и в проц-ре и в прог-ме, то такие перем–ные наз–ся глобальными. Глоб–ная перем–ная д/б описана в вызыв–щей программе (правильно описан тип).

2) Параметры – значения. Данный тип пар–ров исп–ся только для передачи зн–ния в проц–ры из вызывающей. действие данной перем–ой ограничено пр-рой. Такие перем–ые носят название локальных. Для описания локальных перем–ных не исп–ся var. Если необходимо описать и локальные и глобальные перем–ные, то их описания в заголовке пр-ры отделены зпаком “; ”.

Пример –Procedure ot (var a, b:integer; c, d:integer);

3) Нетипизированные пар–ры. Такие пар–ры задаются без указания типа. По своему типу они глобальные и при их задании необходимо указание var. Данный тип пар–ров необх–мо исп–ть очень осторожно, так как Паскаль при компиляции не проверяет для таких пар–ров соотв–вие типа. Тогда ”ошибка” может появиться внезапно в процесе исполнения. Это тем более непринято, если прог–ма уже считается избавленной от ошибок.

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

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

В turbo Pascal реализовано 3 способа передачи пар-ров:

1) Вида value in. В Паскале такие пар-ры наз пар-ми–значениями. При описании заголовков проц-р и функ-ий перед идентификаторами пар-ов–знач дополнит ключевые слова не ставятся.

2) Вида addr inout– назыв пар-ми-перемен-ми. При описании заголовков проц-р и функ-ий

перед идентификатор. ставится ключевое слово var

 


Дата добавления: 2015-07-11; просмотров: 245 | Нарушение авторских прав






mybiblioteka.su - 2015-2024 год. (0.016 сек.)