Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Открытые массивы

Алгоритм табулирования | Алгоритм организации счетчика | Алгоритмы накопления суммы и произведения | Типовые алгоритмы поиска максимума и минимума | Решение учебных задач на циклы | Одномерные массивы. Описание, ввод, вывод и обработка массивов на Паскале | Решение типовых задач на массивы | Двойной цикл и типовые задачи на двойной цикл | Оператор безусловного перехода | Матрицы и типовые алгоритмы обработки матриц |


Читайте также:
  1. V) Массивы и функции
  2. Автоматизация поиска информации. Категория «Ссылки и массивы».
  3. Двумерные массивы
  4. Динамические массивы
  5. Дисковые массивы RAID
  6. Какие бывают массивы
  7. Лекция 6: массивы и строки, библиотечные функции ввода-вывода.

 

Недостатки изученного ранее способа передачи массивов-параметров очевидны: во-первых, необходимость описания типа данных массива оператором type нарушает правило переносимости подпрограмм (действие подпрограммы становится зависимым от внешнего оператора), во-вторых, для указания реальной размерности передаваемых в подпрограмму массивов приходится использовать дополнительные параметры-значения, в-третьих, при обработке массивов меньшей, чем указано в операторе type размерности, неэффективно теряется оперативная память. В какой то мере исправить эти недостатки позволяет использование открытых массивов.

Способ подходит только для одномерных массивов. Использовать его с матрицами возможно, если интерпретировать матрицу как вектор (см. гл. 17).

Имеющиеся в программе векторы описываются в разделе var обычным способом, без определения типа type. В списке формальных параметров подпрограммы параметр-вектор указывается без диапазона размерности:

function sum(var x: array of real): real;

При вызове подпрограммы фактический параметр-массив подставляется на место формального:

var a:array [1..5] of real;

s:real;

...

s:=sum(a);

Открытым остается вопрос -- как отслеживать из подпрограммы размерность переданного массива? Для этого в Паскале существуют стандартные функции Low и High. Их единственным параметром передается идентификатор массива, Low возвращает самое низкое допустимое значение индекса, а High -- самое высокое. Если A -- одномерный массив, величины Low(A) и High(A) можно непосредственно применять как границы цикла for:

function sum(var x: array of real): real;

var i:word; s:real;

begin

s:=0;

for i:=Low(x) To High(x) Do s:=s+x[I];

sum:=s;

end;

Чтобы завершить пример, вызовем написанную функцию sum:

const a:array [1..5] of real=(1,2,3,4,5.5);

begin

writeln (sum(a):6:1);

end.

Как правило, номер первого элемента открытого массива равен нулю, однако, надежнее все-таки указывать Low. Приведем пример программы, включающей подпрограмму с открытыми массивами в качестве параметров.

Найти количество элементов вектора x[7], попадающих в интервал [0, 3] и количество элементов вектора y[5], попадающих в интервал [-1, 1].

Для ввода элементов массива с клавиатуры напишем процедуру Input, которой все-таки придется передавать размерность массива-параметра (ведь вводятся два вектора различной размерности). Поэтому в Input использован тот факт, что нумерация элементов открытого массива по умолчанию выполняется в нуля. Функции kol, вычисляющей количество элементов открытого массива, попадающих в интервал [x1,x2], достаточно стандартного указания Low и High:

var x:array [1..7] of real;

y:array [1..5] of real;

k1,k2,i:integer;

 

procedure Input (n:integer;

var a:array of real);

var i:integer;

begin

writeln ('Enter ',n,' items of array:');

for i:=0 to n-1 do read (a[i]);

end;

 

function Kol (var a:array of real;

x1,x2:real):integer;

var i,k:integer;

begin

k:=0;

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

if (a[i]>=x1) and (a[i]<=x2) then k:=k+1;

Kol:=k;

end;

 

begin

Input (7,x);

Input (5,y);

k1:=Kol(x,0,3);

k2:=Kol(y,-1,1);

writeln ('k1=',k1,' k2=',k2);

end.

Процедура Input могла бы быть реализована и без передачи фактической размерности отдельным параметром:

procedure Input (var a:array of real);

var i:integer;

begin

writeln ('Enter ',High(a)-Low(a)+1,

' items of array:');

for i:=Low(a) to High(a) do read (a[i]);

end;

{... }

Input (x);

Input (y);


 


Дата добавления: 2015-11-16; просмотров: 50 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Массивы в качестве параметров подпрограммы| Множества и перечислимые типы

mybiblioteka.su - 2015-2024 год. (0.007 сек.)