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

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


help:arrays

Различия

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

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

Both sides previous revision Предыдущая версия
help:arrays [2026/01/31 06:15]
aleks_versus [Что такое массивы] убрал понятие однотипный из определени я массивов
help:arrays [2026/01/31 12:09] (текущий)
aleks_versus
Строка 5: Строка 5:
 ===== Зачем нужны массивы ===== ===== Зачем нужны массивы =====
  
-Иногда нам становится неудобно хранить множество однотипных значений в разных переменных. Например,​ у нас есть двадцать "одноручных мечей"​ и для каждого мы прописали урон в двадцати разных переменных:​+Иногда нам становится неудобно хранить множество однотипных значений в разных переменных. Например,​ у нас есть двадцать "железных мечей"​ и для каждого мы прописали урон в двадцати разных переменных:​
  
 <sxh qsp> <sxh qsp>
-меч_одноручный_1 = 23 +меч_железный_1 = 23 
-меч_одноручный_2 = 34 +меч_железный_2 = 34 
-меч_одноручный_3 = 27+меч_железный_3 = 27
 ... ...
-меч_одноручный_19 = 7 +меч_железный_19 = 7 
-меч_одноручный_20 = 41+меч_железный_20 = 41
 </​sxh>​ </​sxh>​
  
Строка 19: Строка 19:
  
 <sxh qsp> <sxh qsp>
-*pl "​Меч ​одноручный №1. Урон: "​+$str(меч_одноручный_1) +*pl "​Меч ​железный №1. Урон: "​+$str(меч_железный_1) 
-*pl "​Меч ​одноручный №2. Урон: "​+$str(меч_одноручный_2) +*pl "​Меч ​железный №2. Урон: "​+$str(меч_железный_2) 
-*pl "​Меч ​одноручный №3. Урон: "​+$str(меч_одноручный_3)+*pl "​Меч ​железный №3. Урон: "​+$str(меч_железный_3)
 ... ...
-*pl "​Меч ​одноручный №19. Урон: "​+$str(меч_одноручный_19) +*pl "​Меч ​железный №19. Урон: "​+$str(меч_железный_19) 
-*pl "​Меч ​одноручный №20. Урон: "​+$str(меч_одноручный_20)+*pl "​Меч ​железный №20. Урон: "​+$str(меч_железный_20)
 </​sxh>​ </​sxh>​
  
Строка 35: Строка 35:
 ===== Что такое массивы ===== ===== Что такое массивы =====
  
-**Массив** - в **QSP** это последовательный набор значений,​ записанных под одним общим именем. Например,​ вместо того, чтобы помещать урон каждого ​одноручного меча в отдельную переменную,​ мы заводим ​один ​массив,​ и размещаем ​каждое ​значение урона в отдельных ячейках этого самого одного единственного массива:+**Массив** - в **QSP** это последовательный набор значений,​ записанных под одним общим именем. 
 + 
 +Например,​ вместо того, чтобы помещать урон каждого ​железного меча в отдельную переменную,​ мы заводим массив,​ и размещаем значения уронов от разных ​мечей в ячейках этого ​массива
 + 
 +Имена переменных и имена массивов записываются похожим ​образом. Единственное отличие в том, что когда мы обращаемся к массиву — возле его имени в квадратных скобках ставим номер одной из ячеек.
  
 <sxh qsp> <sxh qsp>
-меч_одноручный[0] = 23 & ! нумерация ячеек массива начинается с нуля +меч_железный[0] = 23 & ! нумерация ячеек массива начинается с нуля 
-меч_одноручный[1] = 34 +меч_железный[1] = 34 
-меч_одноручный[2] = 27+меч_железный[2] = 27
 ... ...
-меч_одноручный[18] = 7 +меч_железный[18] = 7 
-меч_одноручный[19] = 41 & ! значение для двадцатого меча лежит в ячейке под номером 19+меч_железный[19] = 41 & ! значение для двадцатого меча лежит в ячейке под номером 19
 </​sxh>​ </​sxh>​
  
-Как видно из примера,​ чтобы записать значение в отдельную ячейку массива,​ мы должны:​+Из этого ​примера ​видно, чтобы записать значение в отдельную ячейку массива,​ мы должны:​
  
-  * написать имя массива +  * Написать имя массива; 
-  * затем без пробелов,​ не отступая от имени массива,​ в квадратных скобках написать номер ячейки,​ в которую хотим поместить значение +  * затем без пробелов,​ не отступая от имени массива,​ в квадратных скобках написать номер ячейки,​ в которую хотим ​записать значение; 
-  * затем поставить знак ''​**=**''​ (операция присваивания) +  * затем поставить знак ''​**=**''​ (операция присваивания); 
-  * и уже после знака равно написать нужное значение.+  * и уже после знака ​**равно** написать нужное значение.
  
