Здесь показаны различия между двумя версиями данной страницы.
| Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
|
howto:arrays [2015/04/07 19:23] 85.21.96.125 старая ревизия восстановлена (2014/12/04 20:59) |
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([#начало],[$имя_массива],[значение])']] | + | |