Здесь показаны различия между двумя версиями данной страницы.
| 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.0 вы можете создавать в 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> | ||