Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Inf&syst12 (2).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
310.27 Кб
Скачать

2.3.2Базовые структурированные типы

К базовым структурированным типам относятся: диапазон (range), последовательность(sequence), множество (set), список (list), таблица (table).

2.3.2.1range.

Диапазон (range) задаётся при помощи оператора .. и имеет вид

[a]..[b]

Здесь как всегда в квадратные скобки взяты необязательные элементы; a и b могут быть выражениями. В этой теме диапазон уже использовался в п. 2.2.3 при описании одного из вариантов вызова функции op. Диапазоны чрезвычайно широко используются в Maple. В контексте материала этой темы отметим, что при помощи выражения типа диапазон можно из строки выделить подстроку. Предложение выделения является часто используемым, и дальше будут приведены многочисленные дополнительные примеры.

Примеры выделения

1. Выделение подстроки из строки.

> s := "Мама мыла раму.":

> s[1..4];

"Мама"

2. Иногда необходимо выделить левую или правую концевую точку диапазона. Это можно сделать двумя способами: используя функцию op, либо lhs, rhs. Второй вариант более читабельный, поэтому предпочтительней.

> r := a..b:

> op(1, r); # получение левой концевой точки

a

> op(2, r); # получение правой концевой точки

b

> lhs(r); # получение левой концевой точки

a

> rhs(r); # получение правой концевой точки

b

> r := ..b: # Пример диапазона, в котором левая концевая точка не задана

> op(1, r); # Первый операнд отсутствует: op(1, r) ничего не вернёт

> lhs(r); # Первый операнд отсутствует: lhs(r) также ничего не вернёт

2.3.2.2sequence.

Последовательность выражений (кратко — последовательность) — это группа выражений разделённых запятыми:

E1, E2, …, En

Пусть последовательность присвоена переменной S, например, S := a, b, c, d; Функция nops(S) возвращает число элементов последовательности, а выражение выделения S[i] — позволяет получить i-ый элемент последовательности (в случае примера S[3] вернёт с). Однако нельзя присвоить, используя индексацию, элементу последовательности новое значение, например, S[3] := g вызовет ошибку. В следующем пункте будет указано, как можно присвоить элементу последовательности новое значение.

Для создания последовательностей используется seq

seq(m..n[, step])

seq(f, i = m..n[, step])

seq(f, i = x)

seq(f, i in x)

Здесь f — некоторое выражение, step — шаг, с которым увеличивается значение i, x — строка, последовательность список (list), множество (set), таблица, массив (последние четыре структуры данных будут описаны чуть ниже). В функции Maple, которые имеют переменное число формальных аргументов, можно в качестве фактического аргумента передавать последовательность.

Примеры построения последовательностей при помощи seq

> seq("a".."e"); seq("a".."e", 2); cat(%);

"a", "b", "c", "d", "e"

"a", "c", "e"

"ace"

> seq(i, i="string"); seq(i, i in "string"); # Два синтаксиса приводят к одному

"s", "t", "r", "i", "n", "g"

"s", "t", "r", "i", "n", "g"

> S:= seq(i^2, i= 1..5); seq(1/i, i in S);

S := 1, 4, 9, 16, 25

1, 1/4, 1/9, 1/16, 1/25

2.3.2.3list и set.

Список (list) — это последовательность, заключенная в квадратные скобки:

List := [S1, S2, …, Sn].

Множество (set) — это «неупорядоченная последовательность», заключенная в фигурные скобки

Set := {S1, S2, …, Sn}

Если в последовательности, из которой строится множество, присутствуют повторяющиеся элементы, то повторяющиеся элементы (как это и следует из математического определения) в множество не войдут. Пустой список задаётся так List := [], аналогично пустое множество — Set := {}. Функция nops возвращает количество элементов списка или последовательности.

Для выделения определённого элемента подсписка/подмножества списка/множество, используется выделение индексированием (см. ниже пример 1).

Определённому элементу списка можно присвоить значение, используя выделение индексированием, но подобным образом нельзя присвоить новое значение i-ому элементу множества. Для «присвоения нового значения некоторому элементу множества» возможно два подхода. Во-первых, использование операций над множествами. Для множеств определены операции: разность (minus), объединение (union) и пересечение (intersect)1. При помощи разности двух множеств можно удалить некоторые элементы из множества (в частности один элемент), а при помощи операции объединения добавить элементы (в частности один элемент). Во-вторых, использование подстановки нового значения при помощи функции subs или eval.

Второй способ присвоения нового значения элементу списка является использование функции

subsop(i_1=expr_1,… i_n=expr_n, expr).

Эта функция задаёт новое значение expr_1 операнду номер i_1,… новое значение expr_n операнду номер i_n выражения expr. [Название этой функции есть соединение названий функций subs и op]. Для удаления i-го элемента из списка можно вызвать subsop(i=NULL, List).

Примеры работы со списком и множеством

1. Создание; выделение определённого элемента; выделение подряд идущих элементов

> List:= [seq((-2)^i, i=0..5)]; # Создание списка

List := [1, -2, 4, -8, 16, -32]

> Set:= {seq((-2)^i, i=0..5)}; # Создание множества

Set := {-32, -8, -2, 1, 4, 16}

> List[4], Set[4]; # Выделение определённого элемента списка и множества

-8, 1

> List[2..3], Set[2..3]; # Выделение подсписка и подмножества подряд идущих элементов

