Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Темы 3, 5 + массивы ИиП.docx
Скачиваний:
7
Добавлен:
09.06.2015
Размер:
81.78 Кб
Скачать

3. Совместимость и преобразование типов

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

Важно запомнить следующие простые правила.

Во всех случаях два типа совместимы, если:

  • они оба одного типа;

  • оба вещественные или оба целые;

  • оба – строки;

  • один строка, а другой – символ;

  • один тип представлен интервалом второго типа;

  • оба представлены интервалами одного и того же базового типа;

  • оба – подмножества одного и того же базового типа;

  • оба – процедурные типы с одинаковым количеством и типом соответствующих параметров, а для функции – и типом результата.

Кроме того, в операторах присваивания тип переменной (т1) и тип результата (т2) считаются совместимыми, если:

  • они одни и те же;

  • они совместимые порядковые и т2 представлен интервалом т1;

  • они вещественные и т2 представлен интервалом т1;

  • т1 – вещественный, а тип т2 – целый;

  • т1 – строка, а тип т2 – строка или символ;

  • оба – совместимые множества, причем все элементы т2 принадлежат множеству возможных значений т1;

  • т1 и т2 – совместимые процедурные типы.

Допускаются преобразования данных одного типа в данные другого типа. Они могут быть:

- явными, осуществляемыми в программе реально записанными специальными встроенными функциями CHR,ORD,TRUNC и ROUND, в которых аргумент и результат принадлежат разным типам.

- неявными, осуществляемыми:

1. в выражениях, где предварительно вещественные и целые данные преобразуются в вещественный тип, и в результате формируется результат вещественного типа;

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

Примечание: чтобы избежать появление в программе возможных,

трудно обнаруживаемых ошибок рекомендуется все

преобразования данных осуществлять явно!

- « -

Массивы и работа с ними

Под массивом понимается фиксированная совокупность

однотипных элементов, расположенных в

определенном порядке.

Местоположение элемента в массиве определяется его номером или, иначе, - индексом. Тем самым обеспечивается упорядоченность элементов и возможность быстрого доступа к ним.

Каждый массив обладает по крайней мере тремя характеристиками: мерностью, размерностью (размером) и типом элементов

.

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

В зависимости от числа индексов (измерений) массивы бывают одномерными и многомерными.

Например,

а). последовательность чисел

2 34 -5 7 0 13 -22

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

МАS(7) или А(7).

При этом число 13 в массиве будет иметь индекс 6 и выражаться MAS[6] или А[6].

I-ый элемент обозначается MAS[I] или А[I].

Аналогично, последовательность слов

МИР РАК РИМ СОК КОТ ТОК

также является одномерным массивом, состоящим из 6-ти, но уже 3–х символьных элементов.

б). двумерный массив в нашем представлении есть матрица, где местоположение элемента определяется двумя индексами, первый из которых обозначает строку, а второй – столбец. Поэтому элемент М[2,4] будет располагаться на пересечении 2-й строки и 4-го столбца. А сама матрица, состоящая, например, из 6 строк и 5 столбцов, будет иметь следующее обозначение:

М(6,5)

в). трехмерный массив представляется кубом. Для идентификации отдельного элемента в нем уже применяются 3 индекса: первый и второй отображают, соответственно, строку и столбец плоскости (матрицы) куба, а третий – саму эту плоскость (матрицу). Поэтому отображение

К(3,4,5)

задает куб из 5-ти матриц, каждая из которых насчитывает 3 строки и 4 столбца.

А указание

К[2,1,3]

выводит нас на элемент, находящийся на пересечении 2-ой строки и 1-го столбца 3-й матрицы куба.

Если увеличивать число индексов, то можно оперировать более сложными массивами и представлять n-мерные пространства.

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

Например, говорят: массив В, размерностью 4 на 6, подразумевая, что он двумерный и содержит 4 строки 6 столбцов. Т.е. В(4,6).

Размер массива определяет общее количество его элементов. При этом в расчет берутся все измерения массива. Так, размер двумерного массива В(4,6) равен 24.

Напомним, что важнейшей особенностью массива является фиксированное количество элементов в нем.

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

Объявить массив – это означает сообщить компилятору:

- имя массива, которое определяет переменную с индексами;

- тип элементов массива;

- тип индексов элементов массива;