-В нашем примере массив называется "​меч_одноручный",​ а в квадратных скобках мы указываем номера ячеек этого массива.+В нашем примере массив называется "​меч_железный",​ а в квадратных скобках мы указываем номера ячеек этого массива.
  
 ==== Создание массива ==== ==== Создание массива ====
Строка 60: Строка 64:
  
   * Ячейки массива так же называются **элементами**.   * Ячейки массива так же называются **элементами**.
-  * Каждый массив состоит из множества элементов,​ и у каждого элемента есть собственный номер.+  * Любой массив состоит из одного или ​множества элементов,​ и у каждого элемента есть собственный номер.
   * Номера элементов начинаются с нуля и не повторяются.   * Номера элементов начинаются с нуля и не повторяются.
-  * Нумерация элементов массива не прерывается. То есть, например,​ не может в массиве существовать четвёртый элемент,​ но отсутствовать второй и третий ​элемент. Если мы создадим только нулевой и первый,​ а так же четвёртый,​ элементы массива,​ второй и третий ​элементы ​будут созданы автоматически:​ <sxh qsp>+  * Нумерация элементов массива не прерывается. То есть, например,​ не может в массиве существовать четвёртый элемент,​ но отсутствовать второй и третий. Если мы создадим только нулевой и первый,​ а так же четвёртый,​ элементы массива,​ второй и третий ​— будут созданы автоматически:​ <sxh qsp>
 mass[0]=13 mass[0]=13
 mass[1]=19 mass[1]=19
 mass[4]=23 mass[4]=23
-! элементы mass[2] и mass[3] созданы автоматически и хранят значения по умолчанию+! элементы mass[2] и mass[3] созданы автоматически и хранят значения по умолчанию ​(т.е. 0)
 </​sxh>​ </​sxh>​
   * Максимальный возможный номер ячейки массива ''​**2147483647**''​.   * Максимальный возможный номер ячейки массива ''​**2147483647**''​.
-  * Минимально возможный номер ячейки массива ''​**0**''​. ​То есть ​QSP не допускает создания ячеек с отрицательным индексом и не работает с такими ячейкамиигнорируя команды присвоения,​ и возвращая значение по умолчанию при попытке извлечь из такой ячейки значение.+  * Минимально возможный номер ячейки массива ''​**0**''​. QSP не допускает создания ячеек с отрицательным индексом и не работает с такими ячейками. Плеер ​игнорирует команды присвоения,​ и возвращает значение по умолчанию при попытке ​обратиться к такой ячейке.
  
 ==== Типы данных в массивах ==== ==== Типы данных в массивах ====
  
-Массив можно представлять себе как список значений. Если вам нужно хранить только одно значение,​ достаточно обычной переменной,​ но если вам нужно сохранить множество ​однотипных ​значений,​ как некий список,​ то обязательно используйте массив. Например,​ вы можете вести список имён всех встреченных персонажей:​+Массив можно представить себе как ​**список** значений. Если вам нужно хранить только одно значение,​ достаточно обычной переменной,​ но если вам нужно сохранить множество значений,​ как некий список,​ то обязательно используйте массив. Например,​ вы можете вести список имён всех встреченных персонажей:​
  
 <sxh qsp> <sxh qsp>
Строка 82: Строка 86:
 </​sxh>​ </​sxh>​
  
-В данном примере мы помещали в массив строковые значения. Чтобы поместить в ячейку массива строковое значение,​ нужно поставить перед именем массива символ ''​%%$%%''​ (префикс типа).+В данном примере мы помещали в массив строковые значения.
  
-То же самое и в случае, когда мы хотим получить ​значение из ячейки массива: если мы хотим получить ​строковое значение,​ нужно поставить ​символ ''​%%$%%'' ​перед именем массива.+Чтобы поместить ​в ячейку массива строковое значение,​ нужно поставить перед именем массива ​символ ''​**%%$%%**''​.
  
-И точно так же это работает для числовых значений и кортежей:​ +То же самое и в случае,​ когда мы хотим получить значение из ячейки массива:​ 
-  * Если нам нужно присвоить ячейке массива,​ или получить из неё, числовое значение,​ никаких символов мы перед именем массива не ставим ​(без префикса типа)+ 
-  * Если нам нужно присвоить ячейке массива,​ или получить из неё, кортеж,​ ставим символ ''​%''​ перед именем массива ​(указываем префикс типа).+если мы хотим получить строковое значение,​ нужно поставить символ ''​**%%$%%**''​ перед именем массива. 
 + 
 +И точно так же это работает для числовых значений и [[help:​tuples|кортежей]]
 +  * Если нам нужно присвоить ячейке массива,​ или получить из неё, числовое значение,​ никаких символов мы перед именем массива не ставим. 
 +  * Если нам нужно присвоить ячейке массива,​ или получить из неё, кортеж,​ ставим символ ''​**%**''​ перед именем массива.
  
 Примеры:​ Примеры:​
Строка 110: Строка 118:
 </​sxh>​ </​sxh>​
  
-**В одном массиве** допускается хранить значения любых типов, однако строго рекомендуется ​хранить в одном массиве только значения одного типа: либо строковые,​ либо числовые,​ либо кортежи,​ — во избежание возможных [[glossary:​bag|багов]].+**В одном массиве** допускается хранить значения любых типов, однако строго рекомендуем хранить в одном массиве только значения одного типа: либо строковые,​ либо числовые,​ либо кортежи,​ — во избежание возможных [[glossary:​bag|багов]].
  
 **В одной ячейке массива** можно хранить значение только одного типа! Если вы запишете в ячейку,​ которая хранит строку,​ числовое значение — это числовое значение "​затрёт"​ строковое. И точно так же со значением любого другого типа. **В одной ячейке массива** можно хранить значение только одного типа! Если вы запишете в ячейку,​ которая хранит строку,​ числовое значение — это числовое значение "​затрёт"​ строковое. И точно так же со значением любого другого типа.
Строка 116: Строка 124:
 ==== Обработка массивов ==== ==== Обработка массивов ====
  
-Преимущество работы с массивами по сравнению с обычными переменными раскрывается ​тогда, когда нам приходится много раз повторять одну и ту же операцию над однотипными значениями.+Преимущество работы с массивами по сравнению с обычными переменными раскрывается,​ когда нам приходится много раз повторять одну и ту же операцию над ​похожими значениями.
  
-В примере из начала статьи мы помещали наносимый ​одноручным мечом урон для двадцати разных мечей в двадцать отдельных переменных и видели,​ что даже такая простая операция,​ как вывод значений всех этих переменных на экран требует огромного количества кода. Совсем другое дело, когда мы поместили наши данные в массив,​ ведь мы можем перебрать весь массив с помощью простого цикла:+В примере из начала статьи мы помещали наносимый ​железным мечом урон для двадцати разных мечей в двадцать отдельных переменных и видели,​ что даже такая простая операция,​ как вывод значений всех этих переменных на экран требует огромного количества кода. Совсем другое дело, когда мы поместили наши данные в массив,​ ведь мы можем перебрать весь массив с помощью простого цикла:
  
 <sxh qsp> <sxh qsp>
-меч_одноручный[0] = 23 & ! нумерация ячеек массива начинается с нуля +меч_железный[0] = 23 & ! нумерация ячеек массива начинается с нуля 
-меч_одноручный[1] = 34 +меч_железный[1] = 34 
-меч_одноручный[2] = 27+меч_железный[2] = 27
 ... ...
-меч_одноручный[18] = 7 +меч_железный[18] = 7 
-меч_одноручный[19] = 41 & ! значение для двадцатого меча лежит в ячейке под номером 19+меч_железный[19] = 41 & ! значение для двадцатого меча лежит в ячейке под номером 19
  
 ! выводим на экран список с помощью цикла ! выводим на экран список с помощью цикла
 loop i=0 while i<20 step i+=1: loop i=0 while i<20 step i+=1:
-  *pl "​Меч ​одноручный №<<​i+1>>​. Урон: "​+$str(меч_одноручный[i])+  *pl "​Меч ​железный №<<​i+1>>​. Урон: "​+$str(меч_железный[i])
 end end
 </​sxh>​ </​sxh>​
Строка 136: Строка 144:
 В этом примере для вывода на экран всех значений из всех двадцати ячеек массива нам потребовалось написать всего три строчки кода. В этом примере для вывода на экран всех значений из всех двадцати ячеек массива нам потребовалось написать всего три строчки кода.
  
-А вот как выглядит поиск ​одноручного меча с наибольшим значением урона:+А вот как выглядит поиск ​железного меча с наибольшим значением урона:
  
 <sxh qsp> <sxh qsp>
-pos = arrpos('​меч_одноручный',​max('​меч_одноручный'​)) +pos = arrpos('​меч_железный',​ max('​меч_железный'​)) 
-*pl "​Наибольший урон имеет Меч ​одноручный №<<​pos+1>>:​ "​+$str(меч_одноручный[pos])+*pl "​Наибольший урон имеет Меч ​железный №<<​pos+1>>:​ "​+$str(меч_железный[pos])
 </​sxh>​ </​sxh>​
  
-В обоих этих примерах вместо указания конкретного номера ячейки массива,​ при получении данных из массива,​ мы подставляли значение переменной. Именно эта возможность позволяет так легко и быстро обрабатывать множество данных в массивах,​ и делает работу с ними более удобной,​ чем с обычными переменными.+В обоих примерах вместо указания конкретного номера ячейки массива,​ при получении данных из массива,​ мы подставляли значение переменной. Именно эта возможность позволяет так легко и быстро обрабатывать множество данных в массивах,​ и делает работу с ними более удобной,​ чем с обычными переменными.
  
 ==== Индексирование элементов массива ==== ==== Индексирование элементов массива ====
Строка 156: Строка 164:
 </​sxh>​ </​sxh>​
  
-**Важно!** Настоятельно не рекомендуется ​использовать большие числовые индексы без необходимости.+**Важно!** Настоятельно не рекомендуем использовать большие числовые индексы без необходимости.
  
 **QSP** позволяет создавать для элементов массивов не только числовые,​ но и строковые индексы. Иными словами массивы могут //​индексироваться через строки//​. Примеры:​ **QSP** позволяет создавать для элементов массивов не только числовые,​ но и строковые индексы. Иными словами массивы могут //​индексироваться через строки//​. Примеры:​
Строка 190: Строка 198:
 </​sxh>​ </​sxh>​
  
-**Настоятельно рекомендуется** использовать для индексирования или только числовые ​индексы, или только строковые индексы.+**Настоятельно рекомендуется** использовать для индексирования или только числовые,​ или только строковые индексы.
  
-Текстовые индексы позволяют обойти ограничение массивов на начало нумерации только с нуля:+Строковые индексы позволяют обойти ограничение массивов на начало нумерации только с нуля:
  
 <sxh qsp> <sxh qsp>
Строка 202: Строка 210:
 ==== Многомерные массивы ==== ==== Многомерные массивы ====
  
-В **QSP** есть возможность создавать многомерные массивы, используя для этого ​специальные индексы: +Начиная с плееров версии ​5.8.вы можете создавать в QSP [[help:multid_array|многомерные массивы]].
- +
-<sxh qsp> +
-$map[1,​2]='​лес'​ +
-$map[1,​3]='​лес'​ +
-$map[2,​2]='​лес'​ +
-$map[4,​0]='​река'​ +
-</​sxh>​ +
- +
-В данном примере ​в квадратных скобках вместо номера ячейки мы указываем числа, перечисляемые через запятую. Таким образом мы создаём ячейки **двумерного** массива. +
- +
-Числа в квадратных скобках — это строка значений,​ или **[[help:​tuples|кортеж]]**. +
- +
-Используя для индексации элементов массивов кортежи,​ мы можем создавать трёхмерные,​ четырёхмерные,​ и вообще сколькиугодно-мерные массивы:​ +
- +
-<sxh qsp> +
-$space[0,​-2,​9] = '​космический корабль'​ +
-value_time[12,​33,​1,​366] = 137 +
-макрокосмос_миллиардов_микрокосм[12,​34,​12,​98,​76,​30,​11,​19,​137,​90] = 991112 +
-</​sxh>​ +
- +
-Для многомерных индексов можно использовать ​не только числовые значения,​ но и строковые:​ +
- +
-<sxh qsp> +
-данные['​таблица_данных',​0,​1]=73 +
-яблоки['​Паша','​левый карман'​]=91 +
-яблоки['​Миша','​правый карман'​]=10 +
-$map[12,​14,'​слой_подземелья'​]="​стена"​ +
-</​sxh>​ +
- +
-Есть небольшая хитрость в том, как назначаются многомерные индексы ячейкам массивов. Когда вы инициализируете (создаёте;​ объявляете) новую ячейку массива с многомерным индексом,​ происходит следующее: +
- +
-  * Плеер создаёт новую ячейку с новым **числовым** индексом,​ следующим по порядку. Например,​ если в массиве уже были созданы семь ячеек, создаётся ячейка с числовым индексом ''​%%7%%''​. +
-  * Затем плеер "​прикрепляет"​ указанный ​многомерный индекс к ячейке. +
- +
-Поэтому, если вы создаёте ячейку ​с многомерным индексом, вы можете получать ​из неё значения в том числе и по числовому индексу:​ +
- +
-<sxh qsp> +
-яблоки['​у Паши','​левый карман'​]=37 +
-яблоки['​у Паши','​правый карман'​]=5 +
-яблоки['​у Лёши','​левый карман'​]=11 +
-яблоки['​у Лёши','​правый карман'​]=19 +
-*pl яблоки[0] & ! выведет на экран число 37 +
-*pl яблоки[1] & ! выведет на экран число 5 +
-*pl яблоки[2] & ! выведет на экран число 11 +
-*pl яблоки[3] & ! выведет на экран число 19 +
-</​sxh>​ +
- +
-**Настоятельно рекомендуется** использовать для индексирования или только числовые индексы,​ или только многомерные индексы. +
- +
-Поскольку многомерные индексы - это кортежи:​ - можно использовать переменные типа **кортеж** для подстановок в индексах таких массивов:​ <sxh qsp> +
-%coords = [120, 450, -37] +
-$map[%coords] = '​Alien'​ +
-</​sxh>​ +
-  * Запись с дополнительным набором скобок эквивалентна записи с одним набором скобок при указании индекса ячейки массива:​ <sxh qsp> +
-$array[1, 2, 137] +
-! эквивалентно +
-$array[[1, 2, 137]] +
-</​sxh>​+
  
 ==== Упрощённый доступ к ячейкам массивов ==== ==== Упрощённый доступ к ячейкам массивов ====
