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

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


help:arrays

Различия

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

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

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> +    * Для указания типа сортируемых ​значений нужно указать префикс типа как часть имени массива (''​%%$%%'',​ ''​%''​)
- ARRSIZE('​a'​) +    * Пример ​сортировки текстового массива: <sxh qsp> 
- 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 = '[firstignoredtext [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|Вперёд:​ Строки]]
  
help/arrays.1672581540.txt.gz · Последние изменения: 2023/01/01 13:59 — aleks_versus