Руководство пользователя

Массивы
NetTradeX PC
NetTradeX Android
NetTradeX iOS
NetTradeX Mobile
NetTradeX Advisors
Массивы

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

В языке 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