- размерность массива, равную количеству его индексных позиций;

- порядок позиционирования, т.е. нумерации элементов массива;

- количество элементов массива.

Полная форма объявления массива:

cписок тип

TYPE <имя типа > =ARRAY[<типов индексов >] OF < элементов >;

массива через запятую массива

VAR <имя массива> : < имя типа массива>;

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

Тип элементов м.б. любым из допустимых, кроме FILE.

Сокращенная форма объявления:

имя cписок тип

VAR < массива> : ARRAY[<типов индексов >] OF < элементов >;

через запятую массива

Примеры объявления одномерных массивов:

a). полная запись:

TYPE

A=ARRAY[1..50] OF INTEGER;

B=ARRAY[10..20] OF REAL;

C=ARRAY[-5..15] OF BOOLEAN;

D=ARRAY[0..25] OF STRING[30];

E=ARRAY[-1..5] OF CHAR;

VAR MASA: A; => массив из 50 элементов целого типа

MASB: B; => массив из 11 элементов вещественного типа

MASС: С; => массив из 21 элемента булевского типа

MASD: D; => массив из 26 элементов строкового типа

MASE: E; => массив из 7 элементов символьного типа

Границы изменения индексов можно задать и так:

CONST I=-10000;

N=10000;

TYPE M= ARRAY[I..N] OF REAL;

б). сокращенная запись:

VAR MASA: ARRAY[1..50] OF INTEGER;

Примеры объявления многомерных массивов:

TYPE A1= ARRAY[1..20] OF INTEGER;

A2= ARRAY[1..10] OF A1;

VAR MSV: A2; => матрица, размерностью 10 на 20

Или:

TYPE A1= ARRAY[1..20] OF INTEGER;

VAR MSV: ARRAY[1..10] OF A1;

Или:

VAR MSV: ARRAY[1..10] OF ARRAY[1..20] OF INTEGER;

Или еще проще:

VAR MSV: ARRAY[1..10,1..20] OF INTEGER;

Следует учитывать, что, располагаясь в оперативной памяти, элементы массива образуют цепочку, в которой при последовательном переходе от элемента к элементу быстрее меняется самый правый (младший) индекс. Иными словами, в массиве T(2,3) элементы расположатся в следующем порядке:

Т[1,1] Т[1,2] Т[1,3] Т[2,1] Т[2,2] Т[2,3]

А в нашем представлении:

Т[1,1] Т[1,2] Т[1,3]

Т[2,1] Т[2,2] Т[2,3]

Для обращения к любому элементу объявленного массива предназначена переменная с индексом. По форме записи - это имя массива со списком из одного или нескольких индексов через запятую, заключенным в квадратные скобки.

Индекс может быть константой или выражением того же типа, что и тип индекса:

MASА[7] => обращение к 7–му (из 50-ти) элементу массива

MASA.

MSV[2,5] => обращение к элементу, лежащему на

пересечении 2-ой строки и 5-го столбца

матрицы MSV.

M1[i+1,j-2,k*3] => обращение к элементу трехмерного

массива M1, индексы которого вычисляются

согласно приведенным выражениям.

Замечания:

  1. при обращении к элементам массива следует помнить, что количество индексных выражений /индексов/ должно равняться размерности массива.

  2. значения индексов должны находиться в пределах их границ, заданных интервалом или перечислением.

  3. значение вычисляемого индекса должно соответствовать типу индекса и не м.б. REAL.

Например, недопустимо:

Pole :=MSV[15, 25/(3+a), 4];

т.к.:

  • первый индекс д.б. < = 10

  • второй – дает в результате REAL

  • третьего индекса вообще не должно быть

Можно описывать массивы с помощью компонент и индексов разных типов:

а).

TYPE DAY=(PND,VTR,SRD,CTV,PTN,SBT,VSK);

VAR DN: ARRAY[1..7] OF DAY;

Значениями элемента этого массива DN может быть один из 7 дней недели, задаваемых перечисляемым типом DAY, т.е допустимо:

DN[5]:=CTV;

б).

TYPE GR=(EIS_111,EIS_112,EIS_211,EIS_212,EIS_311,EIS_312);

ML_KURS=(1..3);

VAR STUD: ARRAY[GR, ML_KURS] OF INTEGER;

Тогда,

STUD[EIS_112,1]:=23; => число студентов в группе.