Типы индекса

Значением индексного выражения всегда является конкретное данное, по которому однозначно можно установить номер компоненты массива. Поэтому, очевидно, тип индекса может быть только скалярным. Рассмотрим последовательно скалярные типы и укажем, какие из них могут использоваться как типы индекса, а какие не могут и почему.

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

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

array [1..100] of real

Ограниченный целый тип 1 .. 100 определяет количество компонент (сто) и их упорядоченность (от первой до сотой). Во многих задачах нумерация компонент начинается с 1 и ограничивается положительным целым числом. Однако это вовсе не обязательно. Если, например, в программе используется вектор, компоненты которого представляют собой численность населения города Москвы в отдельные годы, то нумерацию компонент удобнее начинать с целого числа 1147 — года основания Москвы. Пусть последняя компонента этого вектора имеет номер 1999 — предпоследний год нашего столетия. Тогда этот вектор может быть задан следующим образом: array [1147..1999] of integer

Если же в программе обрабатывается численность населения города Рима до нашей эры, то удобно ввести целочисленный вектор с нумерацией компонент, начиная с отрицательного целого числа —754 (года основания Рима) до —1 (последнего года исчисления до нашей эры). Задать такой вектор можно следующим образом:

array [-754..-1] of integer

Каждому задаваемому регулярному типу можно дать имя с помощью описания типа, так что указанные выше регулярные типы можно ввести в употребление с помощью следующего фрагмента программы: type

границы=1..100;

Вектор=аггау [границы] of real; чМосквы=аггау [1147..1999] of integer; чРима=аггау [-754..-1] of integer;

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

var

А,В: Вектор; c,d: чМосквы;

Регулярный тип можно задать и непосредственно при описании переменных: var

г,t: array [граница] of real;

s,q: array [1147.. 1999] of integer;

g,h: array [-754..-1] of integer;

k,m: array [1..50] of (шар, куб, пирамида);

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

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

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

Частичные переменные, обозначающие температуру конкретного месяца, выглядят следующим образом: t [январь], t [февраль], t [март] и т.д. Если в программе введена в употребление переменная типа Месяц, например

var

month: Месяц

то эту переменную можно использовать в качестве индекса:

Конкретная компонента вектора t, обозначаемая этой частичной переменной, будет определяться текущим значением переменной month.

В предыдущей главе отмечалось, что тип boolean является стандартным перечислимым типом, а следовательно, и его значения могут быть использованы в качестве значений индекса. Соответственно, индексные выражения могут представлять собой логические выражения.

При введении стандартного типа char подробно обсуждался вопрос об упорядоченности значений этого типа. В главе 2 говорилось о влиянии конкретной реализации на способ упорядочения значений этого типа. Сейчас же важно, что при любой реализации значения стандартного типа char образуют ограниченное перенумерованное множество, а значит, могут быть использованы в качестве индексов. Ниже приведены примеры регулярных типов, у которых в качестве типа индекса указаны стандартные типы boolean и char:

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

и с переменными значениями индексов (b, d — логические переменные; sym — литерная переменная):

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >