Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции ИВАНОВ Книга Паскаль.doc
Скачиваний:
5
Добавлен:
18.11.2019
Размер:
1.93 Mб
Скачать

Глава 5

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

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

Такие самостоятельные программные блоки называются подпрограммами пользователя.

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

Достоинства подпрограмм:

  • Программы с участием подпрограмм легче тестировать и отлаживать.

  • Их изменение не приводит к изменению основной программы.

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

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

5.1 ПРОЦЕДУРЫ ПОЛЬЗОВАТЕЛЯ

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

Процедура в Паскале имеет структуру, подобную структуре программы.

Общая структура процедуры имеет вид:

Procedure имя процедуры (параметры); {Заголовок процедуры}

Uses список модулей;

Label метки;

Const объявление констант;

Type определение типов данных;

Var объявление переменных;

Begin

Тело процедуры;

End;

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

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

Формат:

Procedure <Имя> (<Список параметров>);

где Procedure – зарезервированное слово;

<имя> - имя процедуры, определяемое в соответствии с общими правилами построения идентификаторов;

<Список параметров> (формальных) - перечень имен для обозначения исходных данных и результатов работы процедуры с указанием их типов.

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

Например,

Procedure Sort (a, b: real; n, k: integer; h: char);

Допускается описание процедуры, не содержащее <Списка параметров>:

Procedure Sort;

5.1.1 Обращение к процедуре

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

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

Вызов процедуры приводит к выполнению операторов, составляющих тело процедуры. После этого управление переходит к оператору, следующему за вызовом процедуры.

Формат:

<Имя процедуры> (<Список параметров>);

где <Имя процедуры> – имя процедуры, к которой происходит обращение;

<Список параметров> (фактических) - перечень конкретных значений (выражений) и имен, подставляемых на место формальных параметров процедуры при ее выполнении.

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

Формальных параметры – это переменные, фиктивно (формально) присутствующие в процедуре и определяющие тип и место подстановки параметров.

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

Например,

Sort (1.5, 3.24, 10, 526, ’-‘); {числа и символ – фактические параметры}

Sort; {фактические параметры не указаны, т.к. в вызываемой процедуре нет формальных параметров}

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

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

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

Пример. Необходимо вычислить по заданному числу десятичный логарифм.

Так как такой функции в Паскале нет, то для вычисления используем соотношение y = 0.4348*ln(x). Для перевода можно использовать следующую процедуру.

Procedure Log10 (arg: real; Var log: real);

Begin

log:= 0.4348*ln(x)

End;

Вызов процедуры происходит так: Log10(x,y);

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

Пример. Напечатать первые n натуральных чисел и их факториалы, число n задается вводом.

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

Program faktorial;

Uses crt;

Var i,n: integer;

z:longint;

Procedure fakt(x:integer; var y:longint);

Var j:integer;

begin

y:=1;

for j:=1 to x do y:=y*j;

end;

Begin

clrscr;

write('VVEDITE n= '); readln(n);

for i:=1 to n do

begin

fakt(i,z);

writeln(i,' ', z);

end

end.

Пример. Составить алгоритм вычисления числа сочетаний. Число сочетаний рассчитать по формуле:

Данная задача была рассмотрена ранее в разделе 1.4. Приведем два способа составления программы для решения этой задачи.

Программа

без использования процедуры

Программа

с использованием процедуры

Program Sochetanie;

uses crt;

var n,m,f1,f2,f3 : longint;

c : real; i : integer;

begin

clrscr;

read(n, m);

f1:=1;

for i :=2 to n do f1:= f1*i;

f2:=1;

for i :=2 to m do f2:= f2*i;

f3:=1;

for i:=2 to n-m do f3:= f3*i;

c := f1/(f2* f3);

write(‘число сочетаний равно’, c:3:1);

end.

Program Sochetanie;

uses crt;

var n,m,f1,f2,f3:longint;c:real;

