ПРОЦЕДУРЫ. СПОСОБЫ ПЕРЕДАЧИ ПАРАМЕТРОВ
Если функции используются в том случае, когда в основную программу должна быть возвращена скалярная величина, то процедуры удобнее использовать в следующих случаях: - если в основную программу должна быть возвращена величина нескалярного типа (например, массив), - если в основную программу должно быть возвращено несколько значений, - если в основную программу ничего не должно возвращаться. Описание процедур имеет следующий вид: Procedure < имя процедуры > [(< список формальных параметров >)]; < описательная часть > begin < тело процедуры > end; Обращение к процедуре производится по следующей схеме: < имя процедуры > [(< фактические параметры >)]; Вызов процедуры осуществляется отдельной командой, то есть вызов внутри операторов присваивания и вывода недопустим.
И в процедурах, и в функциях формальные параметры делятся на два типа: 1) параметры, передаваемые по значению, 2) параметры, передаваемые по ссылке. Но, если в функциях параметры, передаваемые по ссылке, практически не используются, то для процедур такие параметры обязательно должны присутствовать, если в программу необходимо возвратить какой-либо результат.
Описание параметров, передаваемых по ссылке (параметры-переменные): Var < список переменных >:< тип >; Описание параметров, передаваемых по значению (параметры-значения): < список переменных >:< тип >;
При использовании обоих типов параметров в описании одной процедуры, они отделяются друг от друга точкой с запятой.
Рассмотрим отличие этих двух способов. 1) Параметры-переменные. При передаче параметров по ссылке (это формальный параметр, перед которым стоит служебное слово Var) изменения формального параметра внутри процедуры приводят к аналогичному изменению фактического параметра. То есть формальный и фактический параметр являются именем одной и той же ячейки памяти (передается адрес фактического параметра, который должен быть обязательно переменной!): Пример. Program a; Var b,c:integer;
Procedure Q(Var x,y:integer); Begin X:=5; Y:=10 End;
Begin B:=1; c:=2; Q(b,c); Write(b,c) End. После выполнения процедуры осуществляется возврат на оператор основной программы, который следует за вызовом процедуры. При выполнении данной программы на экран будет выведено 5 и 10.
2) Параметры-значения. При передаче параметров по значению формальный параметр считается локальной переменной, действующей только в пределах процедуры. При вызове процедуры он получает начальное значение, равное значению фактического параметра и после этого никакой связи между ними не существуют. То есть создаётся копия переменной. Внутри подпрограммы возможны любые действия с данным параметром, но это никак не отражается на значениях переменных вне процедуры. Пример. Program a; Var b,c:integer; Procedure Q(X,Y:integer); Begin X:=5; Y:=10 End;
Begin B:=1; c:=2; Q(b,c); Write(b,c) End. При выполнении данной программы на экран будет выведено 1 и 2.
Обычно параметры-значения используются для передачи в подпрограмму исходных данных, а параметры-переменные – для возврата результата. Запишем с использованием процедуры программу вычисления площади четырёхугольника:
Program geron; Var a,b,c,d,e,s1,s2:real;
Procedure Square(x,y,z:real; Var s:real); Var p:real; Begin p:=(x+y+z)/2; S:=sqrt(p*(p-x)*(p-y)*(p-z)) End;
Begin Readln(a,b,c,d,e); Square(a,b,e,S1); Square(c,d,e,S2); Writeln(‘S=’,S1+S2) End.
В качестве параметров-значений можно передавать и переменные, и константы. В качестве параметров-переменных – только переменные. Например, будет ошибочной запись: Square(5,6,8,10).
Задача 1. Написать программу, запрашивающую 5 целых чисел (N<=999999) и выводящих в текстовый файл все цифры этих чисел через запятую в обратном порядке. Program number; Var a:longint; i:byte; f:text;
procedure cifra(x:longint); var k:byte; begin while x<>0 do begin k:=x mod 10; write(f,k,’,’); x:=x div 10 end; writeln(f) end;
Begin assign(f,’f.dat’); rewrite(f); for i:=1 to 5 do begin read(a); cifra(a) end; close(f) End.
Задача 2. Что получится в результате работы программы:
Program example; Var a,b,c:integer;
Procedure One(x,y:integer; Var z:integer); Begin X:=y+2; y:=z*3; z:=5; Write(x,y,z) End;
Procedure Two(x:integer; var z,y:integer); Begin X:=y+z; y:=y+10; Write(x,y,z) End;
Begin A:=1; b:=2; c:=3; Two (b,a,c); write(b,a,c); One (a,b,c); write(a,b,c) End.
При использовании процедур и функций в Паскале допускается их описание не только внутри основной программы, но и внутри других процедур и функций. Встаёт вопрос: как в этом случае определяется область действия описания переменных и откуда можно производить вызов вложенных процедур и функций? В Паскале действует правило: каждый программный объект должен быть описан перед своим использованием. То есть описание объекта должно предшествовать его первому появлению в других программных фрагментах. Кроме того, внутренняя подпрограмма не может вызывать подпрограмму, по отношению к которой она является вложенной.
|