Строка 278: Строка 228:
 <sxh qsp> <sxh qsp>
 ! присваиваем нулевой ячейке массива '​$COUNTER'​ строковое значение ! присваиваем нулевой ячейке массива '​$COUNTER'​ строковое значение
-$counter='счётчик' +$usercom ​= 'строка_ввода
-*pl $counter[0] & ! проверяем+*pl $usercom[0] & ! проверяем
 ! присваиваем нулевым ячейкам массивов red, green, blue значения ! присваиваем нулевым ячейкам массивов red, green, blue значения
-set red[0],​green[0],​blue[0]=234,​198,​77+set red[0], green[0], blue[0] = 234,198,77
 *pl "red: <<​red>>,​ green: <<​green>>,​ blue: <<​blue>>"​ & ! проверяем *pl "red: <<​red>>,​ green: <<​green>>,​ blue: <<​blue>>"​ & ! проверяем
 </​sxh>​ </​sxh>​
Строка 288: Строка 238:
  
   * при записи значения в массив будет создан новый элемент сразу за последним. Например:​ <sxh qsp>   * при записи значения в массив будет создан новый элемент сразу за последним. Например:​ <sxh qsp>
- 
 ! Если массив был пустой,​ то ! Если массив был пустой,​ то
 $objs[] = '​Напильник'​ &! $objs[0] = '​Напильник'​ $objs[] = '​Напильник'​ &! $objs[0] = '​Напильник'​
-$objs[] = '​Топор'​ +$objs[] = '​Топор'​ &! $objs[1] = '​Топор'​ 
-&! $objs[1] = '​Топор'​ +$objs[] = '​Доска'​ &! $objs[2] = '​Доска'​
-$objs[] = '​Доска'​ +
-&! $objs[2] = '​Доска'​+
 </​sxh>​ </​sxh>​
   * при получении значения из массива будет выбран последний элемент. Например:​ <sxh qsp>   * при получении значения из массива будет выбран последний элемент. Например:​ <sxh qsp>
- 
 *pl $objs[] &! '​Доска'​ из примера выше *pl $objs[] &! '​Доска'​ из примера выше
 </​sxh>​ </​sxh>​
Строка 308: Строка 254:
 ! удаление элемента по строковому индексу ! удаление элемента по строковому индексу
 killvar '​$item_loc','​палка'​ killvar '​$item_loc','​палка'​
-! удаление элемента по многомерному индексу+! удаление элемента по многомерному индексу ​(кортежу)
 killvar '​$space',​[0,​-2,​9] killvar '​$space',​[0,​-2,​9]
 +%map_point = [0, -2, 13]
 +killvar '​$space',​ %map_point
 </​sxh>​ </​sxh>​
     * Если индекс элемента не указан,​ то удаляется весь массив. <sxh qsp>     * Если индекс элемента не указан,​ то удаляется весь массив. <sxh qsp>
help/arrays.txt · Последние изменения: 2026/01/31 12:09 — aleks_versus