Инструменты пользователя

Инструменты сайта


howto:arrays

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
howto:arrays [2015/04/01 02:03]
124.122.232.234 M7beL6oKYWR
howto:arrays [2024/12/13 10:36] (текущий)
aleks_versus
Строка 1: Строка 1:
-Me dullYou smartThat's just what I neddee.+=====Продвинутое использование массивов===== 
 + 
 +====Двумерные массивы с числовыми индексами==== 
 + 
 +Реализация двумерного массива через одномерный требует от нас самого малого:​ понять,​ как соотносятся координаты ячеек с шириной двумерного массиваДля этого давайте взглянем на формулу:​ 
 + 
 +<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> 
 +! Индексы 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]='​[<<​i1>>,<<​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 $Поиск + '​=[<<​i1>>,<<​i2>>​]'​  
 +else  
 + *Nl '​Элемент не найден'​ 
 +end 
 +!{Результат  
 +[2,​5]=[2,​5] 
 +
 +</​sxh>​ 
 + 
 +В данном примере использованы функции:​ 
 +      * [[help:​cycle|'​LOOP ... WHILE ... STEP ...'​]] 
 +      * [[help:​main|'​*NL [$текст]'​]] 
 +      * [[help:​arrays|'​ARRPOS(...)'​]] 
 + 
 + 
 + 
 +====Двумерные массивы с текстовыми индексами==== 
 + 
 +Пример работы с массивом имеющим текстовые индексы 
 +<sxh qsp> 
 +! Индексы i1  0..3 
 +i1_max=4 ​    
 + 
 +! Индексы i2  0..5 
 +i2_max=6 
 + 
 +! Заполнение данных массива  
 +i1=0 
 +:​ПрыгЗадатьМассив1 
 + i2=0 
 + :​ПрыгЗадатьМассив2 
 + ! Знак двоеточие используется как разделитель  
 + ! между двумя численными индексами переведенными в текст 
 + $ДвумерныйМассивТекстовыйИндекс['<<​i1>>:<<​i2>>'​]='​[<<​i1>>,<<​i2>>​]'​ 
 + ! $МассивИндекс нужен для дальнейшего поиска через ARRPOS/​ARRCOMP 
 + $МассивИндекс['<<​i1>>:<<​i2>>'​]='<<​i1>>:<<​i2>>'​ 
 + ! МассивПорядок нужен для использования KILLVAR 
 + МассивПорядок['<<​i1>>:<<​i2>>'​]=ARRSIZE('​МассивПорядок'​) 
 + ! Добавлять новый элемент и удалять нужно  
 + !только одновременно в 3х массивах 
 +  
 + i2+=1 
 + if i2<​i2_max : Jump '​ПрыгЗадатьМассив2'​ 
 +i1+=1 
 +if i1<​i1_max : Jump '​ПрыгЗадатьМассив1'​ 
 + 
 + 
 +! Вывод данных массива 
 +i1=0 
 +:​ПрыгВыводМассива1 
 + *Nl  
 + i2=0 
 + :​ПрыгВыводМассива2 
 + *P $ДвумерныйМассивТекстовыйИндекс['<<​i1>>:<<​i2>>'​]+' ​ ' 
 + i2+=1 
 + if i2<​i2_max : Jump '​ПрыгВыводМассива2'​ 
 +i1+=1 
 +if i1<​i1_max : Jump '​ПрыгВыводМассива1'​ 
 + 
 +*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]   
 +
 + 
 + 
 +!Получение индексов массива через функцию ARRPOS 
 +$Поиск='​[3,​0]'​ 
 + 
 +N=ARRPOS('​$ДвумерныйМассивТекстовыйИндекс',​$Поиск) 
 +if N<>​-1:​ 
 + !Ищем разделитель ':' ​ в индексе 
 + K=STRPOS($МассивИндекс[N],':'​) 
 + 
 + i1=VAL(MID($МассивИндекс[N],​0,​K-1)) 
 + i2=VAL(MID($МассивИндекс[N],​K+1,​LEN($МассивИндекс[N])-K)) 
 + 
 + *NL $Поиск+'​=[<<​i1>>,<<​i2>>​]'​ 
 +else 
 + *Nl '​Элемент не найден'​ 
 +end 
 + 
 + 
 +!{ Результат  
 +[3,​0]=[3,​0] 
 +
 + 
 +*NL 
 +!Удаление элемента массива через текстовый индекс 
 +$Удалить='<<​i1>>:<<​i2>>'​ 
 +*NL '​Удаляем элемент с индексом <<​i1>>:<<​i2>>'​ 
 + 
 +!Получаем номер элемента 
 + 
 +N=МассивПорядок[$Удалить] 
 + 
 + 
 +!Удаляем элемент 
 +KILLVAR '​$ДвумерныйМассивТекстовыйИндекс',​ N 
 +KILLVAR '​$МассивИндекс',​ N 
 +KILLVAR '​МассивПорядок',​ N 
 + 
 +!Еще раз выводим данные массива 
 + 
 +i1=0 
 +:​ПрыгВыводМассива3 
 + *Nl  
 + i2=0 
 + :​ПрыгВыводМассива4 
 + if $ДвумерныйМассивТекстовыйИндекс['<<​i1>>:<<​i2>>'​]<>'':​ 
 + *P $ДвумерныйМассивТекстовыйИндекс['<<​i1>>:<<​i2>>'​]+' ​ ' 
 + else 
 + *P '​[DEL] ​ ' 
 + end 
 + i2+=1 
 + if i2<​i2_max : Jump '​ПрыгВыводМассива4'​ 
 +i1+=1 
 +if i1<​i1_max : Jump '​ПрыгВыводМассива3'​ 
 + 
 + 
 + 
 +!{ Результат 
 +Удаляем элемент с индексом 3:0 
 +[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]   
 +[DEL]  [3,1]  [3,2]  [3,3]  [3,4]  [3,5]   
 +
 + 
 +</​sxh>​ 
 + 
 +В данном примере использованы функции:​ 
 +      * [[help:​arrays|'​ARRSIZE([$имя])'​]] 
 +      * [[help:​arrays|'​ARRPOS([#​начало],​[$имя_массива],​[значение])'​]] 
 +      * [[help:​arrays|'​KILLVAR [$название массива],​[#​индекс элемента]'​]] 
 +      * [[help:​strings|'​VAL([$стр])'​]] 
 +      * [[help:​strings|'​MID([$стр],​[#​начало],​[#​длина])'​]] 
 +      * [[help:​strings|'​LEN([$стр])'​]] 
 +====Массив переменных==== 
 + 
 +Пример использования индекса в названии массива 
 + 
 +<sxh qsp> 
 +! Индексы i1  0..5 
 +i1_max=6 ​    
 + 
 +! Индексы i2  0..2 
 +i2_max=3 
 + 
 +! Заполнение данных массива  
 +i1=0 
 +:​ПрыгЗадатьМассив1 
 + i2=0 
 + :​ПрыгЗадатьМассив2 
 + !названия заполняемых массивов  
 + !$МассивПеременных0 , $МассивПеременных1 , $МассивПеременных2 
 + DYNAMIC {$МассивПеременных}+i1+{['<<​i2>>'​]='​[<<​i1>>,<<​i2>>​]'​ } 
 + i2+=1 
 + if i2<​i2_max : Jump '​ПрыгЗадатьМассив2'​ 
 +i1+=1 
 +if i1<​i1_max : Jump '​ПрыгЗадатьМассив1'​ 
 + 
 + 
 +! Вывод данных массива 
 +i1=0 
 +:​ПрыгВыводМассива1 
 + *Nl  
 + i2=0 
 + :​ПрыгВыводМассива2 
 + DYNAMIC {*P $МассивПеременных}+i1+{['<<​i2>>'​] +' ​ '}  
 + i2+=1 
 + if i2<​i2_max : Jump '​ПрыгВыводМассива2'​ 
 +i1+=1 
 +if i1<​i1_max : Jump '​ПрыгВыводМассива1'​ 
 + 
 +!{ Результат  
 +[0,0]  [0,1]  [0,2]   
 +[1,0]  [1,1]  [1,2]   
 +[2,0]  [2,1]  [2,2]   
 +[3,0]  [3,1]  [3,2]   
 +[4,0]  [4,1]  [4,2]   
 +[5,0]  [5,1]  [5,2]    
 +
 + 
 +</​sxh>​ 
 + 
 +В данном примере использованы функции:​ 
 + 
 +      * [[help:​dynamical|'​DYNAMIC [$код],​[параметр 1],​[параметр 2], …'​]] 
 + 
 + 
 +---- 
 +[[howto:​start|Назад:​ Как сделать]]
howto/arrays.1427853839.txt.gz · Последние изменения: 2015/04/01 05:03 (внешнее изменение)