В некоторых программах используются треугольные массивы, которые вклю-
чают диагональные элементы A[i, i]. В этом случае необходимо сделать всего два
изменения в формуле преобразования индексов. Во-первых, преобразование не
должно отклонять случаи с i = j. Кроме того, необходимо перед вычислением ин-
декса в массиве В добавить к i единицу.
i := i+1;
x = Round(i*(i-l)/2)+j; // Для i > j.
Используя приведенные формулы, можно написать функцию для преобразо-
вания координат двух массивов таким образом:
// Преобразование индексов i и j двумерного массива А
// в индекс х одномерного массива В.
function TTriangularArray.AtoBU, j : Integer) : Integer;
var
tmp : Integer;
begin
if ((i<0) or (i>=Rows) or
(j<0) or (j>=Rows))
then
raise EInvalidOperation.CreateFmt(
'Индексы %d и %d не в промежутке от %d до %d.',[i,j,0,Rows-l]);
if ((not UseDiagonal) and ( i = j ) ) then
raise EInvalidOperation.Create(
'Этот массив не содержит диагональных элементов.');
// Сделать так, чтобы i > j .
if (i
begin
tmp := i;
i := j;
j := tmp;
end;
if (UseDiagonal) then i := i + 1;
AtoB := Round(i*(i - 1) / 2 ) + j ;
end;
|