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

2.2. Процедуры в Паскале

Как всегда при изучении подпрограмм, рассмотрим два вопроса: описание процедур и обращение к ним.

2.2.1.Описание процедур

Описание процедуры состоит из заголовка и блока (тела) процедуры:

Заголовок;

Блок

Заголовок процедуры имеет вид:

procedureИмяПроцедуры[(CписокФормальныхПараметров)]

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

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

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

Изучим структуру списка формальных параметров. Список формальных параметров - это секции формальных параметров, перечисленные через символы ";":

Секция1; Секция2;...;СекцияN

Секция формальных параметров имеет вид:

[VAR] CписокПеременных:Тип;

Указывается стандартный тип или имя нестандартного типа (можно использовать только имя типа, но не его описание!). Имя типа должно быть объявлено во внешнем блоке. В дальнейшем мы увидим, что запрет использования описания типа формального параметра влечет за собой весьма существенные ограничения (см. §2.2.2).

Если перед списком параметров стоит ключевое слово VAR, то эти параметры заменяются на фактические "по ссылке" (в терминах Паскаля такие параметры называютсяпараметрами-переменными).

Если перед списком не стоит VAR, то замена на фактические происходит "по значению" (это параметры-значения).

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

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

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

ИмяПроцедуры[(CписокФактическихПараметров)]

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

Пример.Даны две матрицы:аиз 3-х строк и 5 столбцов иbиз 7 строк и 3 столбцов. Вычислить минимальные значения элементов для каждой строки каждой из этих матриц.

Естественно, вычисление минимальных значений строк произ­вольной матрицы следует оформить как подпрограмму (назовем ее minstr), а затем применить ее два раза к конкретным (фактическим) матрицамаи b. Алгоритм ввода одинаков для матрицаиb, поэтому ввод также оформим как подпрограмму (назовем ееmatrin). Вывод массива результатов будет осуществлять подпрограммаmasout.

Таблица 9. Состав данных программы

Имя

Смысл

Тип

Структура

Исходные данные

а

заданные матрицы

вещественный

двумерный массив размером 7*5

b

Выходные данные

mina

минимальные значения элементов строк матрицы a(b)

вещественный

одномерный массив из 7 элементов

minb

Обратите внимание на размеры массивов в таблице 9. Типы фактических и формальных параметров подпрограмм должны совпадать, поэтому размеры формальных массивов должны подходить и для матрицы а, и для матрицыb. Чтобы удовлетворить этому требованию, используем максимальные размеры, подходящие и дляа, и дляb, т. е. память под массивы отводится с избытком. Тип массивов-параметров процедур (и функций) должен быть объявлен в разделеTypeпрограммы (в нашем примере этоmatr для матриц и masдля одномерных массивов – см. текст программы).

Заметим, что в программе не будет промежуточных переменных. Программа будет состоять из вызовов подпрограмм (крупных операторов), а промежуточные переменные (с точки зрения пользователя детали, мелочи) будут «спрятаны» в подпрограммы.

Поясним, как составлен заголовок подпрограммы minstr.Подпрограмма имеет столько результатов, сколько строк у матрицы, все они равноправны, поэтому нет причины передавать один из них через имя функции, и, следовательно,minstrдолжна быть процедурой (не функцией). В список формальных параметров включаются "входные" данные для процедуры: матрицаа и ее размеры (n- число строк,m- число столбцов), и "выходные" данные:min - массив минимальных значений строк. Заметим, что обозначения, принятые в одной подпрограмме (a, n, m, min)никоим образом не связаны с обозначениями в других подпрограммах и программе, т. е. подпрограммы разрабатываются автономно друг от друга. Переменнаяmin- результат работы функции, поэтому ее надо объявить как параметр-переменную (перед описанием поставить ключевое словоVar). Так как фактическими значениямиnиmбудут константы (для фактической матрицыa, например, 3 и 5),n иmдолжны быть параметрами-значениями (перед их описаниемVarне следует ставить).aлучше объявить как параметр-переменную(так как это массив) с целью экономии памяти.

Получаем заголовок:

procedure minstr(Var a:matr; n,m:integer; Var min:mas).

Промежуточные переменные процедуры (счетчики строк и столбцов iиj) должны быть описаны в разделе переменных блока процедуры.

Рассмотрим заголовок процедуры ввода матрицы matrin(предлагается читателю пояснить самостоятельно, почему это процедура, а не функция). На входеmatrin– размеры матрицыnиmи имя матрицы, которое будет выводиться в приглашении к вводу символьная переменнаяс; эти данные должны быть параметрами-значениями (объясните, почему). На выходе процедуры – введенная матрица, для разнообразия обозначим еер; этообязательнопараметр-переменная. Получили заголовок:

procedure matrin(n,m:integer; c: char;Var p:matr).

Обратите внимание, что отсутствие ключевого слова Varперед описаниемaв этом заголовке приведет к неработоспособности программы, в то время как в заголовке процедурыminstrотсутствиеVar, вообще говоря, допустимо (объясните, почему).

Дальнейшие комментарии к программе приведены в ее тексте.

Блок-схема программы приведена на рис. 13, блоки вызова подпрограмм имеют двойные линии по боковым сторонам. Блок-схема процедуры minmatr приведена на рис. 14.

program primer2_2;

Type matr=array[1..7,1..5] of real; mas= array[1..7] of real;

Var a,b:matr; mina,minb:mas; {далее-раздел процедур и функций}

Procedure minstr(Var a:matr; n,m:integer; Var min:mas);

Var i,j:integer;

Begin

for i:=1 to n do

begin

min[i]:=a[i,1];

for j:=2 to m do

if min[i]>a[i,j] then

min[i]:=a[i,j];

end

End{minstr};

Procedure matrin(n,m:integer; c:char; Var p:matr);

Var i,j:integer;

Begin

Writeln('Введите матрицу ',c,' размером ',n,'*',m);

for i:=1 to n do

for j:=1 to m do

read(p[i,j]);

readln;

End{matrin};

Procedure masout(n:integer;c:char;Var min:mas);

Var i:integer;

Begin

Writeln('Минимальные значения строк матрицы ',c);

for i:=1 to n do

writeln(' ',min[i]);

End{masout};

Begin {начинается раздел действий программы}

matrin(3,5,'a',a);

matrin(7,3,'b',b);

minstr( a,3,5,mina);

minstr( b,7,3,minb);

masout(3,'a', mina);

masout(7,'b', minb);

readln

End.