Лекция 5
|
 |
 |
|
Пользовательские процедуры и функции языка
Паскаль.
|
|
В языке
Паскаль, как и в большинстве языков программирования,
предусмотрены средства, позволяющие оформлять последовательность
операторов как подпрограмму. Это бывает необходимо, когда такая
последовательность неоднократно встречается в программе или
когда имеется возможность использовать некоторые фрагменты уже
написанных ранее программ. В Паскале такую возможность
предоставляют процедуры и функции, определенные пользователем. |
Описание
процедур и функций располагается в программе в разделе описаний.
Сами описания не означают выполнения действий. Действия,
предусмотренные процедурой или функцией, выполняются при вызове
процедуры или функции из основного блока программы. |
|
function
<имя> (<список параметров>):<тип>; |
|
<разделы
локальных описаний>; |
|
<раздел
операторов (тело функции)>; |
где <имя> -
идентификатор функции, не совпадающий с ключевыми словами и не
содержащий пробелов и других специальных символов (кроме знака
подчеркивания);
<список параметров> - список аргументов, с которыми работает функция,
с указанием их типов;
<тип> - тип значения, возвращаемого функцией.
Аргументы,
передаваемые в функцию, в описании функции называются
формальными параметрам. В точке вызова функции вслед за
ее именем в скобках указываются фактические параметры,
т.е. те конкретные значения, которые передаются в функцию для
обработки. |
В точке
вызова функции происходит неявное присваивание фактических
значений формальным переменным, имена которых перечислены в
заголовке функции при ее описании. |
В разделе
операторов функции обязательно должен присутствовать оператор
присваивания вида: |
|
<имя
функции>:=<выражение>; |
Этот
оператор определяет значение, которое будет возвращено функцией
в точку ее вызова. |
Найти
максимальное из 4-х чисел. |
Program max_4;
uses crt;
var a, b, c, d, m: integer;
function max_2(x,y:integer):integer;
var max:integer;
begin
if x>y then
max:=x
else
max:=y;
max_2:=max;
end;
Begin
clrscr;
readln(a, b, c, d);
m:=max_2(a,b);
m:=max_2(m,c);
m:=max_2(m,d);
(или
m:=max_2(max_2(max_2(a,b), c), d);)
writeln(m);
End.
|
procedure
<имя> [(<список параметров>[; var <параметр>])]; |
|
<разделы
локальных описаний>; |
|
<раздел
операторов (тело процедуры>; |
где <имя> -
идентификатор процедуры (те же ограничения, что и для функции);
<список параметров> - список аргументов процедуры с указанием их
типов (список параметров-значений);
var <параметр> - имя параметра-переменной, т.е. той переменной,
значение которой будет возвращено в точку вызова процедуры.
Процедура
может не содержать никаких параметров. В этом случае выполняются
операторы, стоящие в теле процедуры. Примером такой процедуры
может служить процедура вычерчивания рамки на текстовом экране:
|
for j:=1 to 25
do
Если же в
заголовке процедуры указаны параметры, то в точке вызова
процедуры происходит неявное присваивание фактических значений
параметрам-значениям, а по окончании действия процедуры в точку
вызова возвращаются значения параметров-переменных. |
Найти
максимальное из 4-х чисел. |
Program max_4;
uses crt;
var a, b, c, d, m: integer;
procedure max_2(x,y:integer; var max:integer);
begin
if x>y then
max:=x
else
max:=y;
end;
Begin
clrscr;
readln(a, b, c, d);
max_2(a,b,m);
max_2(m,c,m);
max_2(m,d,m);
writeln(m);
End.
|
3.
Локальные и глобальные переменные. |
Переменные
описываются в программе в разделе описания переменных. Если же
программа содержит описание процедуры или функции, то некоторые
переменные могут быть описаны в этой процедуре или функции в
разделе локальных описаний. |
Переменные,
описанные в главной программе, называются глобальными.
Ими можно пользоваться и в главной программе, и в процедуре или
функции. |
Переменные,
описанные в процедуре или функции, называются локальными.
Ими можно пользоваться только в той процедуре или функции, где
они описаны. Вне тела процедуры или функции значения таких
переменных не определены. |
При
использовании локальных переменных необходимо следить за тем,
чтобы их идентификаторы не совпадали с именами глобальных
переменных. |
Если
процедура или функция изменяет значение глобальной переменной,
то говорят, что она имеет побочный эффект. |
1)
Program summa;
var a, b, s: integer;
procedure newval;
begin
a:=1;
b:=1;
end;
Begin
a:=0;
b:=0;
newval;
s:=a+b;
writeln(s);
End.
2)
Program summa;
var a, b, s: integer;
procedure newval;
var b: integer;
begin
a:=1;
b:=1;
end;
Begin
a:=0;
b:=0;
newval;
s:=a+b;
writeln(s);
End.
|
4.Параметры процедур и функций. |
Имена
переменных, перечисленных в заголовке процедуры (функции), носят
название формальных параметров. Они служат для
обозначения тех данных, с которыми процедура (функция) будет
работать после вызова. |
Процедура
(функция) вызывается главной программой или другой процедурой
(функцией). Обращение к процедуре или функции называется
точкой вызова процедуры (функции). При вызове необходимо
задать значения параметров, с которыми будет работать процедура
(функция). Эти значения называются фактическими параметрами.
|
Соответствующие друг другу формальные и фактические параметры
должны принадлежать одному и тому же типу. |
При вызове
процедуры необходимо знать способ подстановки фактических
параметров: |
-
подстановка переменной. |
Program sum;
var p,q,s: integer;
procedure newval (r,t:integer);
begin
r:=r+1;
t:=t+2;
end;
Begin
p:=0;
q:=0;
newval(p,q);
s:=p+q;
writeln(s);
End.
Здесь в
описании процедуры формальные параметры описаны как параметры
значения. Это означает, что при вызове процедуры вместо них
будут подставлены значения фактических параметров. В главной
программе вызов процедуры осуществляется оператором
newval(p,q). При выполнении этого оператора сначала
вместо формальных параметров r и t
будут подставлены значения фактических параметров, т.е. неявно
будут выполнены операторы: |
В результате
выполнения процедуры r и t получат значения:
r=1; t=2. Однако, никаких связей между r и p,
t и q в теле процедуры не установлено.
Поэтому после выполнения процедуры p и q
будут иметь такие же значения, что и до ее выполнения. В результате
s получит значение 0.
Program sum;
var p,q,s: integer;
procedure newval (r:integer; var t:integer);
begin
r:=r+1;
t:=t+2;
end;
Begin
p:=0;
q:=0;
newval(p,q);
s:=p+q;
writeln(s);
End.
Здесь
формальный параметр t описан как
параметр-переменная, а r – как параметр-значение.
В главной программе при выполнении оператора newval(p,q)
вместо формального параметра r будет подставлено
значение p, т.е. неявно будет выполнен оператор
присваивания r:=p. Вместо же параметра t будут
подставлена переменная q, т.е. переменные t
и q будут считаться синонимами. |
В
результате после выполнения процедуры p будет
иметь значение 0, а q получит значение 2.
Следовательно, s будет равно 2. |
Program sum;
var p,q,s: integer;
procedure newval (var r:integer; var t:integer);
begin
r:=r+1;
t:=t+2;
end;
Begin
p:=0;
q:=0;
newval(p,q);
s:=p+q;
writeln(s);
End.
В этом
случае оба параметра процедуры описаны как параметры-переменные.
Следовательно, в результате выполнения процедуры s
получит значение 3. |
Если
параметр процедуры является ее аргументом, предпочтительнее
подстановка значения. Если же параметр процедуры есть ее
результат, то необходима подстановка переменной. |
Точка с
запятой: 1) является разграничителем операторов; |
2) наличие
между операторами нескольких точек с запятой не является
ошибкой; |
3) не ставится после type, const, var; |
4) ставится
после завершения каждого описания; |
5) не
ставится после begin и перед end; |
6) не
ставится после then и перед else; |
7) не
ставится после while, repeat, do и перед until. |
 |