Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
ОПРЕДЕЛЕНИЕ-МАССИВА::=
ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА |
АГРЕГАТ-МАССИВ |
ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ
ОПРЕДЕЛЕНИЕ-МАССИВА-ПО-ЧАСТЯМ::=
ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА
Результатом вычисления ОПРЕДЕЛЕНИЯ-МАССИВА является значение массива. Вычисление реализуется итерацией по всевозможным значениям набора индексов массива. Для каждого набора индексов вычисляется соответствующий элемент массива. Вычисление значений разных элементов может проводиться параллельно.
ОПРЕДЕЛЕНИЕ-ЭЛЕМЕНТА-МАССИВА::= ВЫРАЖЕНИЕ
ВЫРАЖЕНИЕ для элемента массива зависит от индексов, указанных в ОПРЕДЕЛЕНИИ-ИНДЕКСОВ.
ОПРЕДЕЛЕНИЕ-ИНДЕКСОВ::= 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; остальные строки остаются неизменными. Задание нового значения двух строк матрицы реализуется конструкцией ОПРЕДЕЛЕНИЕ-ЧАСТЕЙ-МАССИВА.
Дата публикования: 2014-11-18; Прочитано: 176 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!