Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции Информатика_заочн / Лекция2.4информатика

.doc
Скачиваний:
70
Добавлен:
17.03.2015
Размер:
52.74 Кб
Скачать

Лекция 5.

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

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

5.1. Процедуры пользователя.

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

Структура процедуры:

procedure Имя(p1:T1;p2:T2; var p3:T3…);

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

begin

{тело процедуры}

end;

Заголовок процедуры состоит из служебного слова procedure затем через пробел указывается имя процедуры и в круглых скобках задаются формальные параметры: p1, p2, p3, и их типы: T1, T2, T3. Формальные параметры – это наименования переменных, через которые передается информация из программы в процедуру либо из процедуры в программу. Количество формальных переменных зависит от назначения процедуры. Процедуры могут быть и без формальных параметров, тогда передача данных из программы в процедуру и обратно проводится с помощью переменных, описанных в самой программе, а заголовок процедуры будет иметь более простой вид:

procedure Имя;

Формальные параметры могут быть параметрами-значениями и параметрами переменными. Для различения параметров-значений и параметров-переменных, перед параметрами переменными ставится служебное слово var.

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

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

Вызов процедуры без формальных параметров осуществляется просто по имени.

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

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

Локализация переменных дает программисту большую свободу в выборе идентификаторов. Если две процедуры А и В полностью отделены друг от друга, то идентификаторы в них могут быть выбраны совершенно произвольно, в частности, могут повторяться. В этом случае повторяющимся идентификаторам соответствуют разные области памяти, совершенно друг с другом не связанные.

Если один и тот же идентификатор описан в модуле В и второй раз описан во вложенном в В модуле С, то надо помнить, что эти два одинаковых идентификатора соответствуют разным ячейкам памяти.

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

Разберем на примерах, как работает оператор процедуры.

Пример. Задача нахождения максимального из трех чисел, используя процедуру нахождения максимального из двух чисел.

Алгоритм нахождения максимального можно оформить в виде следующих процедур:

Процедура без параметров

Процедура с параметрами-значениями

Процедура с параметрами-значениями и параметром-переменной

procedure MAX_A;

begin

if x>y then m:=x

else m:=y;

end;

procedure MAX_B(x,y:real);

begin

if x>y then m:=x

else m:=y;

end;

procedure MAX_B(x,y:real,var m:real);

begin

if x>y then m:=x

else m:=y;

end;

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

  1. program Max1;

var a,b,c,M2,M3: real;

x,y,m: real;

procedure MAX_A;

begin

if x>y then m:=x

else m:=y;

end;

begin

writeln (‘ Введите три числа:’); readln (a,b,c);

x:=a; y:=b;

MAX_A;

M2:=m;

x:=m;y:=c;

MAX_A;

M3:=m;

writeln (‘max(a,b,c)=’, M3);

end.

Все параметры описаны в программе, поэтому выполнение оператора процедуры MAX_A равносильно выполнению фрагмента программы if x>y then m:=x else m:=y;

  1. program Max2;

var a,b,c,M2,M3: real;

m: real;

procedure MAX_B(x,y:real);

begin

if x>y then m:=x else m:=y;

end;

begin

writeln (‘ Введите три числа:’); readln (a,b,c);

MAX_B(a,b); M2:=m;

MAX_B(M2,c);M3:=m;

writeln (‘max(a,b,c)=’, M3);

end.

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

var x,y:real;

begin

x:=a; y:=b;

if x>y then m:=x else m:=y;

end;

  1. program Max3;

var a,b,c,M2,M3: real;

procedure MAX_C(x,y:real; var m:real);

begin

if x>y then m:=x else m:=y;

end;

begin

writeln (‘ Введите три числа:’); readln (a,b,c);

MAX_C(a,b,M2);

MAX_C(M2,c,M3);

writeln (‘max(a,b,c)=’, M3);

end.

При входе в процедуру параметры-переменные заменяются на фактические параметры-переменные. Выполнение оператора MAX_C(a,b,M2) равносильно выполнению такой программы:

var x,y:real;

begin

x:=a; y:=b;

if x>y then M2:=x else M2:=y;

end;

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

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

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

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

5.2. Функции пользователя.

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

function Имя(p1:T1;…;pn:Tn):T;

{разделы описаний};

begin

{тело функции};

end;

где p1,…pn – формальные параметры;

T1,…Tn – типы формальных параметров;

Tтип результата функции.

Блок функции может содержать все разделы, которые могут быть в процедурах. В блоке функции должен быть раздел операторов от begin до end;. В отличии от процедур, после работы функции результат присваивается имени функции, поэтому в блоке функции обязательно должен присутствовать оператор:

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

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

Для вызова функции достаточно указать ее имя с фактическими параметрами в любом выражении.

Например, функция вычисления большего из двух чисел:

function MAX(x,y:real):real;

begin

if x>y then MAX:=x else MAX:=y;

end;

В программе эта функция может быть вызвана таким образом:

r:=MAX(1, p*q)*(b+5); где 1 и p*q – фактические параметры.

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

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

  1. в теле функции (и в процедуре) производить перевычисение глобальных переменных;

  2. использовать в функциях параметры-переменные.

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

Например, рекурсивное определение факториала:

n!=1, если n=0, n!=n*(n-1)!, если n>0.

function fact(n:integer):integer;

begin

if n=0 then fact:=1 else fact:=n*fact(n-1);

end;