Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 Подпрограммы.doc
Скачиваний:
25
Добавлен:
09.02.2015
Размер:
369.15 Кб
Скачать

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

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

Пример объявления и вызова процедуры, выводящей на экран первое из двух значений, представленных параметрами, кратное 5, или сообщение, что кратных нет.

  1. //Объявление процедуры

  2. procedure PutMod5(I,J:Integer); // I и J – формальные параметры

  3. begin

  4. if I mod 5 = 0 then

  5. WriteLn(I)

  6. else if J mod 5 = 0 then

  7. WriteLn(J)

  8. else

  9. WriteLn('Нет параметров, кратных 5');

  10. end;

  11. . . . . .

  12. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  13. . . . . .

  14. //Вызов процедуры

  15. PutMod5(A+3, B); // A+3 и B – фактические параметры

  16. . . . . .

  17. end.

Рассмотрим на конкретных значениях переменных AиB, что будет выведено подпрограммой при таком вызове:

при A=2 иB=10 будет выведено значение 5,

при A=3 иB=10 будет выведено значение 10,

при A=3 иB=11 будет выведен текст «Нет параметров, кратных 5».

Список формальных параметров

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

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

В языке Object Pascal рассмотренное функциональное деление параметров (на входные, выходные, входные-выходные) дополнено механизмами реализации их функций, отраженными в правилах объявления формальных параметров. Сначала рассмотрим два вида объявлений параметров: параметры-значения и параметры-переменные.

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

Объявление параметров-значений даётся просто их именем (списком имен через запятую) и типом (без предшествующих слов var,const,out). В рассмотренной процедуре PutMod5 оба параметра являются параметрами-значениями.

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

Объявление параметров-переменных даётся с предшествующим их имени (списку имен) словом varи типом.

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

  1. type tMas=array[1..8] of Real;

  2. . . . . .

  3. //Объявление процедуры

  4. procedure MasMulR(R:Real; N:Integer; var Mas:tMas);

  5. var

  6. i:Integer;

  7. begin

  8. R:=Frac(R);//Получить дробную часть R

  9. for i:=1 to N do

  10. Mas[i]:=Mas[i]*R;

  11. end;//MasMulR – конец текста процедуры

  12. . . . . .

  13. var

  14. X:tMas=(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);

  15. Z:Real=3.4;

  16. . . . . .

  17. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  18. . . . . .

  19. MasMulR(Z,5,X);//Вызов процедуры

  20. . . . . .

  21. end.

В этом примере параметр Mas является и входным, и выходным, поэтому он объявлен как параметр-переменная (с предшествующим словом var). Параметр R является только входным. Так как он объявлен как параметр-значение, то его значение можно, после того, как оно будет использовано как входное данное, менять внутри подпрограммы, то есть использовать как дополнительную переменную, не опасаясь, что изменим значение соответствующего фактического параметра. При указанных в примере начальных значениях переменных после выполнения процедуры переменная Z сохранит своё значение3.4, а в массиве будут следующие данные:(0.4, 0.8, 1.2, 1.6, 2.0, 6.0, 7.0, 8.0).

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

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

Объявление параметров-констант даётся с предшествующим их имени (списку имен) словом constи типом.

Последний вид параметра следует использовать для параметров, представляющих только результаты работы подпрограммы. По аналогии с параметрами других видов ему подошло бы название параметр-результат, или по предшествующему его имени словуout в объявлении –параметр-выходная переменная. Этот параметр передаётся по ссылке, но компилятор не запрещает его использования в качестве источника исходных данных. За этим должен следить программист, а словоoutперед его именем в списке формальных параметров призвано облегчить понимание алгоритма подпрограммы, напоминая, что этот параметр не представляет входных данных.

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

  1. type

  2. tMas=array[1..100,1..100] of Extended;

  3. . . . . .

  4. //Объявление процедуры

  5. procedure SumCol(const X:tMas, out S: Extended; out K:Integer);

  6. var

  7. i,j: Integer;

  8. begin

  9. S:=0;

  10. K:=0;

  11. for i:=1 to 100 do

  12. for j:=1 to 100 do

  13. if X[i,j]>0 then

  14. begin

  15. S:=S+X[i,j];

  16. K:=K+1;

  17. end;

  18. end;

  19. . . . . .

  20. var

  21. Y:tMas; Sum: Extended; Col: Integer;

  22. . . . . .

  23. begin// РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ

  24. . . . . .

  25. SumCol(Y,Sum,Col);

  26. . . . . .

  27. end.

Взглянув на заголовок подпрограммы, сразу можно сказать, что первый параметр является только входным, а два последних – только выходными. Первый параметр объявлен параметром-константой, а не параметром-значением, чтобы избежать выделения памяти в 100000 байт и копирования в неё данных из фактического параметра - массива Y.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]