Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
howto:arrays [2014/12/04 17:59] asv [Массив переменных] - добавил ссылку |
howto:arrays [2024/12/13 10:36] (текущий) aleks_versus |
||
---|---|---|---|
Строка 3: | Строка 3: | ||
====Двумерные массивы с числовыми индексами==== | ====Двумерные массивы с числовыми индексами==== | ||
- | Пример симуляции двумерного массива | + | Реализация двумерного массива через одномерный требует от нас самого малого: понять, как соотносятся координаты ячеек с шириной двумерного массива. Для этого давайте взглянем на формулу: |
+ | |||
+ | <sxh qsp> | ||
+ | N = x + y * WIDTH | ||
+ | </sxh> | ||
+ | |||
+ | Здесь ''N'' - это номер ячейки одномерного массива, ''WIDTH'' - ширина двумерного массива, а ''x'' и ''y'' — координаты ячейки в двумерном массиве. | ||
+ | |||
+ | Допустим наш двумерный массив должен иметь ширину 6 и высоту 8 ячеек. Нумерация ячеек как по оси ''x'' так и по оси ''y'' начинается с нуля. Таким образом номер ячейки с координатами ''0,0'' в одномерном массиве будет: | ||
+ | |||
+ | <sxh qsp> | ||
+ | N = 0 + 0 * 6 = 0 | ||
+ | </sxh> | ||
+ | |||
+ | Обратите внимание, высота массива в формуле не учитывается, а значит по высоте массив можно растягивать произвольно, используя всё ту же формулу с шириной 6 ячеек. Однако если мы изменим ширину двумерного массива, индексы одномерного массива в пересчёте на координаты ячеек двумерного изменятся. | ||
+ | |||
+ | Для понимания, как работает эта формула ознакомьтесь с примером симуляции двумерного массива через одномерный: | ||
<sxh qsp> | <sxh qsp> | ||
! Индексы i1 0..8 | ! Индексы i1 0..8 | ||
- | i1_max=9 | + | local i1_max=9 |
! Индексы i2 0..5 | ! Индексы i2 0..5 | ||
- | i2_max=6 | + | local i2_max=6 |
- | + | ||
- | ! Заполнение данных массива | + | |
- | i1=0 | + | |
- | :ПрыгЗадатьМассив1 | + | |
- | i2=0 | + | |
- | :ПрыгЗадатьМассив2 | + | |
- | $ДвумерныйМассив[i1*i2_max+i2]='[<<i1>>,<<i2>>]' | + | |
- | i2+=1 | + | |
- | if i2<i2_max : Jump 'ПрыгЗадатьМассив2' | + | |
- | i1+=1 | + | |
- | if i1<i1_max : Jump 'ПрыгЗадатьМассив1' | + | |
+ | ! Заполнение данных массива | ||
+ | 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]='[<<i1>>,<<i2>>]' | ||
+ | end | ||
+ | end | ||
! Вывод данных массива | ! Вывод данных массива | ||
- | i1=0 | + | loop local i1 = 0 while i1 < i1_max step i1 += 1: |
- | :ПрыгВыводМассива1 | + | loop local i2 = 0 while i2 < i2_max step i2 += 1: |
- | *Nl | + | *p $двумерный_массив[i1*i2_max+i2]+' ' |
- | i2=0 | + | end |
- | :ПрыгВыводМассива2 | + | *nl |
- | *P $ДвумерныйМассив[i1*i2_max+i2]+' ' | + | end |
- | i2+=1 | + | |
- | if i2<i2_max : Jump 'ПрыгВыводМассива2' | + | *nl |
- | i1+=1 | + | |
- | if i1<i1_max : Jump 'ПрыгВыводМассива1' | + | |
- | *Nl | + | |
!{Результат | !{Результат | ||
Строка 51: | Строка 59: | ||
!Получение индексов массива через функцию ARRPOS | !Получение индексов массива через функцию ARRPOS | ||
- | $Поиск='[2,5]' | + | local $Поиск = '[2,5]' |
- | i1=ARRPOS('$ДвумерныйМассив',$Поиск)/i2_max | + | local i1 = ARRPOS('$двумерный_массив',$Поиск)/i2_max |
- | i2=ARRPOS('$ДвумерныйМассив',$Поиск) mod i2_max | + | local i2 = ARRPOS('$двумерный_массив',$Поиск) mod i2_max |
- | if ARRPOS('$ДвумерныйМассив',$Поиск)<>-1 : | + | if ARRPOS('$двумерный_массив',$Поиск)<>-1 : |
- | *Nl $Поиск+'=[<<i1>>,<<i2>>]' | + | *Nl $Поиск + '=[<<i1>>,<<i2>>]' |
else | else | ||
*Nl 'Элемент не найден' | *Nl 'Элемент не найден' | ||
Строка 64: | Строка 72: | ||
[2,5]=[2,5] | [2,5]=[2,5] | ||
} | } | ||
- | |||
</sxh> | </sxh> | ||
В данном примере использованы функции: | В данном примере использованы функции: | ||
- | * [[help:conditional|'IF [#условие]: [операторы] ELSE [операторы]']] | + | * [[help:cycle|'LOOP ... WHILE ... STEP ...']] |
* [[help:main|'*NL [$текст]']] | * [[help:main|'*NL [$текст]']] | ||
- | * [[help:jump|'JUMP [$метка]']] | + | * [[help:arrays|'ARRPOS(...)']] |
- | * [[help:arrays|'ARRPOS([#начало],[$имя_массива],[значение])']] | + | |