[-2, 4], {-8, -2}

2. Пример добавление элемента, для примера 0, в конец списка, аналогично можно добавить элемент в множество.

> List := [op(List), 0];

List := [1, -2, 4, 0, 16, -32, 0]

3. Присвоение i-ому элементу списка нового значения. Ошибка при присвоении i-ому элемента множества нового значения. Изменение значения некоторого элемента множества двумя способами. из множества и.

> List[4]:= 0: List;

[1, -2, 4, 0, 16, -32]

> Set[4]:= 0;

Error, cannot reassign the entries in a set

> Set := Set minus {1}; # Удаление элемента 1

Set := {-32, -8, -2, 4, 16}

> Set := Set union {0}; # Добавление элемента 0, в результате элемент 1 заменён на 0

Set := {-32, -8, -2, 0, 4, 16}

> subs(0=1, Set); # Обратная замена элемента 0 на 1 (использование subs)

{-32, -8, -2, 1, 4, 16}

> eval(Set, 0=1); # Обратная замена элемента 0 на 1 (использование eval)

4. Удаление второго элемента списка

> subsop(2=NULL, List)

Для присвоения нового значения определённому элементу последовательности можно преобразовать последовательность в список, присвоить соответствующему элементу списка новое значение, и затем преобразовать список «назад» в последовательность.

Пример присвоения i-ому элементу последовательности нового значения. Пусть нам надо присвоить значение 0 третьему элементу последовательности.

> A:= seq(i, i=1..5): A:= [A];# Создаём посл. для примера; преобразуем её в список

A := [1, 2, 3, 4, 5]

> A[3]:= 0: # Присваиваем третьему элементу значение 0

> A:= op(A); # Преобразуем назад список в последовательность1

A := 1, 2, 0, 4, 5

В Maple допустимы списки и множества различного уровня вложения. Пример вложенного списка будет приведен в п. 2.3.2.5 (rtable: Array, Matrix, Vector.

Дополнительные инструменты для работы со списками содержит пакет ListTools.

2.3.2.4table

Таблица это список, в котором элементы индексируются не натуральными числами, а произвольными именами, т.е. таблица представляет собой список равенств вида [c=C], где с — имя индекса, C значение. Например,

> T:= table([a=1.2,b=2.3,c=3.4]);

T := table([b = 2.3, c = 3.4, a = 1.2])

создаёт таблицу с тремя элементами. Получить значение элемента таблицы можно, аналогично элементу списка, при помощи выделения

Примеры: получение и изменение значения некоторого элемента таблицы.

> T[a];

1.2

> T[a]:= 0.1: print(T); # Элементу таблицы с индексом a присвоили значение 0.1

table([b = 2.3, c = 3.4, a = .1])

В данном курсе таблицы использоваться не будут, поэтому они подробно рассматриваться не будут.

2.3.2.5rtable: Array, Matrix, Vector.

array — устаревший тип массива. Уже в 12-ой версии использовать этот тип массива настоятельно не рекомендуется (последующие версии могут не поддерживать этот тип). Вместо этого типа рекомендуется использовать тип Array. Тип rtable объединяет типы Array, Matrix, Vector.

Array строится при помощи вызова конструктора

Array([indfncs,] [dims,] [init,] [opts])

indfncs — процедура/процедуры, индексная функция/функции.

dims — диапазоны, размерность

init — процедура, либо table, либо list, либо Array, либо список равенств, либо выражение алгебраического типа задающие начальные значения элементов массива. Если начальные значения не заданы, то они полагаются равными нулю.

opts — равенства в форме keyword = value, задающие дополнительные свойства массива.

Индексная функция(ии) используется для индексирования элементов массива.

Размерность массивов может быть от 0 до 63. Каждая размерность описывается диапазоном.

Например. Зададим два массива содержащие нули в качестве элементов: одномерный массив A и двумерный массив B.

> A:= Arra(1..5): # Номера элементов от 1 до 5

> B:= Array(1..3, 1..2):# Первый индекс может изменяться от 1 до 3, второй — от 1 до 2

Для задания начального значения может использоваться список. Если массив более чем одномерный, то используется вложенный список.

Пример (продолжение) Задание двух массивов с заданными начальными значениями.

> A:= Arra(1..5, [0, 2, 4, 6, 8]);

> B:= Array(1..3,1..2, [[1,1],[2,2],[3,3]]);# Первая строка — единицы, вторая — двойки

Как видно из примера, если не указано опция transpose в случае двумерного массива элементами «списка верхнего уровня» являются «строки» — списки элементов строк.

Если начальные значения массива задаются списком, то размерность можно не задавать.

Наиболее часто используемые ключевые слова:

  • datatype = value в качестве значения (value) может быть integer[n], float[n], complex[n], и некоторые другие типы выражений Maple. Для integer n может принимать значения 1, 2, 4 или 8; для float и complex — только 8.

  • storage = value — diagonal, triangular[upper] (верхний треугольный), triangular[lower] (нижний треугольный) и др.

  • fill = expression заполнить матрицу значениями указанными в expression.

Примеры

> C:=Array(triangular[upper], 1..3,1..3, fill=1); # построение верхнего треугольного массива

Матрицы и векторы будут описаны в теме, посвященной линейной алгебре. Там же будут более детально рассмотрены опции.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]