Формальные параметры-массивы без указания границ 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Формальные параметры-массивы без указания границ



В части 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.

Приложение 1. Краткая инструкция по работе в среде
Turbo (Borland) Pascal.

· Вызов среды: bp (turbo) (или указать полное имя файла bp.exe (turbo.exe)); директория, из которой вызвали среду, будет считаться текущей, т. е. из нее будут браться (по умолчанию) и в ней сохраняться программы.

· Изменение текущей директории: гл.меню/FILE/Change Dir.

·
Переход в главное (File Edit… - см. рис. 17) меню – функциональная клавиша F10 (или мышью).

· Создание нового файла: главное меню/FILE/NEW; после этого в окне среды можно набирать текст новой программы.

· Сохранение файла: гл.меню/FILE/SAVE или SAVE AS (под другим именем)

· Открытие ранее созданного файла: главное меню/FILE/OPEN

· Трансляция программы: Compile/Compile

Запуск программы на выполнение: Главное меню/RUN/RUN

Просмотр результатов: ALT-F5

Переход в окно с нужным номером: ALT-№окна или с помощью пункта главное меню/ WINDOW или мышью.

Просмотр каталога:File/Open, в качестве имени файла ввести имя_каталога\*.*

Отладка программы:

Организации трассировки программы:

F8 - без захода в процедуры;

F7 - с заходом в процедуры;

F4 – запустить программу до места, указанного курсором.

Просмотр значений переменных в ходе трассировки: Ctrl-F4 или Ctrl-F7.

Работа с точками прерывания: главное меню/DEBUG.

Выход из среды: File/EXIt или Alt-X.

Внимание! Путь к файлам модулей должен быть указан в пункте меню OPTIONS/DIRECTORIES/UNIT DIRECTORIES

 



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 189; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.126.74 (0.006 с.)