Определение массива

ОПРЕДЕЛЕНИЕ-МАССИВА ::=

ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА |

АГРЕГАТ-МАССИВ |

ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ

ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ ::=

ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА

Результатом вычисления ОПРЕДЕЛЕНИЯ-МАССИВА является значение массива. Вычисление реализуется итерацией по всевозможным значениям набора индексов массива. Для каждого набора индексов вычисляется соответствующий элемент массива. Вычисление значений разных элементов может проводиться параллельно.

ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА ::= ВЫРАЖЕНИЕ

ВЫРАЖЕНИЕ для элемента массива зависит от индексов, указанных в ОПРЕДЕЛЕНИИ-ИНДЕКСОВ.

ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ::= for ( ЗАДАНИЕ-ИНДЕКСОВ )

ЗАДАНИЕ-ИНДЕКСОВ ::= ОПРЕДЕЛЕНИЕ-ИНДЕКСА [ , ЗАДАНИЕ-ИНДЕКСОВ]

ОПРЕДЕЛЕНИЕ-ИНДЕКСА ::= [ИЗОБРАЖЕНИЕ-ТИПА-ПЕРЕМЕННОЙ] ИНДЕКС

ИНДЕКС ::= ИДЕНТИФИКАТОР

Переменные, обозначающие индексы, локальны в ОПРЕДЕЛЕНИИ-МАССИВА. При определении индекса обычно используется описатель var (см. разд. 6.4). Указание типа индекса требуется в редких случаях, когда тип масива (в том числе и типы индексов массива) трудно определить из позиции, в которой находится ОПРЕДЕЛЕНИЕ-МАССИВА. Отметим, что в ОПРЕДЕЛЕНИИ-ИНДЕКСА тип индекса, если он задан явно, должен точно покрывать множество значений индекса; обычно это диапазон типа int.


type ar1_5 = array (int, 1..5);

ar1_5 squ;

squ = for (var i) i*i;

ar1_5 r = for (var i) 100 - i;

Пример 15.Конструкторы массивов

 

ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА ::=

{ (ОПРЕДЕЛЕНИЕ-ЧАСТИ-МАССИВА)+

[default : ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА ]

}

ОПРЕДЕЛЕНИЕ-ЧАСТИ-МАССИВА ::=

case ИНДЕКСЫ-ЧАСТИ : ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА

ИНДЕКСЫ-ЧАСТИ ::= ЭЛЕМЕНТ-НАБОРА-ИНДЕКСОВ |

( НАБОР-ИНДЕКСОВ ) |

( ЭЛЕМЕНТ-НАБОРА-ИНДЕКСОВ [, ИНДЕКСЫ-ЧАСТИ] ) |

( ( НАБОР-ИНДЕКСОВ ) [, ИНДЕКСЫ-ЧАСТИ] )

ИНДЕКСЫ-ЧАСТИ определяют некоторое подмножество на произведении типов индексов. Эти подмножества не должны пересекаться для разных ОПРЕДЕЛЕНИЙ-ЧАСТИ-МАССИВА. Определение элементов массива для наборов индексов, не принадлежащих ни одной из указанных частей массива, реализуется частью default. При отсутствии части default объединение подмножеств наборов индексов для разных частей должно совпадать с полным множеством наборов индексов. Вычисление элементов массива по каждой из частей массива проводится независимо, возможно параллельно.

Если ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА используется в операции модификации массива (см. разд. 6.6), то часть default отсутствует.

type Ar(nat k) = array (real, 1..k);

F (nat n, Ar(n) x: Ar(n+1) x')

{ x' = for (var j) { case 1..n : x[j] + 1 case n + 1 : 0 } }

Пример 16.Определение массива по частям

type MATR(nat k) = array(real, 1..k, 1..k);

perm_lines(nat n, MATR(n) a, nat k, m : MATR(n) a' )

pre 1 <= k < m <= n

{ a' = a with for (var i, j) {

case (k, 1..n): a[m, j]

case (m, 1..n): a[k, j]

}

}

Пример 17.Перестановка двух строк матрицы

В матрице a переставляются местами строки с номерами k и m. Перестановка реализуется применением операции модификации (см. разд. 6.6) двух строк в массиве a; остальные строки остаются неизменными. Задание нового значения двух строк матрицы реализуется конструкцией ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА.