До сих пор рассматривались лишь простые (скалярные), типы данных, где каждым значением любого из этих типов является отдельное данное, то есть тривиальная структура. Значения структурированных или производных типов в общем случае представляют собой нетривиальную структуру, то есть имеют более чем одну компоненту. При этом каждая компонента структуры может быть как отдельным данным, так и нетривиальной структурой, то есть значением любого из производных типов.
На языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей и наиболее часто используемым производным типом является регулярный тип, а его значения обычно называют массивами. Массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Тип элементов массива называется базовым. Число элементов массива фиксируется при описании и в процессе выполнения программы не меняется. Доступ к каждому отдельному элементу осуществляется путем индексирования элементов массива. Индексы представляют собой выражения любого скалярного типа, кроме вещественного. Тип индекса определяет границы изменения значений индекса. Например, массив A состоит из элементов a1, a2, a3,... an. Здесь а – имя элемента массива, n – его индекс, т.е. порядковый номер в массиве, по которому можно определить (найти) каждый элемент.
|
|
Для описания массива в языке Паскаль предназначено словосочетание ARRAY OF (массив из...). Описание массива возможно двумя способами.
Способ 1. Используя раздел описания типов
Type <имя типа> = array [тип индекса] of <тип компонент>;
Var <идентификатор>: <имя типа>;
Например, Type Mas = array[1..100] of real;
Var M1,M2:Mas;
Способ 2. Используя раздел описания переменных (Var) без представления типа в разделе описания типов данных.
Var
<идентификатор>: array [тип индекса] of <тип компонент>;
Например, Var M1, M2: array[1..100] of real;
V1: array[1..50] of integer;
Если в качестве базового типа взят другой массив, образуется структура, которую принято называть многомерным массивом.
Например,Type Vector = array [1..4] of integer;
Massiv = array [1..4] of Vector;
Var M1:Massiv;
Ту же структуру можно получить, используя другую форму записи:
Var M1: array[1..4,1..4] of integer;
Таким образом, многомерный массив задается при помощи индексированных выражений, следующих друг за другом. Если индексное выражение одно, то массив называется одномерным, если два – двумерным (матрица), если n – n-мерным. Одномерные массивы в Паскале обычно используются для представления векторов, двумерные – для представления матриц.
Например,Var Vector = array [1..5] of real;
{одномерный массив-вектор из 5-ти элементов типа real}
|
|
Matr = array [1..4,1..3] of integer;
{матрица из 4-х строк и 3-х столбцов с элементами типа integer}
При описании массивов для задания границ индексов можно использовать предварительно определенные константы. Например,
Const G1=4;G2=5;
Var Matr = array [1..G1,1..G2] of integer;
Элементы массива располагаются в памяти последовательно, по строкам. Для массива Matr:
Matr[1,1] Matr[1,2] Matr[1,3]
Matr[2,1] Matr[2,2] Matr[2,3]
Matr[3,1] Matr[3,2] Matr[3,3]
Matr[4,1] Matr[4,2] Matr[4,3]
При обращении к элементам массива на Паскале индекс указывается в квадратных скобках: А[i], B[i,j].
При работе с массивами необходимо помнить следующее:
массив – это структура данных, представляющая собой совокупность элементов одного типа;
при объявлении массива указывается количество элементов массива;
доступ к элементу массива осуществляется путем указания индекса (номера) элемента массива.
Тип индекса элемента массива может быть только скалярным. Наиболее часто в качестве типа индекса используется ограниченный тип [1], причем в большинстве случаев это ограниченный целый тип.
Так, например, массив из 100 компонент вещественного типа может быть задан как array [1..100] of real.
Ограниченный целый тип 1..100 определяет количество компонент – 100 и их упорядоченность – от 1-ой до 100-ой.
В большинстве задач нумерация компонент начинается от 1 и ограничивается положительным целым числом. Но это необязательно. Если, например, представить в виде массива численность г. Москвы [1] в отдельные годы, то нумерацию удобно начинать с 1147 – года основания Москвы и до 2006, т.е. такой массив можно задать как array[1147..2006] of integer;, а для Рима, основанного в 754 г. до н.э. – array[-754..-1] of integer;.
Здесь –1 –последний год до н.э.
Каждый из рассмотренных массивов может быть задан двояко:
1) используя описание типа:
Type vector = array[1..100] of real;
ch_M = array[1147..2006] of integer;
ch_R = array[-754..-1] of integer;
Var a, b: vector;
c: ch_M; d: ch_R;
Обращение к элементам массивов с и d: с[1147], c[1999] и т.п., то есть с[i], d[i];
2) непосредственно при описании переменной:
Var a,b: array[1..100] of real;
c: array[1147..2006] of integer;
d: array[-754..-1] of integer;
Использование ограниченного целого типа для индексов дает достаточно широкие возможности для описания массивов.
Множество значений перечисляемого типатакже образует ограниченное перенумерованное множество. Следовательно, перечисляемый типтакже может быть использован в качестве типа индексов [1]. Значения перечисляемого типа упорядочены (порядок задается порядком перечисления имен, являющихся значениями этого типа), и число их конечно (определяется количеством имен в этом типе).
Например, необходимо проанализировать среднемесячную температуру воздуха за год [1]. Можно в качестве индекса использовать ограниченный целый тип 1..12, но можно для наглядности ввести перечисляемый тип, состоящий из имен месяцев года:
Type Month = (Jan, Feb, Mar, Apr, …, Deс);
Тогда переменные, являющиеся векторами среднемесячных температур, можно определить следующим образом: Var t,r: array[Month] of real;
Частичные компоненты массива, обозначающие температуру каждого месяца, запишутся следующим образом: t[Yan], t[Feb], t[apr] и т. п. Если ввести переменную m типа Month (m: Month ), то можно обращаться t[m], где m меняется от Janдо Deс.
В качестве типа индексов могут использоваться также стандартные типы Boolean и Char. Например,
Type priznak = array[Boolean] of integer;
kod_s = array[Char] of integer;
Var k: priznak; s: kod_s;
Частичные компоненты таких массивов выглядят следующим образом:
k[False], k[True]; s[‘d’], s[‘h’].
Для работы с массивом как с единым целым используется идентификатор массива без указания индекса в квадратных скобках. Если массивы описаны одинаково, то с ними можно проводить следующие операции [5]:
Проверка на равенство: А=В. Результатом является значение «истина», если каждый элемент массива А равен соответствующему элементу массива В.
|
|
Проверка на неравенство: А<>В. Результатом является значение «истина», если значение хотя бы одного элемента массива А не равно значению соответствующего элемента массива В.
Присваивание. А:=В. Все значения элементов массива В присваиваются элементам массива А. Значения элементов массива В остаются без изменения.