Procedure fact(k:integer;

var f:longint);

var i:integer;

begin

f:=1;

for i:=2 to k do f:=f*i;

end;

begin

clrscr;

readln(n,m);

fact(n,f1);

fact(m,f2);

fact(n-m,f3);

c:=f1/(f2*f3);

write(c:3:1);

end.

Пример: Вычислить выражение , n где задается вводом.

Program Sum_faktorial;

uses crt;

var i,n: integer;

z:longint;

s:real;

procedure fakt (x:integer; var y:longint);

var j:integer;

begin y:=1;

for j:=1 to x do y:=y*j;

end;

begin

clrscr;

write('VVEDITE n= '); readln(n);

s:=1;

for i:=1 to n do

begin

fakt(i,z);

s:=s+1/z;

writeln(i,' ', z, ' ' , 1/z:5:2);

end ;

write(s:4:1)

end.

5.2 ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ

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

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

  • Имя функции может входить в выражение как операнд. Функция возвращает результат в точку своего вызова.

Общая структура функции аналогична структуре процедуры:

Function имя функции (параметры) : тип; {Заголовок функции}

Uses список модулей;

Label метки;

Const объявление констант;

Type определение типов данных;

Var объявление переменных;

Begin

Тело функции;

End;

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

Заголовок функции так же как и заголовок процедуры не может быть опущен.

Формат:

function <Имя>(Список формальных параметров) : <Тип>;

где Function – зарезервированное слово.

<имя> - имя функции, определяемое в соответствии с общими правилами построения идентификаторов;

<Список параметров> (формальных) - перечень имен для обозначения исходных данных и результатов работы функции с указанием их типов.

Например,

function Sort : double ; {формальных параметров нет}

function Sort (a, b : real) : real; {a, b - формальные параметры}

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

Например:

Writeln(fibo(i)); {параметр – значение переменной}

C:=instep(2,8); {параметры – непосредственно значения }

Пример. Необходимо вычислить значение функции тангенса tan(x) аргумента х.

Function Tan (x: real) : real;

Var tangens: real;

Begin

tangens:= Sin(x)/Cos(x);

Tan:= tangens;

End;

Для вызова функции из основной программы или другой подпрограммы следует в выражении, где необходимо использовать значение функции, указать имя функции со списком фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами функции. Например, надо вычислить , оператор присваивания будет Y:= Tan(x)/(1+sqr(Tan(x));

Пример. Напечатать первые n натуральных чисел и их факториалы, число n задается вводом.

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

Program faktorial;

uses crt;

var i,n: integer;

z: longint;

function fakt(x:integer):longint;

var j: integer;

y: longint;

begin y:=1;

for j:=1 to x do y:=y*j;

fakt:=y;

end;

begin

clrscr;

write('VVEDITE n= '); readln(n);

for i:=1 to n do writeln(i,' ', fakt(i));

end.

Пример. Составить алгоритм вычисления числа сочетаний. Число сочетаний рассчитать по формуле:

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

Program Sochetanie;

var n, m : integer; c : real;

Function faсt (k : integer) : integer;

var i, f : integer;

begin f := 1;

for i := 2 to k do f := f*i

faсt := f

end;

begin

read(n, m);

c := fakt(n)/( fakt(m)*fakt(n-m));

write(‘число сочетаний равно’, c:3:1);

end.

Следует знать:

  • Тело подпрограммы по структуре аналогично программе, но после слова end ставится точка с запятой.

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

  • Функция всегда возвращает, по крайней мере, одно значение, носителем которого является ее имя.

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

  • Фактические параметры при вызове подпрограммы должны соответствовать формальным параметрам, указанным при ее объявлении по количеству, порядку следования слева направо и типу.

  • Если параметры подпрограммы используются для возврата результата работы в главную программу, то в объявлении подпрограммы перед именем соответствующего формального параметра должно присутствовать слово var.