Здесь показаны различия между двумя версиями данной страницы.
Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
help:arrays [2023/01/01 13:59] aleks_versus |
help:arrays [2025/04/19 06:41] (текущий) aleks_versus [Функции и операторы для работы с массивами] дублировался арсайз |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | |||
[[help:coding|Назад: Программный код]] | [[help:coding|Назад: Программный код]] | ||
Строка 28: | Строка 27: | ||
</sxh> | </sxh> | ||
- | И всё бы ничего, но что если нам нужно найти среди всех этих переменных ту, которая содержимт максимальное число (мы ведь хотим пользоваться самым хорошим мечом)? Тут нам придётся городить огромную конструкцию условий, которая сравнивает каждую переменную со всеми остальными, и объём необходимого нам кода возрастает многократно. | + | Всё бы ничего, но что если нам нужно найти среди всех этих переменных ту, которая содержит максимальное число (мы ведь хотим пользоваться самым хорошим мечом)? Тут нам придётся городить огромную конструкцию условий, которая сравнивает каждую переменную со всеми остальными, и объём необходимого нам кода возрастает многократно. |
Да, есть некоторые варианты решения этих двух задач без использования массивов, но они тоже весьма сложны. Куда как проще работать с однотипными данными, если они представлены в форме массива. | Да, есть некоторые варианты решения этих двух задач без использования массивов, но они тоже весьма сложны. Куда как проще работать с однотипными данными, если они представлены в форме массива. | ||
Строка 48: | Строка 47: | ||
Как видно из примера, чтобы записать значение в отдельную ячейку массива, мы должны: | Как видно из примера, чтобы записать значение в отдельную ячейку массива, мы должны: | ||
- | * написать имя массива | + | |
- | * затем без пробелов, не отступая от имени массива, в квадратных скобках написать номер ячейки, в которую хотим поместить значение | + | * написать имя массива |
- | * затем поставить знак ''**=**'' (операция присвавивания) | + | * затем без пробелов, не отступая от имени массива, в квадратных скобках написать номер ячейки, в которую хотим поместить значение |
- | * и уже после знака равно написать нужное значение. | + | * затем поставить знак ''**=**'' (операция присваивания) |
+ | * и уже после знака равно написать нужное значение. | ||
В нашем примере массив называется "меч_одноручный", а в квадратных скобках мы указываем номера ячеек этого массива. | В нашем примере массив называется "меч_одноручный", а в квадратных скобках мы указываем номера ячеек этого массива. | ||
Строка 59: | Строка 59: | ||
Записывая значения хотя бы в одну ячейку массива, мы тем самым **создаём** (инициализируем) весь массив. | Записывая значения хотя бы в одну ячейку массива, мы тем самым **создаём** (инициализируем) весь массив. | ||
- | * Ячейки массива так же называются **элементами**. | + | * Ячейки массива так же называются **элементами**. |
- | * Каждый массив состоит из множества элементов, и у каждого элемента есть собственный номер. | + | * Каждый массив состоит из множества элементов, и у каждого элемента есть собственный номер. |
- | * Номера элементов начинаются с нуля и не повторяются. | + | * Номера элементов начинаются с нуля и не повторяются. |
- | * Нумерация элементов массива не прерывается. То есть, например, не может в массиве существовать четвёртый элемент, но отсутствовать второй и третий элемент. Если мы создадим только нулевой и первый, а так же четвёртый, элементы массива, второй и третий элементы будут созданы автоматически:<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] созданы автоматически и хранят значения по умолчанию |
</sxh> | </sxh> | ||
- | * Максимальный возможный номер ячейки массива ''**2147483647**''. | + | * Максимальный возможный номер ячейки массива ''**2147483647**''. |
+ | * Минимально возможный номер ячейки массива ''**0**''. То есть QSP не допускает создания ячеек с отрицательным индексом и не работает с такими ячейками, игнорируя команды присвоения, и возвращая значение по умолчанию при попытке извлечь из такой ячейки значение. | ||
==== Типы данных в массивах ==== | ==== Типы данных в массивах ==== | ||
- | Массив можно представлять себе как список значений. Если вам нужно хранить только одно значение, достаточно обычной переменной, но если вам нужно сохранить множество значений, как некий список, то обязательно используйте массив. Например, вы можете вести список имён всех встреченных персонажей: | + | Массив можно представлять себе как список значений. Если вам нужно хранить только одно значение, достаточно обычной переменной, но если вам нужно сохранить множество однотипных значений, как некий список, то обязательно используйте массив. Например, вы можете вести список имён всех встреченных персонажей: |
<sxh qsp> | <sxh qsp> | ||
- | $встреченные_неписи[0]="Домовёнок Нафаня" | + | $встреченные_неписи[0] = "Домовёнок Нафаня" |
- | $встреченные_неписи[1]="Девочка Оля" | + | $встреченные_неписи[1] = "Девочка Оля" |
- | $встреченные_неписи[2]="Лариса Петровна" | + | $встреченные_неписи[2] = "Лариса Петровна" |
- | $встреченные_неписи[3]="Баба Яга" | + | $встреченные_неписи[3] = "Баба Яга" |
</sxh> | </sxh> | ||
- | В данном примере мы помещали в массив строковые значения. Чтобы поместить в ячейку массива строковое значение, нужно поставить перед именем массива символ ''**$**''. | + | В данном примере мы помещали в массив строковые значения. Чтобы поместить в ячейку массива строковое значение, нужно поставить перед именем массива символ ''%%$%%'' (префикс типа). |
- | То же самое и в случае, когда мы хотим получить значение из ячейки массива: если мы хотим получить числовое значение ячейки массива, символ ''**$**'' перед именем массива не ставится; если мы хотим получить строковое значение ячейки массива, нужно поставить символ ''**$**'' перед именем массива. | + | То же самое и в случае, когда мы хотим получить значение из ячейки массива: если мы хотим получить строковое значение, нужно поставить символ ''%%$%%'' перед именем массива. |
+ | |||
+ | И точно так же это работает для числовых значений и кортежей: - Если нам нужно присвоить ячейке массива, или получить из неё, числовое значение, никаких символов мы перед именем массива не ставим (без префикса типа). - Если нам нужно присвоить ячейке массива, или получить из неё, кортеж, ставим символ ''%'' перед именем массива (указываем префикс типа). | ||
Примеры: | Примеры: | ||
Строка 97: | Строка 100: | ||
сорт_яблока[1] = 2 | сорт_яблока[1] = 2 | ||
сорт_яблока[2] = 4 | сорт_яблока[2] = 4 | ||
+ | |||
+ | %сорта_в_корзине[0] = [1, 4] | ||
+ | %сорта_в_корзине[1] = [2, 4] | ||
+ | %сорта_в_корзине[2] = [1, 2] | ||
*pl $яблоки[сорт_яблока[номер_яблока]] | *pl $яблоки[сорт_яблока[номер_яблока]] | ||
</sxh> | </sxh> | ||
- | **В одном массиве** допускается хранить и строковые, и числовые значения, однако строго рекомендуется хранить в одном массиве только значения одного типа: либо строковые, либо числовые, — во избежание возможных [[help:bag|багов]]. | + | **В одном массиве** допускается хранить значения любых типов, однако строго рекомендуется хранить в одном массиве только значения одного типа: либо строковые, либо числовые, либо кортежи, — во избежание возможных [[glossary:bag|багов]]. |
- | **В одной ячейке массива** можно хранить либо только строковое, либо только числовое значение! Если вы запишете в ячейку, хранящую строкове значение, числовое — это числовое значение "затрёт" строковое. И наоборот. | + | **В одной ячейке массива** можно хранить значение только одного типа! Если вы запишете в ячейку, которая хранит строку, числовое значение — это числовое значение "затрёт" строковое. И точно так же со значением любого другого типа. |
==== Обработка массивов ==== | ==== Обработка массивов ==== | ||
Строка 121: | Строка 128: | ||
! выводим на экран список с помощью цикла | ! выводим на экран список с помощью цикла | ||
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> | ||
Строка 161: | Строка 168: | ||
<sxh qsp> | <sxh qsp> | ||
- | $любимый_сорт['иван']='Антоновка' | + | $любимый_сорт['иван'] = 'Антоновка' |
*pl $любимый_сорт['ИВАН'] & ! выведет строку Антоновка | *pl $любимый_сорт['ИВАН'] & ! выведет строку Антоновка | ||
</sxh> | </sxh> | ||
- | Есть небольшая хитрость в том, как назначаются строковые индексы ячейкам массивов. Когда вы инициализируете (создаёте; объявляете) новую ячейку массива со строковым индексом, происходит следующее: | + | Есть небольшая хитрость в том, как назначаются строковые индексы ячейкам массивов. Когда вы инициализируете (создаёте, объявляете) новую ячейку массива со строковым индексом, происходит следующее: |
- | * Плеер создаёт новую ячейку с новым числовым индексом, следующим по порядку. Например, если в массиве уже были созданы три ячейки, создаётся ячейка с числовым индексом ''**3**''. | + | |
- | * Затем плеер "прикрепляет" указанный строковый индекс к числовому. | + | * Плеер создаёт новую ячейку с новым числовым индексом, следующим по порядку. Например, если в массиве уже были созданы три ячейки, создаётся ячейка с числовым индексом ''%%3%%''. |
+ | * Затем плеер "прикрепляет" указанный строковый индекс к числовому. | ||
Поэтому, если вы создаёте ячейку со строковым индексом, вы можете получать из неё значения в том числе и по числовому индексу: | Поэтому, если вы создаёте ячейку со строковым индексом, вы можете получать из неё значения в том числе и по числовому индексу: | ||
Строка 180: | Строка 188: | ||
</sxh> | </sxh> | ||
- | Настоятельно рекомендуется использовать для индексирования или только числовые индексы, или только строковые индексы. | + | **Настоятельно рекомендуется** использовать для индексирования или только числовые индексы, или только строковые индексы. |
Текстовые индексы позволяют обойти ограничение массивов на начало нумерации только с нуля: | Текстовые индексы позволяют обойти ограничение массивов на начало нумерации только с нуля: | ||
Строка 203: | Строка 211: | ||
В данном примере в квадратных скобках вместо номера ячейки мы указываем числа, перечисляемые через запятую. Таким образом мы создаём ячейки **двумерного** массива. | В данном примере в квадратных скобках вместо номера ячейки мы указываем числа, перечисляемые через запятую. Таким образом мы создаём ячейки **двумерного** массива. | ||
- | Числа в квадратных скобках — это строка значений, или **[[help:tuples|кортеж]]**. Далее по тексту мы будем называть их строкой значений. | + | Числа в квадратных скобках — это строка значений, или **[[help:tuples|кортеж]]**. |
- | Используя для индексации элементов массивов строку значений, мы можем создавать трёхмерные, четырёхмерные, и вообще сколькиугодно-мерные массивы: | + | Используя для индексации элементов массивов кортежи, мы можем создавать трёхмерные, четырёхмерные, и вообще сколькиугодно-мерные массивы: |
<sxh qsp> | <sxh qsp> | ||
- | $space[0,-2,9]='космический корабль' | + | $space[0,-2,9] = 'космический корабль' |
- | value_time[12,33,1,366]=137 | + | value_time[12,33,1,366] = 137 |
- | макрокосмос_миллиардов_микрокосм[12,34,12,98,76,30,11,19,137,90]=991112 | + | макрокосмос_миллиардов_микрокосм[12,34,12,98,76,30,11,19,137,90] = 991112 |
</sxh> | </sxh> | ||
Строка 223: | Строка 231: | ||
Есть небольшая хитрость в том, как назначаются многомерные индексы ячейкам массивов. Когда вы инициализируете (создаёте; объявляете) новую ячейку массива с многомерным индексом, происходит следующее: | Есть небольшая хитрость в том, как назначаются многомерные индексы ячейкам массивов. Когда вы инициализируете (создаёте; объявляете) новую ячейку массива с многомерным индексом, происходит следующее: | ||
- | * Плеер создаёт новую ячейку с новым **числовым** индексом, следующим по порядку. Например, если в массиве уже были созданы семь ячеек, создаётся ячейка с числовым индексом ''**7**''. | + | |
- | * Затем плеер "прикрепляет" указанный многомерный индекс к числовому. | + | * Плеер создаёт новую ячейку с новым **числовым** индексом, следующим по порядку. Например, если в массиве уже были созданы семь ячеек, создаётся ячейка с числовым индексом ''%%7%%''. |
+ | * Затем плеер "прикрепляет" указанный многомерный индекс к числовому. | ||
Поэтому, если вы создаёте ячейку с многомерным индексом, вы можете получать из неё значения в том числе и по числовому индексу: | Поэтому, если вы создаёте ячейку с многомерным индексом, вы можете получать из неё значения в том числе и по числовому индексу: | ||
Строка 239: | Строка 248: | ||
</sxh> | </sxh> | ||
- | Настоятельно рекомендуется использовать для индексирования или только числовые индексы, или только многомерные индексы. | + | **Настоятельно рекомендуется** использовать для индексирования или только числовые индексы, или только многомерные индексы. |
+ | |||
+ | Поскольку многомерные индексы - это кортежи: - можно использовать переменные типа **кортеж** для подстановок в индексах таких массивов: <sxh qsp> | ||
+ | %coords = [120, 450, -37] | ||
+ | $map[%coords] = 'Alien' | ||
+ | </sxh> - Запись с дополнительным набором скобок эквивалентна записи с одним набором скобок при указании индекса ячейки массива: <sxh qsp> | ||
+ | $array[1, 2, 137] | ||
+ | ! эквивалентно | ||
+ | $array[[1, 2, 137]] | ||
+ | </sxh> | ||
==== Упрощённый доступ к ячейкам массивов ==== | ==== Упрощённый доступ к ячейкам массивов ==== | ||
На самом деле каждая переменная в QSP является массивом, состоящим из одной единственной ячейки: | На самом деле каждая переменная в QSP является массивом, состоящим из одной единственной ячейки: | ||
+ | |||
<sxh qsp> | <sxh qsp> | ||
яблоки = 0 | яблоки = 0 | ||
Строка 249: | Строка 268: | ||
яблоки[0] = 0 | яблоки[0] = 0 | ||
</sxh> | </sxh> | ||
+ | |||
то есть, если мы создаём переменную с именем "яблоко", мы тем самым создаём массив с именем "яблоко", состоящий из одной ячейки. | то есть, если мы создаём переменную с именем "яблоко", мы тем самым создаём массив с именем "яблоко", состоящий из одной ячейки. | ||
Строка 263: | Строка 283: | ||
Существует упрощённый синтаксис чтения последнего и добавления нового элемента в массив. Для этого квадратные скобки пишутся без указания индекса: | Существует упрощённый синтаксис чтения последнего и добавления нового элемента в массив. Для этого квадратные скобки пишутся без указания индекса: | ||
- | * при записи значения в массив будет создан новый элемент сразу за последним. Например: <sxh qsp> | + | |
- | ! Если массив был пустой, то | + | * при записи значения в массив будет создан новый элемент сразу за последним. Например: <sxh qsp> |
- | $objs[] = 'Напильник' &! $objs[0] = 'Напильник' | + | |
- | $objs[] = 'Топор' &! $objs[1] = 'Топор' | + | ! Если массив был пустой, то |
- | $objs[] = 'Доска' &! $objs[2] = 'Доска' | + | $objs[] = 'Напильник' &! $objs[0] = 'Напильник' |
- | </sxh> | + | $objs[] = 'Топор' |
- | * при получении значенияиз массива будет выбран последний элемент. Например: <sxh qsp> | + | &! $objs[1] = 'Топор' |
- | *pl $objs[] &! 'Доска' из примера выше | + | $objs[] = 'Доска' |
+ | &! $objs[2] = 'Доска' | ||
+ | </sxh> | ||
+ | * при получении значения из массива будет выбран последний элемент. Например: <sxh qsp> | ||
+ | |||
+ | *pl $objs[] &! 'Доска' из примера выше | ||
</sxh> | </sxh> | ||
===== Функции и операторы для работы с массивами ===== | ===== Функции и операторы для работы с массивами ===== | ||
- | * ''**KILLVAR** [$имя_массива], [индекс_элемента]'' - удаление элемента с индексом ''[индекс_элемента]'' из массива с названием ''[$имя_массива]''. Название массива всегда нужно писать в кавычках. Пример:<sxh qsp> | + | * ''%%KILLVAR [$имя_массива], [индекс_элемента]%%'' - удаление элемента с индексом ''%%[индекс_элемента]%%'' из массива с названием ''%%[$имя_массива]%%''. Название массива всегда нужно писать в кавычках. Пример: <sxh qsp> |
- | ! удаление по числовому индексу | + | ! удаление по числовому индексу |
- | killvar 'яблоко',3 | + | killvar 'яблоко',3 |
- | ! удаление элемента по строковому индексу | + | ! удаление элемента по строковому индексу |
- | killvar '$item_loc','палка' | + | killvar '$item_loc','палка' |
- | ! удаление элемента по многомерному индексу | + | ! удаление элемента по многомерному индексу |
- | killvar '$space',(0,-2,9) | + | killvar '$space',[0,-2,9] |
</sxh> | </sxh> | ||
- | * Если индекс элемента не указан, то удаляется весь массив.<sxh qsp> | + | * Если индекс элемента не указан, то удаляется весь массив. <sxh qsp> |
- | ! удаляем массив $map целиком | + | ! удаляем массив $map целиком |
- | killvar '$map' | + | killvar '$map' |
</sxh> | </sxh> | ||
- | * Если оператор вызван без аргументов, то удаляются все массивы и переменные в игре!<sxh qsp> | + | * Если оператор вызван без аргументов, то удаляются все массивы и переменные в игре! <sxh qsp> |
- | ! удаляем все массивы и переменные | + | ! удаляем все массивы и переменные |
- | KILLVAR | + | KILLVAR |
</sxh> | </sxh> | ||
- | * При удалении элемента все следующие за ним элементы сдвигаются на позицию вверх.<sxh qsp> | + | * При удалении элемента все следующие за ним элементы сдвигаются на позицию вверх. <sxh qsp> |
- | a[0]=4 | + | a[0]=4 |
- | a[1]=3 | + | a[1]=3 |
- | a[2]=23 | + | a[2]=23 |
- | a[3]=15 | + | a[3]=15 |
- | KILLVAR 'a',1 | + | KILLVAR 'a',1 |
- | !теперь массив выглядит так: | + | !теперь массив выглядит так: |
- | a[0]=4 | + | a[0]=4 |
- | a[1]=23 | + | a[1]=23 |
- | a[2]=15 | + | a[2]=15 |
</sxh> | </sxh> | ||
- | * ''**KILLALL**'' - оператор эквивалентен конструкции "''KILLVAR & KILLOBJ''", то есть удаляет все переменные, массивы в игре, а так же очищает Окно предметов. Обычно применяется в начале игры, чтобы при возврате в начальную локацию после неудачного прохождения какого-то этапа игры обнулить все переменные (в противном случае, может оказаться, что запертые двери уже открыты, жена похищена до свадьбы, а Баба-Яга уже отдала кому-то нужный клубочек). | + | * ''%%KILLALL%%'' - оператор эквивалентен конструкции "''%%KILLVAR & KILLOBJ%%''", то есть удаляет все переменные/массивы в игре, а так же очищает Окно предметов. Обычно применяется в начале игры, чтобы при возврате в начальную локацию после неудачного прохождения какого-то этапа игры обнулить все переменные (в противном случае, может оказаться, что запертые двери уже открыты, жена похищена до свадьбы, а Баба-Яга уже отдала кому-то нужный клубочек). |
- | * ''**COPYARR** [$приёмник],[$источник],[#начало],[#количество]'' - копирование в массив-приёмник ''[#количество]'' элементов из массива-источника начиная с элемента под номером ''[#начало]''. Размер массива-приёмника при копировании не имеет значения. | + | * ''%%COPYARR [$приёмник],[$источник],[#начало],[#количество]%%'' - копирование в массив-приёмник ''%%[#количество]%%'' элементов из массива-источника начиная с элемента под номером ''%%[#начало]%%''. Размер массива-приёмника при копировании не имеет значения. |
- | * Параметр ''[#количество]'' является необязательным. По умолчанию - до конца массива-источника. | + | * Параметр ''%%[#количество]%%'' является необязательным. По умолчанию - до конца массива-источника. |
- | * Параметр ''[#начало]'' является необязательным. По умолчанию - ''0''. | + | * Параметр ''%%[#начало]%%'' является необязательным. По умолчанию - ''%%0%%''. |
- | * Не имеет значения, указываете ли вы ''**$**'' перед названием массива или нет. Копируются элементы и со строковыми, и с числовыми значениями. | + | * Не имеет значения, указываете ли вы ''%%$%%'' или ''%'' перед названием массива, или нет. Копируются элементы с любыми типами значений. |
- | * Примеры:<sxh qsp> | + | * Примеры: <sxh qsp> |
- | COPYARR '$a','$b' | + | COPYARR '$a','$b' |
- | COPYARR 'a','b' | + | COPYARR 'a','b' |
- | COPYARR $arrname1,$arrname2,10,5 | + | ! $arrname1, $arrname2 = 'arr', 'bar' |
- | COPYARR 'a<<$arrname1>>','a<<$arrname2>>' | + | COPYARR $arrname1,$arrname2,10,5 |
+ | COPYARR 'a<<$arrname1>>','a<<$arrname2>>' | ||
</sxh> | </sxh> | ||
- | * ''**ARRSIZE**([$имя_массива])'' - функция возвращает число элементов массива с названием ''[$имя_массива]''. | + | * ''%%SORTARR [$имя_массива], [#порядок]%%'' — Данный оператор сортирует указанный массив. Параметр ''%%[#порядок]%%'' опционален. Если не указан или равен 0, то сортирует массив по возрастанию (от меньшего к большему). Если равен 1, то сортирует массив по убыванию (от большего к меньшему). |
- | * Не имеет значения, указываете ли вы **$** перед названием массива или нет. Подсчитывается общее число ячеек и со строковыми, и с числовыми значениями. | + | * Может сортировать массивы любых типов (числа, строки, кортежи), но не допускается смешивать значения разных типов в одном массиве. |
- | * Примеры:<sxh qsp> | + | * Для указания типа сортируемых значений нужно указать префикс типа как часть имени массива (''%%$%%'', ''%''). |
- | n = ARRSIZE('a') | + | * Пример сортировки текстового массива: <sxh qsp> |
- | n = ARRSIZE('$a') | + | $a[] = 'nn' |
- | !Результат будет одинаковый | + | $a[] = 'zz' |
+ | $a[] = 'aa' | ||
+ | sortarr '$a' | ||
+ | !проверяем результат сортировки: | ||
+ | loop local i=0 while i<arrsize('$a') step i+=1: | ||
+ | *pl $a[i] | ||
+ | end | ||
</sxh> | </sxh> | ||
- | * ''**ARRITEM**([$имя_массива],[индекс_элемента])'' — возвращает значение элемента массива с названием ''[$имя_массива]'' по указанному индексу. То есть функция извлекает значение из указанной ячейки массива. Примеры:<sxh qsp> | + | * ''%%SCANSTR [$имя_массива], [$текст_для_разбора], [$регэксп], [#номер_группы]%%'' — в массив ''%%[$имя_массива]%%'' помещаются строки, соответствующие [[help:regexp|регулярному выражению]] ''%%[$регэксп]%%'', которые будут найдены в строке ''%%[$текст_для_разбора]%%''. Если указан параметр ''%%[#номер_группы]%%'', в массив будет помещаться не вся строка, соответствующая регулярному выражению, а лишь часть, соответствующая указанной группе в этом регулярном выражении. Примеры: <sxh qsp> |
- | ! выводим значение элемента с индексом 3 | + | ! вытаскиваем из строки все слова: |
- | *pl $arritem('$mass', 3) | + | $text = 'Шла Саша по шоссе, а Грека через реку.' |
- | ! выводим значение элемента с текстовым индексом | + | scanstr '$words', $text, '\b\w+\b' |
- | *pl $arritem('$mass', 'Петя') | + | !В массиве $words окажутся значения: 'Шла', 'Саша', 'по', 'шоссе', 'а', 'Грека', 'через', 'реку' |
- | ! выводим значение элемента с многомерным индексом | + | |
- | *pl $arritem('$mass', (-2, 9, 0)) | + | ! разбиваем строку по разделителю: |
- | </sxh> Эта функция может быть полезна для извлечения значений, если имя массива заранее не известно. Пример:<sxh qsp> | + | $text = 'утро|день|вечер|ночь' |
- | ! выводим содержимое нескольких массивов без использования ''**DYNAMIC**'': | + | scanstr '$words', $text, '[^|]+' |
- | $array_name[]='mass_1' | + | !В массиве $words окажутся значения: 'утро', 'день', 'вечер', 'ночь' |
- | $array_name[]='mass_2' | + | |
- | $array_name[]='mass_3' | + | ! вытаскиваем из строки все слова, помещённые в квадратные скобки, но без квадратных скобок: |
- | $array_name[]='mass_4' | + | $text = '[first] ignoredtext [second][third] also ignored' |
- | $array_name[]='mass_5' | + | scanstr '$words', $text, '\[(.*?)\]', 1 |
- | ! внешний цикл перебирает имена массивов | + | !В массиве $words окажутся значения: 'first', 'second', 'third' |
- | 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> | </sxh> | ||
- | * ''**ARRPOS**([$имя_массива],[значение],[#начало])'' - возвращает номер элемента массива с названием ''[$имя_массива]'', равного значению ''[значение]''. Поиск начинается с элемента под номером ''[#начало]''; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает ''**-1**''. | + | * ''%%ARRITEM([$имя_массива],[индекс_элемента])%%'' — возвращает значение элемента массива с названием ''%%[$имя_массива]%%'' по указанному индексу. То есть функция извлекает значение из указанной ячейки массива. Примеры: <sxh qsp> |
- | * Параметр ''[#начало]'' может отсутствовать, при этом он принимается равным ''**0**''. | + | ! выводим значение элемента с индексом 3 |
- | * Примеры:<sxh qsp> | + | *pl $arritem('$mass', 3) |
- | !Поиск строки 'This' в текстовом массиве "$A" | + | ! выводим значение элемента с текстовым индексом |
- | ARRPOS('$A','This',0) | + | *pl $arritem('$mass', 'Петя') |
- | !Поиск числа 65 в массиве "A" (первые два элемента массива игнорируются) | + | ! выводим значение элемента с многомерным индексом |
- | ARRPOS('A',65,2) | + | *pl $arritem('$mass', [-2, 9, 0]) |
- | !Поиск строки 'test' среди значений массива "$B" | + | </sxh> Эта функция может быть полезна для извлечения значений, если имя массива заранее не известно. Пример: <sxh qsp> |
- | ARRPOS('$B','test') | + | ! выводим содержимое нескольких массивов без использования ''**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> | </sxh> | ||
- | * Функция возвращает только числовой индекс элемента. Строковый или многомерный индекс с помощью данной функции получить нельзя. | + | * ''%%MAX([выр1],[выр2], …)%%'' - возвращает максимальное из значений выражений-аргументов. Если передан один аргумент, то считается, что указано имя массива: <sxh qsp> |
- | * ''**MAX(**[выр1]**,**[выр2]**,** …**)**'' - возвращает максимальное из значений выражений-аргументов. Если передан один аргумент, то считается, что указано имя массива:<sxh qsp> | + | MAX('a') &! вернёт максимальное из числовых значений элементов массива "a" |
- | MAX('a') &! вернёт максимальное из числовых значений элементов массива "a" | + | MAX('$b') &! вернёт максимальное из текстовых значений элементов массива "$b" |
- | MAX('$b') &! вернёт максимальное из текстовых значений элементов массива "$b" | + | MAX('%d') &! вернёт максимальный из кортежей в массиве '%d' |
</sxh> | </sxh> | ||
- | * ''**MIN(**[выр1]**,**[выр2]**,** …**)**'' - возвращает минимальное из значений выражений-аргументов. Если передан один аргумент, то считается, что указано имя массива:<sxh qsp> | + | * ''%%MIN([выр1],[выр2], …)%%'' - возвращает минимальное из значений выражений-аргументов. Если передан один аргумент, то считается, что указано имя массива: <sxh qsp> |
- | MIN('a') &! вернёт минимальное из числовых значений элементов массива "a" | + | MIN('a') &! вернёт минимальное из числовых значений элементов массива "a" |
- | MIN('$b') &! вернёт минимальное из текстовых значений элементов массива "$b" | + | MIN('$b') &! вернёт минимальное из текстовых значений элементов массива "$b" |
+ | MIN('%d') &! вернёт минимальный из кортежей в массиве '%d' | ||
</sxh> | </sxh> | ||
- | * ''**ARRCOMP**([$имя_массива],[$шаблон],[#начало])'' - возвращает номер элемента массива ''[$имя_массива]'', соответствующего регулярному выражению ''[$шаблон]''. Поиск начинается с элемента с номером ''[#начало]''; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает ''**-1**''. | + | * ''%%ARRCOMP([$имя_массива],[$шаблон],[#начало])%%'' - возвращает номер элемента массива ''%%[$имя_массива]%%'', соответствующего регулярному выражению ''%%[$шаблон]%%''. Поиск начинается с элемента с номером ''%%[#начало]%%''; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает ''%%-1%%''. |
- | * Поиск работает только по текстовым массивам (символ ''**$**'' в названии массива можно опустить). | + | * Поиск работает только по текстовым массивам (символ ''%%$%%'' в названии массива можно опустить). |
- | * Параметр ''[#начало]'' может отсутствовать, при этом он принимается равным ''**0**''. | + | * Параметр ''%%[#начало]%%'' может отсутствовать, при этом он принимается равным ''%%0%%''. |
- | * Примеры:<sxh qsp> | + | * Примеры: <sxh qsp> |
- | !Поиск строки 'This' среди элементов массива "$A" | + | !Поиск строки 'This' среди элементов массива "$A" |
- | ARRCOMP('$A','This',0) | + | ARRCOMP('$A','This',0) |
- | !'Поиск строки, соответствующей регулярному выражению "abc\d+" | + | !'Поиск строки, соответствующей регулярному выражению "abc\d+" |
- | (первые два элемента массива игнорируются)' | + | (первые два элемента массива игнорируются)' |
- | ARRCOMP('$A','abc\d+',2) | + | ARRCOMP('$A','abc\d+',2) |
- | !'аналогично предыдущему примеру, но поиск осуществляется | + | !'аналогично предыдущему примеру, но поиск осуществляется |
- | по всем элементам массива' | + | по всем элементам массива' |
- | ARRCOMP('$A','.*string.*',0) | + | ARRCOMP('$A','.*string.*',0) |
- | ARRCOMP('$A','This') &! эквивалентно 1му варианту | + | ARRCOMP('$A','This') &! эквивалентно 1му варианту |
</sxh> | </sxh> | ||
- | * Функция возвращает только числовой индекс элемента. Строковый или многомерный индекс с помощью данной функции получить нельзя. | + | * Функция возвращает только числовой индекс элемента. Строковый или многомерный индекс с помощью данной функции получить нельзя. |
- | См. также: [[howto:arrays|Продвинутое использование массивов]] | + | Так же см. ARRPACK и UNPACKARR в разделе [[help:tuples|"Кортежи"]] |
[[help:strings|Вперёд: Строки]] | [[help:strings|Вперёд: Строки]] | ||