Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чернов Шафеева.doc
Скачиваний:
19
Добавлен:
15.07.2019
Размер:
1.57 Mб
Скачать

2.8.8. Структурированные типы данных. Массивы

Массивыупорядоченная структура однотипных данных, хранящихся последовательно. Массив обязательно имеет размеры. Описывается в разделе TYPE или VAR следующим образом:

Type <имя>=array[индексный тип] of <базовый тип>; или

Var <Имя_переменной>: array [ диапазон_индексов] of <базовыйтип>;

Диапазон индексов может задаваться любым порядковым типом кроме LongInt. Произведение количества компонентов массива, задаваемого диа­пазоном индексов на размер компонентов в байтах, не может превышать 65520 байт.

Пpимер: TYPE

array10=array[1..10] of integer;

array11=array[11..22] of real;

VAR V:array[-3..2] of char; {массив из 6 элементов}.

В качестве индексов можно использовать любые перечислимые типы как встроенные, так и вводимые программистом. Индексы в этом случае могут задаваться также диапазоном. Если диапазон соответствует всему типу, можно просто указывать имя этого типа. Например:

TYPE DIAP=1..100;

VECTOR=array[DIAP] of real;

PRIZ=array[Boolean] of char;

При записи сложных массивов индексы разных диапазонов могут при­надлежать разным типам. Например:

VAR V: array[0..10,'A'..'C',Boolean] of char;

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

CONST

K=10; L=5;

VAR

A:ARRAY[1..K] OF INTEGER;

B,С:ARRAY[1..K,1..L] OF REAL;

Массивы хранятся в памяти как сплошные последовательности компо­нентов, причем, быстрее изменяется дальний правый индекс.

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

<имя>[<индексы>].

Пример:

A[1] := 1; B[8,5] := В[8,1] + B[8,2];

V[1,'B',False] или V[1]['B'][False].

В данном типе определена единственная операция присваивания. Мож­но присваиваить массив лишь массиву, например: A := С.

Операции сравнения производятся только поэлементно.

Обнуление элементов массива выполняется циклом

FOR I:=1 TO K DO A[I]:=0.

Разрешается обьявлять массивы массивов, например:

TYPE VECTOR=array[1..5] of real;

MATRIX=array[1..10] of VECTOR;

или

MATRIX=array[1..10] of array[1..5] of real;

или

MATRIX=array[1..10,1..5] of real;

Приведенные три последних вида записей эквивалентны.

Слову array может предшествовать ключевое слово PACKED, которое означает «упакованный». Заметим, что в Турбо Паскале все массивы хра­нятся в упакованном виде, поэтому PACKED писать не рекомендуется.

2.8.9. Множества

Множества  наборы однотипных, логически связанных друг с другом обьектов. Характер связи обьектов определяется программистом и не контролируется Турбо Паскалем. Количество элементов в множестве может меняться от 0 до 256. Множество, которое не содержит элементов, назы­вается пустым. От массивов множества отличаются тем, что количество элементов не постоянно. Его можно расширять и сокращать по ходу выпол­нения программы.

Описание типа производится в разделе TYPE в следующем виде:

<ИмяТипа> = SET of <базовый_тип>,

где <ИмяТипа> - правильный идентификатор ТП; <базовый_тип>  тип эле­ментов множества, в качестве которого может применяться любой порядко­вый тип кроме WORD, Integer, LogInt, ShortInt.

Пример:TYPE

dchar=SET of '1'..'9';

digit=SET of 1..9;

Переменные введенных типов-множеств описываются в разделе VAR. Пример:

VAR

S1, S2, S3: dchar;

S4, S5, S6, S7: digit;

Можно тип объявлять сразу при описании переменных, например:

VAR S1: set of '1'..'9';

Для задания множества может использоваться конструктор множества  список элементов множества, отделенных друг от друга запятыми. Список заключается в квадратные скобки. Спецификациями эле­ментов могут быть константы или выражения базового типа, а также тип-диапазон того же базового типа, например:

S1:=['1','2','3']; S4:=[0..3,7];

S2:=['2','1','3']; S5:=[4,6];

S3:=['1','2']; S6:=[3..8];

S7:=[]; (пустое).

Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы причем порядок следования в множестве безразличен (S1 и S2 эквивалентны).

Если все элементы одного множества входят в другое множество то говорят, что первое включено во второе (S3 включено в S1).

Пустое множество считается включенным в любое другое.

Над множествами определены следующие операции:

1. Пересечение множеств (*) содержит элементы, общие для обоих множеств. Например, S4*S6 содержит [3,7]; S4*S5 образует пустое мно­жество.

2. Объединение множеств (+) содержит элементы первого множест­ва, дополненные недостающими элементами второго. Например,

S4+S5 содержит [0,1,2,3,4,6,7], S5+S6 содержит [3,4,5,6,7,8].

3. Разность множеств (-) содержит элементы из первого множества, которые не принадлежат второму. Например, S6-S5 содержит [3,5,7,8]);

S4-S5 содержит [0,1,2,3,7]), [ ]-S4 даст [ ].

4. Операции отношений:

операция эквивалентности (=) возвращает значение TRUE, если оба множества эквивалентны, например, S1=S2;

проверки неэквивалентности (<>) дает TRUE, если множества неэкви­валентны, например, [1,2] <> [1] и S3<>S2;

проверки вхождения (<=) принимает значение TRUE, если первое множество входит во второе, например, [1]<=[1,2];

проверки вхождения (>=) возвращает TRUE, если второе множество входит в первое;

проверки принадлежности (in) возвращает TRUE, если выражение име­ет значение, принадлежащее множеству. Структура этой бинарной операции имеет вид

<выражение> in <множество>;

Примеры:

3 in S6 , и [ ] in [0..5] возвращают TRUE;

2*2 in S4 дает FALSE.

Множества имеют компактное машинное представление.

Недостатком данного типа является невозможность вывода множеств на экран, поскольку отсутствует механизм изъятия элемента из множест­ва. Ввод множества возможен только поэлементно.

Пример: Сформировать множество из введенных с клавиатуры символов до появления точки.

VAR S: SET of char; {объявленa переменная-множество S}

C: char; {элемент множества}

Begin

S:=[]; {обнуление значений}

while C <> '.' do {цикл до ввода "."}

begin

readln(C); {чтение символа в с}

S:=S+[C]; {добавление его к S}

end;

End.