=====Продвинутое использование массивов=====
====Двумерные массивы с числовыми индексами====
Реализация двумерного массива через одномерный требует от нас самого малого: понять, как соотносятся координаты ячеек с шириной двумерного массива. Для этого давайте взглянем на формулу:
N = x + y * WIDTH
Здесь ''N'' - это номер ячейки одномерного массива, ''WIDTH'' - ширина двумерного массива, а ''x'' и ''y'' — координаты ячейки в двумерном массиве.
Допустим наш двумерный массив должен иметь ширину 6 и высоту 8 ячеек. Нумерация ячеек как по оси ''x'' так и по оси ''y'' начинается с нуля. Таким образом номер ячейки с координатами ''0,0'' в одномерном массиве будет:
N = 0 + 0 * 6 = 0
Обратите внимание, высота массива в формуле не учитывается, а значит по высоте массив можно растягивать произвольно, используя всё ту же формулу с шириной 6 ячеек. Однако если мы изменим ширину двумерного массива, индексы одномерного массива в пересчёте на координаты ячеек двумерного изменятся.
Для понимания, как работает эта формула ознакомьтесь с примером симуляции двумерного массива через одномерный:
! Индексы i1 0..8
local i1_max=9
! Индексы i2 0..5
local i2_max=6
! Заполнение данных массива
loop local i1 = 0 while i1 < i1_max step i1 += 1:
loop local i2 = 0 while i2 < i2_max step i2 += 1:
$двумерный_массив[i1*i2_max+i2]='[<>,<>]'
end
end
! Вывод данных массива
loop local i1 = 0 while i1 < i1_max step i1 += 1:
loop local i2 = 0 while i2 < i2_max step i2 += 1:
*p $двумерный_массив[i1*i2_max+i2]+' '
end
*nl
end
*nl
!{Результат
[0,0] [0,1] [0,2] [0,3] [0,4] [0,5]
[1,0] [1,1] [1,2] [1,3] [1,4] [1,5]
[2,0] [2,1] [2,2] [2,3] [2,4] [2,5]
[3,0] [3,1] [3,2] [3,3] [3,4] [3,5]
[4,0] [4,1] [4,2] [4,3] [4,4] [4,5]
[5,0] [5,1] [5,2] [5,3] [5,4] [5,5]
[6,0] [6,1] [6,2] [6,3] [6,4] [6,5]
[7,0] [7,1] [7,2] [7,3] [7,4] [7,5]
[8,0] [8,1] [8,2] [8,3] [8,4] [8,5]
}
!Получение индексов массива через функцию ARRPOS
local $Поиск = '[2,5]'
local i1 = ARRPOS('$двумерный_массив',$Поиск)/i2_max
local i2 = ARRPOS('$двумерный_массив',$Поиск) mod i2_max
if ARRPOS('$двумерный_массив',$Поиск)<>-1 :
*Nl $Поиск + '=[<>,<>]'
else
*Nl 'Элемент не найден'
end
!{Результат
[2,5]=[2,5]
}
В данном примере использованы функции:
* [[help:cycle|'LOOP ... WHILE ... STEP ...']]
* [[help:main|'*NL [$текст]']]
* [[help:arrays|'ARRPOS(...)']]
====Двумерные массивы с текстовыми индексами====
Пример работы с массивом имеющим текстовые индексы
! Индексы i1 0..3
i1_max=4
! Индексы i2 0..5
i2_max=6
! Заполнение данных массива
i1=0
:ПрыгЗадатьМассив1
i2=0
:ПрыгЗадатьМассив2
! Знак двоеточие используется как разделитель
! между двумя численными индексами переведенными в текст
$ДвумерныйМассивТекстовыйИндекс['<>:<>']='[<>,<>]'
! $МассивИндекс нужен для дальнейшего поиска через ARRPOS/ARRCOMP
$МассивИндекс['<>:<>']='<>:<>'
! МассивПорядок нужен для использования KILLVAR
МассивПорядок['<>:<>']=ARRSIZE('МассивПорядок')
! Добавлять новый элемент и удалять нужно
!только одновременно в 3х массивах
i2+=1
if i2>:<>']+' '
i2+=1
if i2-1:
!Ищем разделитель ':' в индексе
K=STRPOS($МассивИндекс[N],':')
i1=VAL(MID($МассивИндекс[N],0,K-1))
i2=VAL(MID($МассивИндекс[N],K+1,LEN($МассивИндекс[N])-K))
*NL $Поиск+'=[<>,<>]'
else
*Nl 'Элемент не найден'
end
!{ Результат
[3,0]=[3,0]
}
*NL
!Удаление элемента массива через текстовый индекс
$Удалить='<>:<>'
*NL 'Удаляем элемент с индексом <>:<>'
!Получаем номер элемента
N=МассивПорядок[$Удалить]
!Удаляем элемент
KILLVAR '$ДвумерныйМассивТекстовыйИндекс', N
KILLVAR '$МассивИндекс', N
KILLVAR 'МассивПорядок', N
!Еще раз выводим данные массива
i1=0
:ПрыгВыводМассива3
*Nl
i2=0
:ПрыгВыводМассива4
if $ДвумерныйМассивТекстовыйИндекс['<>:<>']<>'':
*P $ДвумерныйМассивТекстовыйИндекс['<>:<>']+' '
else
*P '[DEL] '
end
i2+=1
if i2
В данном примере использованы функции:
* [[help:arrays|'ARRSIZE([$имя])']]
* [[help:arrays|'ARRPOS([#начало],[$имя_массива],[значение])']]
* [[help:arrays|'KILLVAR [$название массива],[#индекс элемента]']]
* [[help:strings|'VAL([$стр])']]
* [[help:strings|'MID([$стр],[#начало],[#длина])']]
* [[help:strings|'LEN([$стр])']]
====Массив переменных====
Пример использования индекса в названии массива
! Индексы i1 0..5
i1_max=6
! Индексы i2 0..2
i2_max=3
! Заполнение данных массива
i1=0
:ПрыгЗадатьМассив1
i2=0
:ПрыгЗадатьМассив2
!названия заполняемых массивов
!$МассивПеременных0 , $МассивПеременных1 , $МассивПеременных2
DYNAMIC {$МассивПеременных}+i1+{['<>']='[<>,<>]' }
i2+=1
if i2>'] +' '}
i2+=1
if i2
В данном примере использованы функции:
* [[help:dynamical|'DYNAMIC [$код],[параметр 1],[параметр 2], …']]
----
[[howto:start|Назад: Как сделать]]