img

Массивы

Массивы предназначены для хранения множества значений одного типа.

В языке NetTradeX используются два типа массивов:

  • Динамические массивы
  • Массивы с обратной индексацией

Динамические массивы

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

Индексация элементов начинается с 0, таким образом первый элемент имеет индекс 0, второй - 1 и т.д.

Перед использованием массива, его нужно определить. Определение массива включает в себя:

  • ключевое слово array
  • тип данных, хранящихся в массиве, заключенный в угловые скобки<>
  • имя массива

Пример:

array <int> arr;

Чтобы инициализировать элементы массива arr при определении, необходимо использовать следующий синтаксис:

array <тип> имя = {элемент1,элемент2,...};

Создать массив из N элементов типа int можно следующим образом:

array <int> имя(N);

Для одновременного создания массива и инициализации всех его элементов одинаковыми значениями, можно воспользоваться следующей конструкцией:

array <тип> имя(количество_элементов,значение);

Узнать количество элементов в созданном массиве можно при помощи метода 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);} 

Результат:

a[1]=22