Массивы в языке Паскаль

Материал из ПИЭ.Wiki

Перейти к: навигация, поиск

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

Содержание

Объявление переменных массивового типа

Переменная массивового типа описывается в разделе описания переменных в следующей форме:

var
  <идентификатор>: array[<тип индекса>] of <тип компонент>

Чаще всего в качестве типа индекса употребляется интервальный тип. Например, одномерный массив среднемесячных температур опишется так:

var
  T: array[1..12] of real;

Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе. Последовательные элементы массива располагаются в последовательных ячейках памяти (T[1], T[2] и т.д.), причем значения индекса не должны выходить из диапазона 1...12. В качестве индекса может употребляться любое выражение соответствующего типа. Например:

T[i+j], T[m div 2]

Тип индекса может быть любым скалярным порядковым типом, кроме integer (в реализации Turbo Pascal). Например, в программе могут присутствовать следующие описания:

var
  Cod: array[Char] of 1..100;
  L: array[Boolean] of Char;

В такой программе допустимы следующие обозначения элементов массивов:

cod['x']; L[true]; cod[chr(65)]; L[a>0];

В некоторых случаях бывает удобно в качестве индекса использовать перечисляемый тип. Например, данные о количестве учеников в четырех десятых классах одной школы могут храниться в следующем массиве:

Type
  Index=(А, В, С, D);
Var
  Class_10: array[Index] of byte;

И если, например, элемент Class_10[A] равен 35, то это означает, что в 10 «А» классе 35 человек. Такое индексирование улучшает наглядность программы.

Часто структурированному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.

type
  Mas1 = array[1..100] of integer;
  Mas2 = array[-10..10] of char;
var
  Num: Mas1;
  Sim: Mas2;

Многомерные массивы

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

var
  H: array[1981..1990] of array[1..12] of real;

Вот примеры обозначения некоторых элементов этого массива:

Н[1981][1]; Н[1985][10]; Н[1990][12];

Однако чаще употребляется другая, эквивалентная форма обозначения элементов двумерного массива:

Н[1981,1]; Н[1985,10]; Н[1990,12];

Переменная Н[1981] обозначает всю первую строку таблицы, т.е. весь массив температур за 1981 г. Другим вариантом, эквивалентным приведенному выше описанию, является следующий:

type
  Month = array[1..12] of real;
  Year = array[1981..1990] of Month;
var
  H: Year;

Наиболее краткий вариант описания данного массива такой:

var
  H: array[1981..1990, 1..12] of real;

Трехмерный массив можно определить как одномерный массив, у которого элементами являются двумерные массивы. Вот пример описания трехмерного массива:

var
  A: array[1..10, 1..20, 1..30] of integer;

Это массив, состоящий из 10x20x30 = 6000 целых чисел и занимающий в памяти 6000x2 = 12000 байт. В Паскале нет ограничения сверху на размерность массива. Однако в каждой конкретной реализации Паскаля ограничивается объем памяти, выделяемый под массивы.

По аналогии с математикой одномерные числовые массивы часто называют векторами, а двумерные — матрицами. Размер массивов не может быть изменен в процессе выполнения. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:

сonst
  Imax=10;
  Jmax=20;
var
  Mas: array[1..Imax, 1..Jmax] of integer;

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

Операции над массивами

Действия над массивом как единым целым. Такие действия допустимы лишь в двух случаях:

В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов). Пример:

var
  P, Q: Array[1..5, 1..10] Of Real;

При выполнении операции присваивания P := Q все элементы массива P станут равны соответствующим элементам массива Q.

В многомерных массивах переменная с индексом может обозначать целый массив. Например, если в таблице H требуется, чтобы данные за 1989 г. были такими же, как за 1981 г. (девятой строке присвоить значение первой строки), то это можно делать так:

Н[1989] := Н[1981];

А если нужно поменять местами значения этих строк, то это делается через третью переменную того же типа:

Р := Н[1989];
Н[1989] := Н[1981];
Н[1981] := Р;

где P описана так:

var
  P: Array[1..12] Of Real;

Обработка массивов

Обработка массивов в программах производится покомпонентно. Вот примеры ввода значений в массивы:

for I := 1 to 12 do
  readln(T[I]);
for I := 1 to IMax do
  for J := 1 to JMax do
    readln(Mas[I,J]);

Здесь каждое следующее значение будет вводиться с новой строки. Для построчного ввода используется оператор read. Аналогично в цикле по индексной переменной организуется вывод значений массива. Например:

for I := 1 tо 12 do
  write(T[I]:8:4);

Следующий фрагмент программы организует построчный вывод матрицы на экран:

for I := 1 to IMax do
begin
  for J := l to JMax do
    write(Mas[I, J]:6);
  writeln;
end;

После печати очередной строки матрицы оператор writeln без параметров переведет курсор в начало новой строки. Следует заметить, что в последнем примере матрица на экране будет получена в естественной форме прямоугольной таблицы, если JMax не превышает 12.

Динамические массивы

Во FreePascal, Delphi добавлена интересная возможность описания массивов без указания размерностей и, соответственно, пределов изменения индексов:

var 
  IntArray: array of integer;

Такие массивы являются динамическими и изначально имеют нулевую длину. Установка размера массива и определение его во время выполнения программы производится так же как и для строк, с помощью функций SetLength и Length, соответственно. Элементы в данном случае нумеруются от нуля.

program UsingDynamicArrays1;
var
  А, В: Array of Integer;    {Описание двух переменных — динамических
                             массивов целочисленных элементов}
begin
  SetLength(A, 5);            {Установка размера массива А
                              (5 элементов) }
  А[0] := 1;                  {Присвоение значения 1 элементу
                              массива А с номером 0 }
end.

Переменные-динамические массивы являются указателями и операции с ними производятся как с указателями. Например, при присвоении одного массива другому элементы одного массива не копируются во второй, а копируется адрес массива. Соответственно, сравнение двух массивов в логических выражениях типа «равно — не равно» производится сравнением адресов. Пример присвоения одного массива другому:

program UsingDynamicArrays2;
var
  А, В: array of integer;
                             {Описание двух переменных —
                             динамических массивов целочисленных
                             элементов}
begin
  SetLength(A, 5);       { Установка размера массива А
                         (5 элементов ) }
  А[0] := 14;            {Присвоение значения 14 нулевому
                         элементу массива А}
  В := А;                {Присвоение массива А массиву В, теперь
                         переменные А и В указывают на один и
                         тот же массив}
  В[0] := 2;             {Присвоение нулевому элементу массива В
                         значения 2, теперь нулевой элемент
                         массива А также имеет значение 2}
end.

Отметим существенное отличие в работе со строками и динамическими массивами, имеющими одинаковое внутреннее представление на основе указателей, но разные методы работы. Две разные строки, состоящие из одинакового набора символов, считаются равными, а два разных массива, содержащие одинаковые элементы, не равны.

Просмотры
Инструменты

Besucherzahler russian mail order brides
счетчик посещений
Rambler's Top100
Лингафонные кабинеты  Интерактивные доски  Интерактивная приставка Mimio Teach