Массивы в языке Pascal. Одномерные массивы
Обновлено: 04.03.2026
Переменные стандартных типов можно изобразить отдельными маленькими ячейками.

В таких ячейках могут содержаться любые значения из диапазона, определяемого типом переменной. Например, в ячейке, связанной с переменной, у которой тип integer, может храниться любое целое число в диапазоне примерно от -32000 до 32000.
Однако в Паскале и многих других языках программирования можно объявлять переменные, которые являются массивами таких однотипных ячеек. Массив представляет собой последовательность ячеек памяти, в которых хранятся однотипные данные. При этом существует всего одно имя переменной связанной с массивом, а обращение к конкретной ячейке происходит по ее номеру в массиве.

Спрашивается, зачем это надо? Представьте, что программа работает с большим количеством однотипных данных. Скажем, около ста разных целых чисел нужно обработать, выполнив над ними те или иные вычисления. Как вы себе представляете 100 переменных в программе? И для каждой переменной нужно написать одно и то же выражение вычисления значения? Это очень неэффективно. Использование такого типа данных как массив решает эту проблему.
Ячейки массива можно назвать элементами. У каждого элемента есть индекс и значение. Индекс — это порядковый номер элемента в массиве. Он есть у элементов, потому что они упорядочены в массиве, то есть расположены друг за другом. Значение элемента — это данные, которые находятся в его ячейке, то есть то, чем заполнена ячейка.
У одного и того же массива во всех ячейках могут лежать данные, которые принадлежат только одному типу, например real. Поэтому вводят такое понятие как базовый тип массива — это тип элементов, из которых составлен массив. То есть есть "массив" как сложный тип данных, но при определении переменной такого типа мы обязаны указывать тип элементов, из которых состоит массив, то есть задавать базовый тип.
Теперь посмотрим на примере, как в Паскале можно определить массив, заполнить его ячейки своими данными, а потом извлекать из массива значения.
var n: array[1..5] of Byte; begin writeln(n[1], ' ', n[2], ' ', n[3], ' ', n[4], ' ', n[5]); n[1] := 33; n[3] := 178; writeln(n[1], ' ', n[2], ' ', n[3], ' ', n[4], ' ', n[5]); end.
Выражение n[1] и подобные ему без последующего присваивания — это команда на то, чтобы узнать, какое значение хранится в ячейке массива под указанным в квадратных скобках индексом. Если же такое выражение (имя массива с числом в квадратных скобках) используется как переменная, которой присваивается значение, то значит в заданную в скобках ячейку записывается новое значение. Старое при этом теряется. Если мы посмотрим на результат выполнения программы, то увидим следующее:
0 0 0 0 0 33 0 178 0 0
Из такого вывода можем заключить, что во Free Pascal не инициированный (то есть еще нами не заполненный) массив содержит нули. Так обстоит дело не во всех языках программирования. В ряде других неинициированные ячейки содержат так называемый "мусор" — данные, которые были в памяти до этого.
Записывать данные в массив можно не только явным присваиванием. Процедуры и функции могут принимать в качестве фактических параметров массив или его элементы и выполнять заполнение в процессе своего выполнения.
var a: array[1..4] of Char; begin read(a[1], a[2], a[3], a[4]); writeln('Третий символ: ', a[3]); end.
Здесь при выполнении процедуры read происходит присваивание элементам массива. Если ввести символы "qwer", то программа сообщит, что третьим является "e".
Однако такое использование элементов массива в качестве обычных переменных не дает никакой выгоды. Массивы ценны тем, что индексы могут быть переменными или выражениями, с помощью которых выполняется последовательный доступ ко всем элементам массива. Такое последовательное обращение обычно выполняется с помощью циклов.
var f: array[1..10] of Real; i: Byte; begin for i:=1 to 10 do begin f[i] := 0.1; write(f[i]:5:1); end; writeln; for i:=1 to 10 do begin f[i] := f[i] + random(); write(f[i]:5:2); end; writeln; end.
В примере переменная i играет роль не только счетчика цикла, но и меняющихся индексов. В первом цикле всем элементам присваивается одно и то же значение. Во втором цикле к имеющемуся значению, находящемуся в ячейке под номером i, добавляется случайное число. После этого полученная сумма помещается в эту же ячейку массива, перезаписывая тем самым старое значение. Если выполнить программу, то на экран будет выведено примерно следующее:
0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.65 0.69 0.82 0.94 0.70 0.96 0.64 0.95 0.52 0.72
В программе выше массив состоит из десяти элементов, и мы упоминаем это число три раза: при определении переменной и в заголовках циклов. Теперь представьте, что код программы куда длиннее, и мы решили поменять размерность массива. Нам придется просмотреть весь код и исправить обозначающее количество элементов число 10 на другое. Это не только утомительно, но и чревато ошибками.
Поэтому, когда в программе определяются массивы, часто также используются константы. С их помощью задают индекс последнего элемента массива, он же показывает размерность массива, если первый индекс равен единице. С константой наш код будет выглядеть так:
const N = 10; var f: array[1..N] of Real; i: Byte; begin for i:=1 to N do begin f[i] := 0.1; write(f[i]:5:1); end; writeln; for i:=1 to N do begin f[i] := f[i] + random(); write(f[i]:5:2); end; writeln; end.
Если нам захочется поменять длину массива, надо будет исправить только значение константы N.
Раз уж мы заговорили о длине массива, следует упомянуть функции length и sizeof языка Free Pascal. Первая возвращает количество элементов в массиве, а вторая — количество байтов, отводимое под массив. Их количество зависит как от длины массива, так и от базового типа данных массива.
const N = 10; var c: array[1..N] of Char; a: array[1..N] of Integer; f: array[1..N] of Real; begin writeln(length(c), ' ', sizeof(c)); writeln(length(a), ' ', sizeof(a)); writeln(length(f), ' ', sizeof(f)); end.
10 10 10 20 10 80
В примере длины всех трех массивов составляют 10 элементов. Однако под первый отводится 10 байтов, а под третий — 80, потому что каждое вещественное число в нем занимает 8 байтов.
Может возникнуть вопрос, зачем нужна функция length, если длина массива такая же как значение его последнего индекса? На самом деле это вовсе не обязательно. В Паскале первым индексом массива может быть любое целое число.
const F = -5; L = 0; var a: array[0..10] of Integer; b: array[1..10] of Integer; c: array[F..L] of Integer; i: Integer; begin writeln(length(a)); writeln(length(b)); writeln(length(c)); for i:=F to L do begin c[i] := random(100); write(i, '=', c[i], ' '); end; writeln; end.
11 10 6 -5=54 -4=59 -3=71 -2=84 -1=60 0=85
Более того, индексы элементов массива могут быть и символами, а также описываться другими порядковыми типами. То есть для индекса можно использовать тип, в котором определена дискретная последовательность значений, и все эти значения можно пересчитать по порядку. Индексировать можно не только константами и переменными, но и выражениями, результат вычисления которых дает значение перечислимого типа.
Если индекс массива может приобретать все допустимые значения определенного перечислимого типа, то при описании массива возможно задание имени типа вместо границ изменения индекса. При этом границами индекса будут первое и последнее значения в описании типа индекса. Рекомендуется предварительно объявлять тип массива в разделе описания типов.
type months = (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec); years = 1950..2010; people = array[years] of Integer; var revenue: array[months] of Real; employees: people; begin revenue[feb] := 100.45; revenue[aug] := 80.15; employees[1999] := employees[1999] + 10; writeln(revenue[aug]:4:2); // какой доход был в августе writeln(employees[1999]); // сколько человек 1999-го года end.
80.15 10
Итак, массив — это именованная группа однотипных данных, хранящихся в последовательных ячейках памяти. Каждая ячейка содержит элемент массива. Элементы нумеруются по порядку, но необязательно начиная с единицы (хотя в языке программирования Pascal чаще всего именно с нее). Порядковый номер элемента массива называется индексом этого элемента.
Помним, все элементы определенного массива имеют один и тот же тип. У разных массивов типы данных могут различаться. Например, один массив может состоять из чисел типа integer, а другой — из чисел типа real.
Массивы, представляющие собой линейную структуру, являются одномерными. Это самая простая и в то же время базовая разновидность массивов. Однако есть и другие.