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

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


help:arrays

Различия

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

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

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:arrays [2014/12/02 16:46]
asv ====Массив переменных====
help:arrays [2026/01/31 12:09] (текущий)
aleks_versus
Строка 1: Строка 1:
 [[help:​coding|Назад:​ Программный код]] [[help:​coding|Назад:​ Программный код]]
-=====Массивы===== 
  
-  * **//Массив//** - последовательный набор значений, имеющих один тип данных и обладающих одним названием. +====== ​Массивы ​====== 
-  * Элементы массива идентифицируются по индексам+ 
-    * Индексация ведётся ​с нуля. Т.е. элемент с индексом **0** - //первый// элемент массива, **1** - //второй// и т.д. +===== Зачем нужны массивы ===== 
-    * Максимальный индекс массива **2147483647**. + 
-  * Обращение к элементу массива происходит так: сначала указывается название массива, затем в квадратных ​скобках - числовое выражение, равное индексу элемента,​ к которому производится обращение. +Иногда нам становится неудобно хранить множество однотипных значений в разных переменных. Например, у нас есть двадцать "​железных ​мечей" ​и для каждого мы прописали урон в двадцати разных ​переменных: 
-  * На самом деле __//каждая переменная//__ в QSP __//​является массивом//​__.<sxh qsp> + 
-яблоки ​0 +<sxh qsp> 
-!эквивалентно +меч_железный_1 ​23 
-яблоки[0] ​0+меч_железный_2 = 34 
 +меч_железный_3 = 27 
 +... 
 +меч_железный_19 = 7 
 +меч_железный_20 ​41
 </​sxh>​ </​sxh>​
-  * Соответственно для текстового массива нужно не забывать использовать символ '​**$**'​ в имени. 
-  * //​**Примеры:​**//<​sxh qsp> 
-$яблоки[0]='​антоновка'​ 
-$яблоки[1]='​белый налив'​ 
-$яблоки[2]='​астраханское'​ 
-$яблоки[3]='​ранетка'​ 
-$яблоки[4]='​симиренко'​ 
  
-сортблока[0] = 1 +Даже для того, чтобы просто вывести на экран данную характеристику для каждого меча, нам придётся написать двадцать строчек кода, почти ничем не отличающихся:​
-сорт_яблока[1] = 2 +
-сорт_яблока[2] = 4+
  
-*pl $яблоки[сорт_яблока[номер_яблока]]+<sxh qsp> 
 +*pl "​Меч железный №1. Урон: "​+$str(меч_железный_1) 
 +*pl "​Меч железный №2. Урон: "​+$str(меч_железный_2) 
 +*pl "​Меч железный №3. Урон: "​+$str(меч_железный_3) 
 +... 
 +*pl "​Меч железный №19. Урон: "​+$str(меч_железный_19) 
 +*pl "​Меч железный №20. Урон: "​+$str(меч_железный_20)
 </​sxh>​ </​sxh>​
-  * Массивы могут индексироваться через строки. Регистр символов данной строки не имеет значения. Примеры:<​sxh qsp> 
-$любимый_сорт['​иван'​] = $яблоки[2] 
-любимое_число['​Алексей'​] = 5 
-$item_loc['​палка'​] = '​лес'​ 
-</​sxh>​ 
-  * Существует упрощённый синтаксис чтения последнего и добавления нового элемента в массив. Если индекс элемента не указан:​ 
-    * при записи будет выбран элемент,​ следующий за последним. Например:​ <sxh qsp> 
-$objs[] = '​Напильник'​ &! Если массив был пустой,​ то 
-$objs[] = '​Топор' ​    &​! [0] = '​Напильник',​ 
-$objs[] = '​Доска' ​    &​! [1] = '​Топор',​ [2] = '​Доска'</​sxh> ​ 
-    * при чтении будет выбран последний элемент. Например:​ <sxh qsp> 
-$a = $objs[] &! '​Доска'​ из примера выше 
-a = сорт_яблока[] &! 4 из примера выше</​sxh>​ 
  
-**Примечание:** При добавлении в массив элемента со строковым индексом((массив['​строка'] = значение)) элемент добавляется ​в конец массива. //Настоятельно __не__ ​рекомендуется сочетать числовые и строковые индексы в пределах одного массива.//+Всё бы ничегоно что если нам нужно найти ​среди всех ​этих переменных ​ту, которая содержит ​максимальное число (мы ведь хотим пользоваться самым хорошим мечом)? Тут нам придётся городить огромную конструкцию условий, которая сравнивает каждую ​переменную со всеми остальными,​ и объём необходимого ​нам кода возрастает многократно.
  
-**Примечание:** В силу особенностей платформы числовые и текстовые массивы связаны между ​собой: добавление элемента в //'массив'// добавляет пустой элемент в //'$массив'//​ и наоборот со всеми вытекающими последствиями.+Даесть некоторые варианты решения этих двух задач без использования массивов, но они ​тоже весьма сложны. Куда как проще работать ​с однотипными данными, если они представлены в форме массива.
  
-**Примечание:** Настоятельно ​__не__ рекомендуется использовать большие числовые индексы без необходимости.+Если переменную мы можем вообразить в виде ​отдельной маленькой коробки, в которую ​можно положить лишь одно ​значение,​ то массив — это большой шкаф, со множеством пронумерованных ящиков (ячеек), в каждый из которых мы можем положить по одному значению.
  
