Список параметров содержит так называемые формальные параметры, отделяемые друг от друга точкой с запятой. Список формальных параметров заключается в круглые скобки. Квадратные скобки здесь показывают, что параметры процедуры могут отсутствовать ( в этом случае говорят, что «процедура без параметров»). Каждый из формальных параметров - это произвольная переменная с указанием после двоеточия ее типа. Все формальные параметры процедур можно разделить на две группы:
1)к первой группе относятся формальные параметры, значения которых только вводятся при обращении к процедуре из основной программы, то есть они используются как входные переменные;- в заголовке процедуры они описываются как переменные имя:тип;
2)ко второй группе относятся формальные параметры, значения которыхмогут как вводиться, так и выводиться из процедуры, то есть передаваться основной программе, так как они являются результатом работы процедуры.Такие формальные параметры в заголовке процедуры записываются, начиная со слова Var. Это указывает на то, что их значения при обращении к процедуре обязательно передаются основной программе.
Например, в заголовке процедуры proc1
Procedureproc1(b,k:integer;x:real;Vars1,s2:real);
переменные b,k,x – только входные; переменные s1,s2 – могут быть и входными, но также являются и выходными, то есть в них записываются те результаты выполнения процедуры , которые передаются основной программе, вызывающей эту процедуру.
Примечание! Обращение к процедуре из основной программы по имени выполняется с обязательным заданием фактических значений всем входным формальным параметрам, при этом типы и порядок фактических значений должны совпадать с типами и порядком перечисленния формальных параметров в заголовке процедуры при ее объявлении. Так, для обращения к процедуре proc1значения переменных должны быть вычислены или заданы, например,
Proc1(5,17,25.3, R1,R2); - означает, что переменными b,k,x присваиваются соответственно числа 5, 17, 25.3, а результаты выполнения процедуры присваиваются переменным R1,R2, которые должны быть объявлены в основной программе и поэтому называются глобальными.
Пример 11. В программе вводятся N вещественных чисел и каждое число возводится во вторую и в четвертую степень. Результаты выдаются на монитор. Исходные числа и результаты расчета представим в виде одномерных массивов. В программе предусмотрим создание процедуры vect_kv формирования вектора (одномерного массива) квадратов чисел. Эту процедуру объявим в основной программе. В целом программа будет выглядеть так:
Program main_1;
Type T=array[1..20] of real;
Var {Раздел объявления переменных основной программы: объявляются глобальные переменные i, j, k, mas_ish, mas_rez2, mas_rez4 и процедура vect_kv:}
i,j,k:integer;
mas_ish, mas_rez2, mas_rez4:array[1..20] of real;
procedure vect_kv(n,:integer; A:T; Var B:T);
{Здесь n,A – должны задаваться из вызывающей программы при обращении к процедуре, В – передаваться в вызывающую программу как результат работы процедуры, поэтому формальный параметр В предваряется словом Var}
{Объявление локальных переменных процедуры:}
var i:integer; {Это не ошибка, а коллизия обозначений: здесь i – локальная переменная, область действия которой ограничивается только телом процедуры. При выходе из процедуры ее значение становится неопределенным. Совпадение имени локальной переменной i с именем глобальной переменной i, объявленной в основной программе, только по форме, но в принципе это разные переменные. В случае совпадения имен глобальной и локальной переменной при вхождении программы в процедуру действие такой глобальной переменной приостанавливается, а при выходе из процедуры ее значение восстанавливается. Для устранения недоразумений рекомендуется задавать не совпадающие имена локальных и глобальных переменных }
{Раздел операторов процедуры, то есть тело процедуры:}
Begin
for i:=1 to n do B[i]:=sqr(A[i]);
end;
begin {Начало операторной части основной программы}
write(‘Задайте количество элементов исходного массива K=’);
read(k);
writeln(‘введите элементы массива’);
for j:=1 to k do
begin write(‘Элемент ’, j,’-й: ’); read(mas_ish[j])
end;
{Вызов процедуры для формирования массива квадратов исходных чисел::}
vect_kv(k, mas_ish, mas_rez2);
{Вызов процедуры для формирования массива чисел
в четвертой степени:}
vect_kv(k, mas_rez2, mas_rez4);
{Печать результатов:}
writeln(‘Массив квадратов исходных чисел:’);
for j:=1 to k do write(‘Элемент ’, j,’-й: ’,mas_rez2[j],’ ‘);
writeln;
writeln(‘Массив исходных чисел в четвертой степени:’);
for j:=1 to k do write(‘Элемент ’, j,’-й: ’,mas_rez4[j],’ ‘)
writeln;
writeln (‘Для выхода из программы нажать клавишу Enter’);
readln
end.
Ниже в примерах 12 и 13 приводятся описания процедур выдачи на экран ПК одномерного массива (вектора) и двумерного массива (матрицы), которые можно рассматривать как типовые при обработке произвольных векторов и матриц, размеры которых позволяют располагать их в пределах размеров экрана ПК.
Пример 12. Процедура RowPrint выдает на экран ПК в строку M элементов одномерного массива вещественных чисел (при печати числа представляются в форме с фиксированной точкой, для которой в данной процедуре предусмотрен форматный вывод: для каждого числа – всего 8 позиций, при этом 3 позиции – для дробной части) {Тип массива А должен быть объявлен в вызывающей программе Type TA=array[1..30] of real;}:
procedure RowPrint(M:integer; A:TA);
var i:integer; {i – локальная переменная}
Begin
for i:=1 to N do write(A[i]:8:3)
end;
Пример 13.Процедура RwColPrnt выдает на экран ПК элементы матрицы вещественных чисел в виде таблицы – N строк, M столбцов(формат выдачи на печать тот же, что и в предыдущем примере, тип массива ТТА объявлен заранее, в вызывающей программе в виде Type TTA=array[1..20,1..10] of real):
procedure RwColPrnt(N,M:integer; A:TTA);
var i,j:integer;{i,j – локальные переменные}
Begin
for i:=1 to N do{цикл по строкам}
Begin
for j:=1 to M do write(A[i,j]:8:3);{цикл по элементам строки}
writeln{перевод курсора на следующую строку}
End
end;
Замечание. В частности, процедура может не иметь параметров. Например, стандартные процедуры Readln, Writeln, Clrscr или следующая подпрограмма, оформленная в виде процедуры, выдающая на монитор все символы, представляемые в ПК кодами от 0 до 255:
Procedure cod_char;
Var i:byte;
Begin
for i:=1 to 255 do write(i:4,’ :‘,chr(i):2); writeln;
readln
End;
В основной программе эта процедура вызывается на выполнение следующим образом Cod_Char; и результатом ее выполнения будет строка из 255 пар “КОД : СИМВОЛ”.
Пример 14. В этом примере рассматривается применение двух процедур при решении следующей задачи: вычислить частичные суммы гармонического ряда
R (n) = 1 + 1/2 + 1/3 + ... + 1/n
и результат представить в форме рационального числа А/B, то есть в виде отношения числитель/знаменатель, где числитель и знаменатель – целые числа.
В программе предусмотрены две процедуры:
Proc1 – сокращает дробь на наибльший общий делитель;
Proc2 – находит сумму двух дробей с приведением к общему знаменателю.
program Harm_row;
var an,bn,bk,i:integer;
{Объявление и описание проседуры proc1:}
procedure proc1(var a,b:integer);{процедура реализут известный алгоритм поиска наибольшего общего делителя: }
var a1,b1,r:integer;
begin{начало операторной части процедуры}
a1:=a;b1:=b;
while b1<>0 do
begin r:=a1 mod b1;{находится остаток от деления на цело
числителя a1 на знаменатель b1}
a1:=b1;b1:=r{производится замена: знаменатель
становится числителем, остаток - знаменателем}
end;
if a1>1 then
begin a:=a div a1;b:=b div a1{числитель и знаменатель дроби
{В данном варианте процедуры proc2 формальные переменные
a1,a2,b1,b2 – входные, a,b – выходные: }
begin a:=a1*b2+a2*b1;b:=b1*b2
end;{конец процедуры proc2 - вариант 1 }
{Второй вариант процедуры proc2 отличается меньшим числом формальных параметров: параметры a1, b1 становятся и выходными, а параметры a2,b2 – только входные:}
begin a1:=a1*b2+a2*b1;b1:=b1*b2; {Для проверки корректности хода вычислений часто бывает полезно выдавать на экран ПК значения промежуточных расчетов. Здесь, например, это можно сделать применением процедуры контрольной печати дроби, получающейся прикаждом обращении к процедуре proc2: writeln('контр. печать проц2: ',a1:2,'/',b2:2);}
end; {proc2 – вариант второй}
begin {главная программа Harm_row}
an:=1;bn:=1;{Числитель и знаменатель первого элемента равны 1}
writeln('Задай номер последнего элемента ряда: ');
readln(bk);writeln('Результаты вычисления суммы по шагам:');
for i:=2 to bk do
begin proc2(an,bn,1,i); {выбран второй вариант процедуры proc2}