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

В части II приводились примеры подпрограмм с параметрами-массивами. Тип массивов объявлялся до описания подпрограмм в разделе типов, причем размеры выбирались по максимальной длине фактических массивов, используемых в данной задаче. Такой подход, несомненно, имеет два недостатка: во-первых, теряется универсальность подпрограммы, а, во-вторых, память по фактические массивы объявляется с избытком.

В рассматриваемых версиях Паскаля допускается в списке формальных параметров использовать конструкцию Array of тип без указания границ массивов. Такие массивы называютсяоткрытыми. Соответствующим фактическим параметром может быть как динамический, так и статический массив произвольного размера.

Открытые массивы могут быть только одномерными, но их компоненты могут иметь сложный тип. Нумеруются элементы открытых массивов начиная с нуля. При работе с открытыми массивами, наряду с функциями High, Low, Length,может быть полезна функцияSlice(массив, количество_элементов), возвращающая начальную часть массива.

Пример 1.Приведенная программа вычисляет максимальные значения элементов двух одномерных массивов. Подпрограммы ввода и обработки используют открытые массивы.

program Project1;

Var A:Array[1..5] of real; B:Array[1..8] of real;

Procedure masin( c:char; Var A:array of real);

Var i:integer;

begin

writeln('input vector',c,' size of ',Length(A));

for i:=Low(A) to High(a)do

read(A[i]); readln;

end{masin};

Function max( Var A:array of real):real;

Var i:integer;mx:real;

begin

mx:=a[Low(A)];

for i:=Low(A)+1 to High(A) do

if mx<A[i]then

mx:=A[i];

max:=mx

end{max};

begin

masin('A',A); masin('B',B);

writeln('maxa=',max(A),' maxb=',max(b)); readln

end.

Пример 2.В отличие от примера 1, приведенная программа позволяет обрабатывать не все элементы массивов (в соответствии с описанием), а только совокупность первых элементов массивов, число которых задается вводом. Эта возможность обеспечивается применением функции Slice.

program Project2;

Var A:Array[1..10] of real; B:Array[1..10] of real; nA,nB:integer;

Procedure masin( c:char; Var A:array of real);

Var i:integer;

begin

writeln('input vector',c,' size of ',Length(A));

for i:=Low(A) to High(a)do

read(A[i]);

readln;

end{masin};

Function max( Var A:array of real):real;

Var i:integer;mx:real;

begin

mx:=a[0];

for i:=Low(A)+1 to High(A) do

if mx<A[i]then

mx:=A[i];

max:=mx

end{max};

begin

writeln('Input number of components of array A');

readln(nA);

masin('A',Slice(A,nA));

writeln('Input number of components of array B');

readln(nB);

masin('B',Slice(B,nB));

writeln('maxa=',max(Slice(A,nA)),' maxb=',max(Slice(B,nB)));

readln

end.

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

program Project3;

Type str=array of real;{тип строки матрицы – динамический массив}

Var nA,mA,nB,mb:integer; A,B:array of str;

Function Sum(n,m:integer; Var a:array of str):real;

Var s:real; i,j:integer;

Begin

s:=0;

for i:=0 to n-1 do

for j:=0 to m-1 do

s:=s+a[i][j];

sum:=s

End {Sum};

Procedure InMatr(n,m:integer; c:char;Var A:array of str);

Var i,j:integer;

Begin

writeln('input matrix ', c, ' size of ', n, '*', m);

for i:=0 to n-1 do

begin

SetLength(a[i],m);

for j:=0 to m-1 do

read(a[i][j]);

end; readln;

End;

begin

writeln ('Input sizes of matrix A'); readln (nA,mA);

SetLength(A,nA);

InMatr(nA,mA,'A',A);

writeln ('Input sizes of matrix B'); readln (nB,mB);

SetLength(B,nB);

InMatr(nB,mB,'B',B);

writeln('sumA=',Sum(nA,mA,A):6:1,' sumB=',Sum(nB,mB,B):6:1); readln;

end.