-====Функции и операторы====+===== Что такое ​массивы =====
  
-  ​* **KILLVAR** //​[$название массива]//,//​[#​индекс элемента]// ​удаление ​элемента массива.  +**Массив** в **QSP** ​это последовательный набор значенийзаписанных под одним общим именем. 
-    * Если индекс элемента не указан,​ то удаляется весь массив.  + 
-    * Если ​оператор вызван без ​аргументовто удаляются все переменные +Например, вместо того, чтобы помещать урон каждого железного ​меча в отдельную переменную, мы заводим массив, и размещаем значения уронов от разных мечей в ячейках этого массива. 
-    * **KILLALL** - оператор эквивалентен конструкции "​KILLVAR & KILLOBJ"​((обычно применяется в начале игры, чтобы при возврате в начальную локацию после неудачного прохождения какогоо этапа игры обнулить все ​переменные (в противном случае, может оказаться, ​что запертые двери уже открыты, жена похищена до свадьбы, а Баба-Яга уже ​отдала кому-то нужный ​клубочек) )) + 
-    * При удалении ​элемента все следующие за ним элементы сдвигаются на позицию вверх.<​sxh qsp> +Имена переменных и имена массивов записываются похожим образом. Единственное отличие в том, что когда мы обращаемся к массиву — возле его имени в квадратных скобках ставим номер одной из ячеек
-a[0]=4 + 
-a[1]=3 +<sxh qsp> 
-a[2]=23 +мечелезный[0] = 23 & ! нумерация ячеек массива ​начинается ​с нуля 
-a[3]=15 +меч_железный[1] = 34 
-KILLVAR '​a',​1 +меч_железный[2] = 27 
-!теперь ​массив ​выглядит так: +... 
-a[0]=4 +меч_железный[18= 7 
-a[1]=23 +меч_железный[19] = 41 & ! значение для ​двадцатого меча лежит в ячейке под номером 19
-a[2]=15 +
-</​sxh>​ +
-    * //Примеры://<​sxh qsp> +
-KILLVAR &! удаляет все ​переменные, массивы +
-KILLVAR '​a'​ &! удаляет ​массив ​'​a'​ +
-KILLVAR '​a',​3 &! удалит из массива '​a'​ элемент с индексом 3. +
-</​sxh>​ +
-  * **COPYARR** //[$приёмник]//​**,​**//​[$источник]//​**,​**//​[#​начало]//​**,​**//​[#​количество]// - копирование в массив-приёмник //​[#​количество]// элементов из массива-источника начиная с элемента под ​номером //[#начало]//. Размер массива-приёмника при копировании не имеет ​значения+
-    * Параметр //​[#​количество]// является необязательным. По умолчанию - до конца ​массива-источника. +
-    * Параметр //[#начало]// является необязательным. По умолчанию - 0 +
-    * В силу особенностей движка при копировании массива //'​массив1'// в //'массив2'//​ копируется также //'​$массив1'//​ в //'​$массив2'//​. +
-    * //Примеры://<sxh qsp> +
-COPYARR '​$a','​$b'​ +
-COPYARR '​a','​b'​ +
-COPYARR $arrname1,​$arrname2,​10,​5 +
-COPYARR '​a<<​$arrname1>>','​a<<​$arrname2>>'​ +
-</​sxh>​ +
-  * **ARRSIZE(**//​[$имя]//**)** - функция возвращает число элементов в массиве с названием //[$имя]//. +
-    * В силу особенностей движка возвращается наибольшее из числа элементов '//​массива//'​ и '//​$массива//'​. +
-    * //Примеры://<​sxh qsp> +
-n = ARRSIZE('​a'​) +
-n = ARRSIZE('​$a'​) +
-езультат будет ​одинаковый+
 </​sxh>​ </​sxh>​
-  * **ARRPOS(**//​[#​начало]//,//​[$имя_массива]//,//​[значение]//​**)** - возвращает индекс элемента массива,​ равного значению. Поиск начинается с элемента с заданным номером;​ индексация элементов массива ведётся с нуля. Если указанное значение не найдено,​ функция возвращает **-1**. 
-    * Параметр //​[#​начало]//​ может отсутствовать,​ при этом он принимается равным **0**. 
-    * **Важно:​** в более новых версиях (//Quest Navigator//​) необязательный параметр //​[#​начало]//​ переставлен последним((**ARRPOS(**//​[$имя_массива]//​**,​**//​[значение]//​**,​**//​[#​начало]//​**)**)). 
-    * //​Примеры://<​sxh qsp> 
-!Поиск строки '​This'​ в текстовом массиве "​$A"​ 
-ARRPOS(0,'​$A','​This'​) 
-!Поиск числа 65 в массиве "​A"​ (два элемента массива игнорируются) 
-ARRPOS(2,'​A',​65) 
-!Поиск строки '​test'​ среди значений массива "​$B"​ 
-ARRPOS('​$B','​test'​) 
-</​sxh>​ 
-  * См. также функции "​**MAX**,​ **MIN**"​ ([[help:​coding?&#​bazovye_funkcii|Программный код]]) 
-  * **ARRCOMP(**//​[#​начало]//,//​[$имя_массива]//,//​[$шаблон]//​**)** - возвращает индекс элемента массива,​ соответствующего //​__регулярному выражению__//​. Поиск начинается с элемента с заданным номером;​ индексация элементов массива ведётся с нуля. Если указанное значение не найдено,​ функция возвращает **-1**. 
-    * Поиск работает только по текстовым массивам (символ '​$'​ в названии можно опустить). 
-    * Параметр //​[#​начало]//​ может отсутствовать,​ при этом он принимается равным **0**. 
-    * **Важно:​** в более новых версиях (//Quest Navigator//​) необязательный параметр //​[#​начало]//​ переставлен последним((**ARRCOMP(**//​[$имя_массива]//​**,​**//​[$шаблон]//​**,​**//​[#​начало]//​**)**)). 
-    * //​Примеры://<​sxh qsp> 
-!Поиск строки '​This'​ среди элементов массива "​$A"​ 
-ARRCOMP(0,'​A','​This'​) 
-!'​Поиск строки,​ соответствующей регулярному выражению "​abc\d+"​ 
-(первые два элемента массива игнорируются)'​ 
-ARRCOMP(2,'​A','​abc\d+'​) 
-!'​аналогично предыдущему примеру,​ но поиск осуществляется 
-по всем элементам массива'​ 
-ARRCOMP(0,'​A','​.*string.*'​) ​ 
  
-ARRCOMP('A','This'​) ​&​! ​эквивалентно ​1му варианту+Из этого примера видно, чтобы записать значение в отдельную ячейку массива,​ мы должны:​ 
 + 
 +  * Написать имя массива;​ 
 +  * затем без пробелов,​ не отступая от имени массива,​ в квадратных скобках написать номер ячейки,​ в которую хотим записать значение;​ 
 +  * затем поставить знак ​''​**=**'' ​(операция присваивания)
 +  * и уже после знака **равно** написать нужное значение. 
 + 
 +В нашем примере массив называется "​меч_железный",​ а в квадратных скобках мы указываем номера ячеек ​этого массива. 
 + 
 +==== Создание массива ==== 
 + 
 +Записывая значения хотя бы в одну ячейку массива, мы тем самым **создаём** (инициализируем) ​весь массив. 
 + 
 +  * Ячейки массива так же называются **элементами**. 
 +  * Любой массив состоит из одного или ​множества элементов,​ и у каждого элемента есть собственный номер. 
 +  * Номера элементов начинаются с нуля и не повторяются. 
 +  * Нумерация элементов массива не прерывается. То есть, например,​ не может в массиве существовать четвёртый элемент,​ но отсутствовать второй и третий. Если мы создадим только нулевой и первый,​ а так же четвёртый,​ элементы массива,​ второй и третий — будут созданы автоматически:​ <sxh qsp> 
 +mass[0]=13 
 +mass[1]=19 
 +mass[4]=23 
 +! элементы mass[2] и mass[3] созданы автоматически и хранят значения по умолчанию (т.е. 0)
 </​sxh>​ </​sxh>​
 +  * Максимальный возможный номер ячейки массива ''​**2147483647**''​.
 +  * Минимально возможный номер ячейки массива ''​**0**''​. QSP не допускает создания ячеек с отрицательным индексом и не работает с такими ячейками. Плеер игнорирует команды присвоения,​ и возвращает значение по умолчанию при попытке обратиться к такой ячейке.
  
-====Двумерные массивы с числовыми индексами====+==== Типы данных в массивах ====
  
-Пример симуляции двумерного массива+Массив можно представить себе как **список** значений. Если вам нужно хранить только одно значение, достаточно обычной переменной,​ но если ​вам нужно сохранить ​множество значений,​ как некий список, то обязательно используйте ​массив. Например,​ вы можете вести список имён всех встреченных персонажей:​
  
 <sxh qsp> <sxh qsp>
-! Индексы ​i1  0..8 +$встреченные_неписи[0] = "​Домовёнок Нафаня"​ 
-i1_max=9    ​+стреченные_неписи[1] = "​Девочка Оля"​ 
 +$встреченные_неписи[2] ​"​Лариса Петровна"​ 
 +$встреченные_неписи[3] = "​Баба Яга"​ 
 +</​sxh>​
  
-! Индексы i2  0..+В данном примере мы помещали в массив строковые значения.
-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'+
  
 +То же самое и в случае,​ когда мы хотим получить значение из ячейки массива:​
  
-! Вывод данных ​массива +если мы хотим получить ​строковое значение, нужно поставить ​символ ''​**%%$%%**'' ​перед именем массива.
-i1=0 +
-рыгВыводМассива1 +
- *Nl  +
- i2=0 +
- :​ПрыгВыводМассива+
- *P $ДвумерныйМассив[i1*i2_max+i2]+' ​ ' +
- i2+=1 +
- if i2<​i2_max : Jump 'ПрыгВыводМассива2'​ +
-i1+=1 +
-if i1<​i1_max : Jump '​ПрыгВыводМассива1' +
-*Nl +
  
-!{Результат ​ +И точно так же это работает для числовых значений и [[help:​tuples|кортежей]]: 
-[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+Примеры:
  
-$Поиск='[2,5]'+<sxh qsp> 
 +$яблоки[0]='​антоновка' 
 +$яблоки[1]='белый налив'​ 
 +$яблоки[2]='​астраханское'​ 
 +$яблоки[3]='​ранетка'​ 
 +$яблоки[4]='​симиренко'
  
-i1=ARRPOS('​$ДвумерныйМассив',​$Поиск)/i2_max +сорт_яблока[0] 
-i2=ARRPOS('​$ДвумерныйМассив',​$Поиск) mod i2_max+сорт_яблока[1] = 2 
 +сорт_яблока[2] = 4
  
-if ARRPOS('​$ДвумерныйМассив',$Поиск)<>​-: +%сорта_ворзине[0] = [1, 4] 
-  *Nl $Поиск+'=[<<​i1>>​,<<​i2>>​]' ​ +%сорта_в_корзине[1] ​= [24
-else  +%сорта_в_корзине[2] = [12]
- *Nl '​Элемент не найден+
-end +
-!{Результат  +
-[2,5]=[2,5] +
-}+
  
 +*pl $яблоки[сорт_яблока[номер_яблока]]
 </​sxh>​ </​sxh>​
  
 +**В одном массиве** допускается хранить значения любых типов, однако строго рекомендуем хранить в одном массиве только значения одного типа: либо строковые,​ либо числовые,​ либо кортежи,​ — во избежание возможных [[glossary:​bag|багов]].
  
 +**В одной ячейке массива** можно хранить значение только одного типа! Если вы запишете в ячейку,​ которая хранит строку,​ числовое значение — это числовое значение "​затрёт"​ строковое. И точно так же со значением любого другого типа.
  
 +==== Обработка массивов ====
  
 +Преимущество работы с массивами по сравнению с обычными переменными раскрывается,​ когда нам приходится много раз повторять одну и ту же операцию над похожими значениями.
  
-====Двумерные массивы с текстовыми индексами====+В примере из начала статьи мы помещали наносимый железным мечом урон для двадцати разных мечей в двадцать отдельных переменных и видели,​ что даже такая простая операция, как ​вывод значений всех этих переменных на экран требует огромного количества кода. Совсем другое дело, когда мы поместили наши ​данные в массив, ведь мы можем перебрать весь ​массив с помощью простого цикла:
  
-Пример работы с массивом имеющим текстовые индексы 
 <sxh qsp> <sxh qsp>
-Индексы ​i1  0..3 +меч_железный[0] = 23 & ! нумерация ячеек массива начинается с нуля 
-i1_max=4    ​+меч_железный[1] = 34 
 +меч_железный[2] = 27 
 +... 
 +меч_железный[18] ​
 +меч_железный[19] = 41 & ! значение для двадцатого меча лежит в ячейке под номером 19
  
-Индексы i2  ​0..5 +выводим на экран ​список с помощью цикла 
-i2_max=6+loop i=while i<20 step i+=1: 
 +  *pl "​Меч железный №<<​i+1>>​Урон: "​+$str(меч_железный[i]) 
 +end 
 +</​sxh>​
  
-! Заполнение данных массива  +В этом примере для вывода на экран всех значений из всех двадцати ячеек ​массива нам потребовалось написать всего три строчки ​кода.
-i1=0 +
-:ПрыгЗадатьМассив+
- 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'​+
  
 +А вот как выглядит поиск железного меча с наибольшим значением урона:
  
-! Вывод данных массива +<sxh qsp> 
-i1=0 +pos = arrpos('​меч_железный', max('​меч_железный'​)) 
-:​ПрыгВыводМассива1 +*pl "Наибольший урон имеет Меч железный <<pos+1>>: ​"+$str(меч_железный[pos]) 
- *Nl  +</sxh>
- 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 +<sxh qsp> 
-$Поиск='[3,0]'+ячейки массивов ​индексируются ​через ​числа 
 +$любимый_сорт[3] = $яблоки[2] 
 +любимое_число[19] ​
 +$item_loc[0] 'лес'​ 
 +</​sxh>​
  
-N=ARRPOS('​$ДвумерныйМассивТекстовыйИндекс',​$Поиск) +**Важно!** Настоятельно не рекомендуем использовать большие числовые индексы без необходимости.
-if N<>​-1:​ +
- !Ищем разделитель ':'  ​в индексе +
- K=STRPOS($МассивИндекс[N],':'​)+
  
- i1=VAL(MID($МассивИндекс[N],0,K-1)) +**QSP** позволяет создавать для элементов массивов не только числовыено и строковые индексы. Иными словами массивы могут //индексироваться через строки//​. Примеры:​
- i2=VAL(MID($МассивИндекс[N],​K+1,​LEN($МассивИндекс[N])-K))+
  
- *NL $Поиск+'=[<<​i1>>,<<​i2>>​]' +<sxh qsp> 
-else +! ячейки массивов индексируются через строки 
- *Nl 'Элемент не найден+$любимый_сорт['Иван'​] ​$яблоки[2
-end+любимое_число['​Алексей'] = 5 
 +$item_loc['​палка'​] = 'лес
 +</​sxh>​
  
 +Регистр символов в строковом индексе массива значения не имеет:
  
-!{ Результат  +<sxh qsp> 
-[3,0]=[3,0+$любимый_сорт['иван'] = 'Антоновка'​ 
-}+*pl $любимый_сорт['​ИВАН'​& ! выведет строку Антоновка 
 +</​sxh>​
  
-*NL +Есть ​небольшая хитрость ​в том, как назначаются строковые индексы ячейкам массивов. Когда вы инициализируете (создаёте, объявляетеновую ячейку массива со строковым ​индексом, происходит следующее:
-!Удаление элемента массива ​через текстовый индекс +
-далить='<<​i1>>:<<​i2>>'​ +
-*NL 'Удаляем элемент с индексом ​<<​i1>>​:<<​i2>>'​+
  
-!Получаем номер ​элемента+  * Плеер создаёт новую ячейку с новым числовым индексом, следующим по порядку. Например, если в массиве уже были созданы три ячейки,​ создаётся ячейка с числовым индексом ''​%%3%%''​. 
 +  * Затем плеер "​прикрепляет"​ указанный строковый индекс к этой ячейке.
  
-N=МассивПорядок[$Удалить]+Поэтому,​ если вы создаёте ячейку со строковым индексом, вы можете получать из неё значения в том числе и по числовому индексу:​
  
 +<sxh qsp>
 +яблоки['​у Паши'​]=37
 +яблоки['​у Даши'​]=19
 +яблоки['​у Лёши'​]=11
 +*pl яблоки[0] & ! выведет на экран число 37
 +*pl яблоки[1] & ! выведет на экран число 19
 +*pl яблоки[2] & ! выведет на экран число 11
 +</​sxh>​
  
-!Удаляем элемент +**Настоятельно рекомендуется** использовать для индексирования или только числовые, или только строковые индексы.
-KILLVAR '$ДвумерныйМассивТекстовыйИндекс', N +
-KILLVAR '​$МассивИндекс'+
-KILLVAR '​МассивПорядок', N+
  
-!Еще ​раз выводим данные массива+Строковые индексы позволяют обойти ограничение массивов на начало нумерации только с нуля:
  
-i1=0 +<sxh qsp> 
-:​ПрыгВыводМассива3 +$item['​-2'​]='Палка' 
- *Nl  +$item['-1']='Дрель
- i2=+$item['0'​]='​Радиоактивный пепел
- :ПрыгВыводМассива4 +</sxh>
- if $ДвумерныйМассивТекстовыйИндекс['<<​i1>>:<<​i2>>​']<>''​: +
- *P $ДвумерныйМассивТекстовыйИндекс['<<​i1>>:<<​i2>>​']+' ​ ' +
- else +
- *P '​[DEL] ​ ' +
- end +
- i2+=+
- if i2<​i2_max : Jump 'ПрыгВыводМассива4+
-i1+=1 +
-if i1<i1_max : Jump '​ПрыгВыводМассива3'​+
  
 +==== Многомерные массивы ====
  
 +Начиная с плееров версии 5.8.0 вы можете создавать в QSP [[help:​multid_array|многомерные массивы]].
  
-!{ Результат +==== Упрощённый ​доступ к ячейкам массивов ====
-Удаляем ​элемент ​с индексом 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]   +
-}+
  
 +На самом деле каждая переменная в QSP является массивом,​ состоящим из одной единственной ячейки:​
 +
 +<sxh qsp>
 +яблоки = 0
 +!эквивалентно
 +яблоки[0] = 0
 </​sxh>​ </​sxh>​
  
 +то есть, если мы создаём переменную с именем "​яблоко",​ мы тем самым создаём массив с именем "​яблоко",​ состоящий из одной ячейки.
  
-====Массив переменных==== +Таким образом вы всегда ​можете получить или присвоить данные нулевой ячейке ​массива, просто указав его имя:
- +
-Пример использования индекса в названии ​массива+
  
 <sxh qsp> <sxh qsp>
-Индексы i1  ​0..5 +присваиваем ​нулевой ячейке массива '​$COUNTER'​ строковое значение 
-i1_max=6    ​+$usercom = '​строка_ввода'​ 
 +*pl $usercom[0] & ! проверяем 
 +! присваиваем нулевым ячейкам массивов red, green, blue значения 
 +set red[0], green[0], blue[0] ​234,​198,​77 
 +*pl "red: <<​red>>,​ green: <<​green>>,​ blue: <<​blue>>"​ & ! проверяем 
 +</​sxh>​
  
-! Индексы i2  0..2 +Существует упрощённый синтаксис чтения последнего и добавления нового элемента в массивДля этого квадратные скобки пишутся без указания индекса:​
-i2_max=3+
  
-! Заполнение данных ​массива  +  * при записи значения в массив ​будет создан новый элемент сразу за последним. Например: <sxh qsp> 
-i1=0 +Если массив ​был пустойто 
-:​ПрыгЗадатьМассив1 +$objs[] = 'Напильник' &​! ​$objs[0] = 'Напильник'​ 
- i2=0 +$objs[] = 'Топор' ​&! $objs[1] = 'Топор'​ 
- :​ПрыгЗадатьМассив+$objs[] 'Доска'​ &! $objs[2] ​'​Доска'​ 
- !названия ​заполняемых массивов ​ +</sxh> 
- !$МассивПеременных0 , $МассивПеременных1 , $МассивПеременных2 +  * при получении значения из массива ​будет выбран последний элемент. Например:​ <sxh qsp> 
- DYNAMIC {$МассивПеременных}+i1+{['<<​i2>>​'​]='​[<<​i1>>,<<​i2>>​]' ​+*pl $objs[] &! 'Доска' ​из примера ​выше 
- i2+=1 +</​sxh>​
- if i2<i2_max : Jump 'ПрыгЗадатьМассив2' +
-i1+=1 +
-if i1<​i1_max : Jump '​ПрыгЗадатьМассив1'+
  
 +===== Функции и операторы для работы с массивами =====
  
-! Вывод данных массива +  * ''​**KILLVAR** [$имя_массива], [индекс_элемента]''​ - удаление элемента с индексом ''​%%[индекс_элемента]%%''​ из массива с названием ''​%%[$имя_массива]%%''​. Название массива всегда нужно писать в кавычках. Пример: <sxh qsp> 
-i1=0 +! удаление по числовому индексу 
-рыгВыводМассива1 +killvar '​яблоко',​3 
- *Nl  +! удаление элемента по строковому индексу 
- i2=+killvar '​$item_loc','​палка'​ 
- :ПрыгВыводМассива2 +! удаление элемента по многомерному индексу (кортежу) 
- DYNAMIC {*$МассивПеременных}+i1+{['<<i2>>'] +' ​ ' +killvar '​$space',​[0,​-2,​9] 
- i2+=1 +%map_point ​[0, -2, 13] 
- if i2<i2_max : Jump '​ПрыгВыводМассива2+killvar '​$space',​ %map_point 
-i1+=1 +</​sxh>​ 
-if i1<i1_max : Jump 'ПрыгВыводМассива1'+    * Если индекс элемента не указан,​ то удаляется весь массив. <sxh qsp> 
 +! удаляем массив $map целиком 
 +killvar '​$map'​ 
 +</​sxh>​ 
 +    * Если оператор вызван без аргументов, то удаляются все массивы и переменные в игре! <sxh qsp> 
 +! удаляем все массивы и переменные 
 +KILLVAR 
 +</​sxh>​ 
 +    При удалении элемента все следующие за ним элементы сдвигаются на позицию вверх. <sxh qsp> 
 +a[0]=4 
 +a[1]=3 
 +a[2]=23 
 +a[3]=15 
 +KILLVAR '​a',​1 
 +!теперь массив выглядит так: 
 +a[0]=4 
 +a[1]=23 
 +a[2]=15 
 +</​sxh>​ 
 +  * ''​**KILLALL**''​ - оператор эквивалентен конструкции "''​%%KILLVAR & KILLOBJ%%''",​ то есть удаляет все переменные/​массивы в игре, а так же очищает Окно предметов. Обычно применяется ​в начале игры, чтобы при возврате в начальную локацию после неудачного прохождения какого-то этапа игры обнулить все переменные (в противном ​случае, может оказаться,​ что запертые двери уже открыты,​ жена похищена до свадьбы, а Баба-Яга уже отдала кому-то нужный клубочек). 
 +  ''​**COPYARR** [$приёмник],​[$источник],​[#​начало],​[#​количество]''​ - копирование в массив-приёмник ''​%%[#​количество]%%''​ элементов из массива-источника начиная с элемента под номером ''​%%[#​начало]%%''​. Размер массива-приёмника при копировании не имеет значения. 
 +    * Параметр ''​%%[#​количество]%%''​ является необязательным. По умолчанию - до конца массива-источника. 
 +    * Параметр ''​%%[#​начало]%%'' является необязательным. По умолчанию - ''​%%0%%''​. 
 +    * Не имеет значения,​ указываете ли вы ''​%%$%%''​ или ''​%''​ перед названием массива,​ или нет. Копируются элементы с любыми типами значений. 
 +    * Примеры: ​<sxh qsp> 
 +COPYARR ​'$a','$b
 +COPYARR '​a','​b'​ 
 +! $arrname1, $arrname2 ​'​arr',​ '​bar'​ 
 +COPYARR $arrname1,​$arrname2,​10,​5 
 +COPYARR 'a<<​$arrname1>>​','​a<<​$arrname2>>'​ 
 +</​sxh>​ 
 +  * ''​**SORTARR** [$имя_массива],​ [#​порядок]''​ — Данный оператор сортирует указанный массив. ​Параметр ''​%%[#​порядок]%%''​ опционален. Если не указан или равен 0, то сортирует массив по возрастанию (от меньшего к большему). Если равен 1, то сортирует массив по убыванию (от большего к меньшему). 
 +    * Может сортировать массивы любых типов (числа,​ строки, кортежи),​ но не допускается смешивать значения разных типов в одном массиве. 
 +    * Для указания типа сортируемых значений нужно указать префикс типа как часть имени массива (''​%%$%%'',​ ''​%''​). 
 +    * Пример сортировки текстового массива:​ <sxh qsp> 
 +$a[] = '​nn'​ 
 +$a[] = '​zz'​ 
 +$a[] = '​aa'​ 
 +sortarr '​$a'​ 
 +!проверяем результат сортировки:​ 
 +loop local i=0 while i<​arrsize('​$a'​) step i+=1
 +  *pl $a[i] 
 +end 
 +</sxh> 
 +  * ''​**SCANSTR** [$имя_массива],​ [$текст_для_разбора],​ [$регэксп],​ [#​номер_группы]''​ — в массив ''​%%[$имя_массива]%%''​ помещаются строки,​ соответствующие [[help:​regexp|регулярному выражению]] ''​%%[$регэксп]%%'',​ которые будут найдены в строке ''​%%[$текст_для_разбора]%%''​. Если указан параметр ''​%%[#​номер_группы]%%'',​ в массив ​будет помещаться не вся строка,​ соответствующая регулярному выражению,​ а лишь часть, соответствующая указанной группе в этом регулярном выражении. Примеры:​ <sxh qsp> 
 +! вытаскиваем из строки все слова:​ 
 +$text = '​Шла Саша по шоссе, а Грека через реку.'​ 
 +scanstr '​$words',​ $text, '​\b\w+\b'​ 
 +!В массиве $words окажутся значения:​ '​Шла',​ '​Саша',​ '​по',​ '​шоссе',​ '​а',​ '​Грека',​ '​через',​ '​реку'
  
-!{ Результат  +разбиваем строку по разделителю: 
-[0,0]  [0,1]  ​[0,2  +$text = 'утро|день|вечер|ночь' ​ 
-[1,0]  [1,1]  [1,2]   +scanstr '​$words'​$text'[^|]+' 
-[2,0]  [2,1]  [2,2]   +!В массиве $words окажутся значения:​ '​утро'​'​день'​'​вечер'​'​ночь'​
-[3,0]  [3,1]  [3,2]   +
-[4,0]  [4,1]  [4,2]   +
-[5,0]  [5,1]  [5,2]    +
-}+
  
 +! вытаскиваем из строки все слова, помещённые в квадратные скобки,​ но без квадратных скобок:​
 +$text = '​[first] ignoredtext [second][third] also ignored' ​
 +scanstr '​$words',​ $text, '​\[(.*?​)\]',​ 1
 +!В массиве $words окажутся значения:​ '​first',​ '​second',​ '​third'​
 </​sxh>​ </​sxh>​
 +  * ''​**ARRITEM(**[$имя_массива],​[индекс_элемента]**)**''​ — возвращает значение элемента массива с названием ''​%%[$имя_массива]%%''​ по указанному индексу. То есть функция извлекает значение из указанной ячейки массива. Примеры:​ <sxh qsp>
 +! выводим значение элемента с индексом 3
 +*pl $arritem('​$mass',​ 3)
 +! выводим значение элемента с текстовым индексом
 +*pl $arritem('​$mass',​ '​Петя'​)
 +! выводим значение элемента с многомерным индексом
 +*pl $arritem('​$mass',​ [-2, 9, 0])
 +</​sxh>​ Эта функция может быть полезна для извлечения значений,​ если имя массива заранее не известно. Пример:​ <sxh qsp>
 +! выводим содержимое нескольких массивов без использования ''​**DYNAMIC**'':​
 +$array_name[]='​mass_1'​
 +$array_name[]='​mass_2'​
 +$array_name[]='​mass_3'​
 +$array_name[]='​mass_4'​
 +$array_name[]='​mass_5'​
 +! внешний цикл перебирает имена массивов
 +loop local j=0 while j<​arrsize('​$array_name'​) step j+=1:
 +    ! внутренний цикл выводит содержимое массивов
 +    loop local i=0 while i<​arrsize($array_name[j]) step i+=1:
  
 +   *pl arritem($array_name[j],​ i)
 +    end
 +end
 +</​sxh>​
 +  * ''​**SETVAR** [$имя_массива],​ [значение],​ [индекс]''​ — устанавливает значение элемента массива с названием ''​%%[$имя_массива]%%''​ по указанному индексу. То есть оператор присваивает значение указанной ячейке массива. Префикс имени переменной указывает тип значения,​ которое нужно записать в элемент массива (как с обычными присваиваниями). Параметр ''​[индекс]''​ опционален. Если этот параметр не указан,​ то значение присваивается 0-му элементу. Значение и индекс могут быть любых типов. Примеры:​ <sxh qsp>
 +SETVAR '​A',​ 65
 +SETVAR '​$X',​ '​name',​ 4
 +SETVAR '​$X',​ '​name',​ '​string index'
 +SETVAR '​%Q',​ ['​пример',​ '​кортежа'​],​ 3
 +SETVAR '​%Q',​ ['​пример',​ '​кортежа'​],​ [x, y]
 +</​sxh>​ Данный оператор дополняет функцию ''​**ARRITEM**''​ и позволяет избегать использования ''​DYNAMIC''​ в некоторых случаях.
 +  * ''​**ARRSIZE(**[$имя_массива]**)**''​ - функция возвращает число элементов массива с названием ''​%%[$имя_массива]%%''​.
 +    * Не имеет значения,​ указываете ли вы ''​%%$%%''​ или ''​%%%%%''​ перед названием массива или нет. Подсчитывается общее число ячеек и со значениями любых типов.
 +    * Примеры:​ <sxh qsp>
 +n = ARRSIZE('​a'​)
 +n = ARRSIZE('​$a'​)
 +!Результат будет одинаковый
 +</​sxh>​
 +  * ''​**ARRTYPE(**[$имя_переменной],​ [индекс]**)**''​ - получает тип значения,​ которое хранится в массиве ''​%%[$имя_переменной]%%''​ под индексом ''​[индекс]''​.
 +    * Параметр ''​%%[индекс]%%''​ может отсутствовать,​ при этом он принимается равным ''​0''​. То есть вычисляется тип значения переменной/​нулевой ячейки массива. Индекс может быть любого типа.
 +    * Функция возвращает одно из следующих значений в зависимости от типа:
 +      * ''​%%''​%%''​ (пустая строка) - элемент массива не задан.
 +      * ''​%%'#'​%%''​ - элемент содержит число.
 +      * ''​%%'​$'​%%''​ - элемент содержит строку.
 +      * ''​%%'​%'​%%''​ - элемент содержит кортеж.
 +    * Пример:​ <sxh qsp>
 +$ddd = '​text'​
 +$arrtype('​ddd'​) & ! '​$'​
 +
 +$g = '​text'​ & g = 13
 +$arrtype('​g'​) & ! '#'​
 +
 +%tuple['​index'​] = [12, '​string'​]
 +$arrtype('​tuple',​ '​index'​) & ! '​%'​
 +
 +! $empty not exist
 +$arrtype('​$empty'​) & ! ''​
 +</​sxh>​
 +  * ''​**ARRPOS(**[$имя_массива],​ [значение],​ [#​старт]**)**''​ — возвращает индекс элемента массива равного указанному значению.
 +    * Поиск начинается с элемента с заданным номером ''​[#​старт]''​.
 +    * Индексация элементов массива ведётся с нуля.
 +    * Если указанное значение не найдено,​ функция возвращает -1.
 +    * Пример:​ <sxh qsp>
 +$color[0] = '​красный'​
 +$color[1] = '​жёлтый'​
 +$color[2] = '​зелёный'​
 +$color[3] = '​синий'​
 +$color[4] = '​жёлтый'​
 +
 +arrpos('​$color',​ '​жёлтый'​) & ! вернёт значение 1
 +arrpos('​$color',​ '​жёлтый',​ 2) & ! вернёт значение 4
 +arrpos('​$color','​голубой'​) & ! вернёт значение -1
 +</​sxh>​
 +    * Другие примеры:​ <sxh qsp>
 +! поиск строки '​this'​ в текстовом массиве "​$a"​
 +arrpos('​$a',​ '​this',​ 0)
 +! поиск числа 65 в массиве "​a"​ (два элемента массива игнорируются)
 +arrpos('​a',​ 65, 2)
 +! поиск строки '​test'​ среди значений массива "​$b"​
 +arrpos('​$b',​ '​test'​)
 +</​sxh>​
 +    * Можно искать значения любого типа, однако:​
 +      * если вы ищете среди текстовых значений массива,​ нужно указывать префикс типа ''​$''​ перед названием массива;​
 +      * если вы ищете среди кортежей в массиве,​ нужно указывать префикс типа ''​%''​.
 +      * Пример:​ <sxh qsp>
 +$a[0] = '​12'​
 +a[1] = 12
 +%a[2] = [12]
 +%a[3] = ['​12'​]
 +arrpos('​$a',​ 12)     & ​ ! 0
 +arrpos('​a',​ 12)      &  ! 1 
 +arrpos('​%a',​ 12)     & ​ ! 2
 +arrpos('​%a',​ '​12'​) ​  & ​ ! 2 <---
 +arrpos('​%a',​ [12])   & ​ ! 2
 +arrpos('​%a',​ ['​12'​]) &  ! 2 <---
 +</​sxh>​
 +  * ''​**MAX(**[выр1],​[выр2],​ …**)**''​ - возвращает максимальное из значений выражений-аргументов. Если передан один аргумент,​ то считается,​ что указано имя массива:​ <sxh qsp>
 +MAX('​a'​) &! вернёт максимальное из числовых значений элементов массива "​a"​
 +MAX('​$b'​) &! вернёт максимальное из текстовых значений элементов массива "​$b"​
 +MAX('​%d'​) &! вернёт максимальный из кортежей в массиве '​%d'​
 +</​sxh>​
 +  * ''​**MIN(**[выр1],​[выр2],​ …**)**''​ - возвращает минимальное из значений выражений-аргументов. Если передан один аргумент,​ то считается,​ что указано имя массива:​ <sxh qsp>
 +MIN('​a'​) &! вернёт минимальное из числовых значений элементов массива "​a"​
 +MIN('​$b'​) &! вернёт минимальное из текстовых значений элементов массива "​$b"​
 +MIN('​%d'​) &! вернёт минимальный из кортежей в массиве '​%d'​
 +</​sxh>​
 +  * ''​**ARRCOMP(**[$имя_массива],​[$шаблон],​[#​начало]**)**''​ - возвращает номер элемента массива ''​%%[$имя_массива]%%'',​ соответствующего регулярному выражению ''​%%[$шаблон]%%''​. Поиск начинается с элемента с номером ''​%%[#​начало]%%'';​ индексация элементов массива ведётся с нуля. Если указанное значение не найдено,​ функция возвращает ''​%%-1%%''​.
 +    * Поиск работает только по текстовым массивам (символ ''​%%$%%''​ в названии массива можно опустить).
 +    * Параметр ''​%%[#​начало]%%''​ может отсутствовать,​ при этом он принимается равным ''​%%0%%''​.
 +    * Примеры:​ <sxh qsp>
 +!Поиск строки '​This'​ среди элементов массива "​$A"​
 +ARRCOMP('​$A','​This',​0)
 +!'​Поиск строки,​ соответствующей регулярному выражению "​abc\d+"​
 +(первые два элемента массива игнорируются)'​
 +ARRCOMP('​$A','​abc\d+',​2)
 +!'​аналогично предыдущему примеру,​ но поиск осуществляется
 +по всем элементам массива'​
 +ARRCOMP('​$A','​.*string.*',​0)
 +ARRCOMP('​$A','​This'​) &! эквивалентно 1му варианту
 +</​sxh>​
 +    * Функция возвращает только числовой индекс элемента. Строковый или многомерный индекс с помощью данной функции получить нельзя.
 +
 +Так же см. ARRPACK и UNPACKARR в разделе [[help:​tuples|"​Кортежи"​]]
  
----- 
 [[help:​strings|Вперёд:​ Строки]] [[help:​strings|Вперёд:​ Строки]]
 +
help/arrays.1417538809.txt.gz · Последние изменения: 2014/12/02 19:46 (внешнее изменение)