IPB

> Лекция №3.2: Ветвления. Массивы. Циклы
Чат
Форум
Загрузка...
 

страницы: 1 2 3

Содержание

Массивы

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

Описание массива

Для того, чтобы задать массив, необходимо в разделе описания переменных (var) указать его размеры и тип его компонент.

Общий вид описания (одномерного) массива:

array[<тип_индексов>]1 of <тип_компонент>;

Чаще всего это трактуется так:

array[<левая_граница> .. <правая_граница>] of <тип_компонент>;

Например, одномерный (линейный) массив, состоящий не более, чем из 10 целых чисел, можно описать следующим образом:

var a1 : array [1 .. 10] of Integer;
Нумерация

Нумерация компонент массива не обязана начинаться с 1 или с 0 — вы можете описывать массив, пронумерованный любыми целыми числами. Необходимо лишь, чтобы номер последней компоненты был больше, чем номер первой:

var a1 : array [-5 .. 4] of Integer;

Собственно говоря, нумеровать компоненты массива можно не только целыми числами. Любой порядковый тип данных (перечислимый, интервальный, символьный, логический, а также произвольный тип, созданный на их основе) имеет право выступать в роли нумератора. Таким образом, допустимы следующие описания массивов:

type Char2 = 'a', 'c' .. 'z';    { отсутствует символ «b» }

var a1 : array [Char] of Integer;  { 256 компонент }
    a2 : array [Char2] of Integer; { 25 целых компонент }
    a3 : array [ShortInt] of Real; { 256 вещественных компонент }

Общий размер массива не должен превосходить 65 520 байт. Следовательно, попытка задать массив a4 : array[Integer] of Byte; не увенчается успехом, поскольку тип Integer покрывает 65 536 различных элементов. А про тип LongInt в данном случае лучше и вовсе не вспоминать.

Тип компонент массива может быть любым:

var a4 : array[10 .. 20] of Real; — массив из компонент простого типа

a5 : array[0 .. 100] of Record1; — массив из записей2

a6 : array[-10 .. 10] of ^String; — массив из указателей3 на строки

a7 : array[-1 .. 1] of Text; — массив из файловых переменных4

a8 : array[1 .. 100] of array[1 .. 100] of Char; — двумерный массив (массив векторов)

Для краткости и удобства многомерные массивы можно описывать и более простым способом:

var a9 : array[1 .. 10, 1 .. 20] of Real; — двумерный массив 10 х 20

a10 : array[Boolean, -1 .. 1, Char, -10 .. 10] of Word; — четырёхмерный массив 2 х 3 х 256 х 21

Общее ограничение на размер массива — не более 65 520 байт — сохраняется и для многомерных массивов. Количество компонент многомерного массива вычисляется как произведение всех его «измерений». Таким образом, в массиве а9 содержится 200 компонент, а в массиве а10 — 32 256 компонент.

Описание переменных размерностей

Если ваша программа должна обрабатывать матрицы5 переменных размерностей (скажем, N по горизонтали и М по вертикали), то вы столкнётесь с проблемой изначального задания массива, ведь в разделе type не допускается использование переменных. Следовательно, самый логичный, казалось бы, вариант

var m, n : Integer;
    a : array[1 .. m, 1 .. n] of Real;

придётся отбросить.

Если на этапе написания программы ничего нельзя сказать о предполагаемом размере входных данных, то не остаётся ничего другого, как воспользоваться техникой динамически распределяемой памяти (см. лекцию 10).

Предположим, однако, что вам известны максимальные границы, в которые могут попасть индексы обрабатываемого массива. Скажем, N и М заведомо не могут превосходить 100. Тогда можно выделить место под наибольший возможный массив, а реально работать только с малой его частью:

const nmax = 100;
var a : array[1 .. nmax, 1 .. nmax] of Real;
    m, n : Integer;

Обращение к компонентам массива

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

Доступ к компонентам линейного массива осуществляется так6:

<имя_массива>[<индекс_компоненты>]

а многомерного — так:

<имя_массива>[<индекс>, ... ,<индекс>]

Правила употребления индексов при обращении к компонентам массива таковы:

  1. Индекс компоненты может быть константой, переменной или выражением, куда входят операции и вызовы функций.
  2. Тип каждого индекса должен быть совместим с типом, объявленным в описании массива именно для соответствующего «измерения»; менять индексы местами нельзя.
  3. Количество индексов не должно превышать количество «измерений» массива. Попытка обратиться к линейному массиву как к многомерному обязательно вызовет ошибку. А вот обратная ситуация вполне возможна: например, если вы описали N-мерный массив, то его можно воспринимать как линейный массив, состоящий из (N-1)–мерных массивов.

Примеры использования компонент массива:

a2['z'] := a2['z'] + 1;
a3[-10] := 2.5;
a3[i + j] := a9[i, j];
a10[x > 0, Sgn(x), '!', Abs(k * 5)] := 0;

Задание массива константой

Для того чтобы не вводить массивы вручную во время отладки программы (особенно, если они имеют большую размерность), можно пользоваться не только файлами7. Существует и более простой способ, когда входные данные задаются прямо в тексте программы при помощи типизированных констант.

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

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

Исключение составляют только массивы, компонентами которых являются величины типа Char. Такие массивы можно задавать проще: строкой8 символов.

Примеры задания массивов типизированными константами:

type mass = array[1 .. 3, 1 .. 2] of Byte;

const a : array[-1 .. 1] of Byte = (0, 0, 0); {линейный}

b : mass = ((1, 2), (3, 4), (5, 6)); {двумерный}

s: array[0 .. 9] of Char = '0123456789';

Замечание: Невозможно задать неименованную или нетипизированную константу, относящуюся к типу данных array.

страницы: 1 2 3

Примечания

  1. ^ Напоминаем, что квадратная скобка является обязательным элементом синтаксиса.
  2. ^ См. лекцию 7.
  3. ^ См. лекцию 10.
  4. ^ См. лекцию 6.
  5. ^ Матрица — двумерная таблица, состоящая из чисел.
  6. ^ Квадратные скобки являются обязательным элементом синтаксиса.
  7. ^ См. лекцию 6
  8. ^ См. лекцию 5.
 
 К началу страницы 
 

Код для вставки: :: :: :: ГОСТ ::
Поделиться: //
 



-
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"