Руководство пользователя
Массивы предназначены для хранения множества значений одного типа.
В языке NetTradeX используются два типа массивов:
- Динамические массивы
- Массивы с обратной индексацией
Динамические массивы
Размерность динамического массива может быть переменной, то есть объем памяти, выделяемой под массив, определяется на этапе выполнения программы.
Индексация элементов начинается с 0, таким образом первый элемент имеет индекс 0, второй - 1 и т.д.
Перед использованием массива, его нужно определить. Определение массива включает в себя:
- ключевое слово
array
- тип данных, хранящихся в массиве, заключенный в угловые скобки
<>
- имя массива
Пример:
Чтобы инициализировать элементы массива arr при определении, необходимо использовать следующий синтаксис:
Создать массив из N элементов типа int можно следующим образом:
Для одновременного создания массива и инициализации всех его элементов одинаковыми значениями, можно воспользоваться следующей конструкцией:
Узнать количество элементов в созданном массиве можно при помощи метода length()
, вызвав имя_массива.length().
Для доступа к элементам массива используется оператор []
. Внутри квадратных скобок указывается номер элемента, к которому осуществляется доступ.
Нумерация элементов массива начинается с нуля, таким образом, если имеется массив arr
и необходимо получить доступ к его пятому элементу, необходимо вызвать arr[4]
.
Пример:
int Initialize() {return(0);} int Run() { array <int> arr = {10,20,30,40,50}; for(uint i=0;i<arr.length();i++) { System.Print("arr["+i+"]="+arr[i]); } return(0); } int DeInitialize(){return(0);}
Результат:
arr[0]=10 arr[1]=20 arr[2]=30 arr[3]=40 arr[4]=50
Создать двумерный массив можно следующими способами:
array<array<int>> a; array<array<int>> b = {{1,2},{3,4}}; array<array<int>> c(10, array<int>(10));
Обращение к элементам таких массивов будет иметь следующий вид: имя_массива[индекс1][индекс2]
Продемонстрируем работу с двумерными массивами на примере транспонирования матриц:
int Initialize(){return(0);} array<array<int>> transpose(array<array<int>> alfa) { int newLines = alfa[0].length(); int newRows = alfa.length(); array<array<int>> beta(newLines,array<int>(newRows)); for (int i=0;i<newRows;i++) { for(int j=0;j<newLines;j++) { beta[j][i]=alfa[i][j]; } } return beta; } void Array2DPrint(array<array<int>> alfa) { string data=""; for(uint i=0;i<alfa.length();i++) { for(uint j=0; j<alfa[i].length(); j++) { data +=" ["+i+"]["+j+"]="+alfa[i][j]; } } System.Print(data); } int Run() { array<array<int>> b = {{1,2},{3,4},{5,6}}; System.Print("Initial matrix"); Array2DPrint(b); System.Print("Transposed matrix"); Array2DPrint(transpose(b)); return 0; } int DeInitialize(){return(0);}
Результат:
Initial matrix [0][0]=1 [0][1]=2 [1][0]=3 [1][1]=4 [2][0]=5 [2][1]=6 Transposed matrix [0][0]=1 [0][1]=3 [0][2]=5 [1][0]=2 [1][1]=4 [1][2]=6
Для массивов допускается использовать операции =
для присваивания и ==
/!=
для проверки на равенство/неравенство
всех элементов массива.
Пример:
int Initialize() { return(0); } int Run() { array <int> a={10,11,12,13}; array <int> b; b=a; for(uint i=0;i<b.length;i++) { System.Print("b["+i+"]="+b[i]); } System.Print("Массивы равны? "+(a==b)); b[2]=1; System.Print("Массивы равны? "+(a==b)); return(0); } int DeInitialize() { return(0); }
Каждый динамический массив имеет ряд методов для работы с его элементами. Эти методы перечислены ниже:
uint length() const
- количество элементов в массивеvoid resize(uint)
- изменение длины массиваvoid reverse()
- инвертирование порядка следования элементовvoid insertAt(uint index, const T& in)
- вставка элементаin
в позициюindex
void insertLast(const T& in)
- вставка элементаin
в конец массиваvoid removeAt(uint index)
- удаление элемента из позицииindex
void removeLast()
- удаление последнего элементаvoid sortAsc()
- сортировка по возрастаниюvoid sortAsc(uint index, uint count)
- сортировка по возрастаниюcount
элементов, начиная с позицииindex
void sortDesc()
- сортировка по убываниюvoid sortDesc(uint index, uint count)
- сортировка по убываниюcount
элементов, начиная с позицииindex
int find(const T& in)
- поиск элементаin
в массивеint find(uint index, const T& in)
- поиск элементаin
, начиная с позицииindex
Пример работы c методами массивов:
int Initialize(){return(0);} string array_print(array <int> data) { string temp =""; for(uint i=0;i <data.length; i++) { temp += data[i]+" "; } return temp; } int Run() { array<int>data={4, 1, 7, -1, 2, 3, -7, 5, -12}; System.Print("Initial array: " + array_print(data)); // Выведется Initial array: 4 1 7 -1 2 3 -7 5 -12 System.Print("length="+data.length()); // Выведется length=9 data.resize(7); System.Print("resize="+ array_print(data)); // Выведется resize=4 1 7 -1 2 3 -7 data.reverse(); System.Print("After reverse: " + array_print(data)); // Выведется After reverse: -7 3 2 -1 7 1 4 data.insertAt(2,9); System.Print("After insert: " + array_print(data)); // Выведется After insert: -7 3 9 2 -1 7 1 4 data.removeAt(3); System.Print("After remove: " + array_print(data)); // Выведется After remove: -7 3 9 -1 7 1 4 data.sortAsc(1,3); System.Print("After sort ascending: " + array_print(data)); //Выведется After sort ascending: -7 -1 3 9 7 1 4 data.sortDesc(1,4); System.Print("After sort descending: " + array_print(data)); //Выведется After sort descending: -7 9 7 3 -1 1 4 System.Print("Position of 7 is: " + data.find(7)); // Position of 7 is: 2 return 0; } int DeInitialize(){return(0);}
Массивы с обратной индексацией
Массивы с обратной индексацией предназначены, главным образом, для хранения значений буфера индикатора и используются, как один из параметров функции SetIndexBuffer. Для создания массива с обратной индексацией используется следующий синтаксис:
Размерность определяет количество элементов массива.
Доступ к элементам массива осуществляется через квадратные скобки []
, указываемые после имени массива.
Для создания массива с нулевой длинной используется следующий синтаксис:
Индексация элементов начинается с конца массива, то есть элемент с индексом 0 - последний, с индексом 1 - предпоследний и т.д.
В качестве индексов допускаются только целые неотрицательные числа.
Пример:
int Initialize() {return(0);} int Run() { int a[3]; a[0]=11; a[1]=22; a[2]=33; System.Print("a[1]="+a[1]); return(0); } int DeInitialize(){return(0);}
Результат: