Руководство пользователя
Массивы предназначены для хранения множества значений одного типа.
В языке 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в позициюindexvoid insertLast(const T& in)- вставка элементаinв конец массиваvoid removeAt(uint index)- удаление элемента из позицииindexvoid removeLast()- удаление последнего элементаvoid sortAsc()- сортировка по возрастаниюvoid sortAsc(uint index, uint count)- сортировка по возрастаниюcountэлементов, начиная с позицииindexvoid sortDesc()- сортировка по убываниюvoid sortDesc(uint index, uint count)- сортировка по убываниюcountэлементов, начиная с позицииindexint 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);}
Результат: