Учебники

D Программирование — Массивы

Язык программирования D предоставляет структуру данных, названную массивами , в которой хранится последовательная коллекция фиксированного размера элементов одного типа. Массив используется для хранения коллекции данных. Часто более полезно думать о массиве как о коллекции переменных одного типа.

Вместо того, чтобы объявлять отдельные переменные, такие как number0, number1, … и number99, вы объявляете одну переменную массива, такую ​​как числа, и используете числа [0], числа [1] и …, числа [99] для представления отдельные переменные. Определенный элемент в массиве доступен по индексу.

Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему.

Объявление массивов

Чтобы объявить массив на языке программирования D, программист задает тип элементов и количество элементов, требуемых для массива, следующим образом:

type arrayName [ arraySize ];

Это называется одномерным массивом. ArraySize должен быть целочисленной константой, большей нуля, а тип может быть любым допустимым типом данных языка программирования D. Например, чтобы объявить массив из 10 элементов с именем balance типа double, используйте этот оператор —

double balance[10]; 

Инициализация массивов

Вы можете инициализировать элементы массива языка программирования D по одному или использовать один оператор следующим образом

double balance[5] = [1000.0, 2.0, 3.4, 17.0, 50.0];

Количество значений в квадратных скобках [] справа не может быть больше, чем количество элементов, которые вы объявляете для массива в квадратных скобках []. В следующем примере назначается один элемент массива —

Если вы опустите размер массива, будет создан массив, достаточно большой, чтобы вместить инициализацию. Поэтому, если вы напишите

double balance[] = [1000.0, 2.0, 3.4, 17.0, 50.0]; 

тогда вы создадите точно такой же массив, как и в предыдущем примере.

balance[4] = 50.0; 

Приведенный выше оператор присваивает элементу номер 5 в массиве значение 50,0. Массив с 4-м индексом будет 5-м, т. Е. Последним элементом, поскольку все массивы имеют 0 в качестве индекса их первого элемента, который также называется базовым индексом. Следующее графическое изображение показывает тот же массив, который мы обсуждали выше —

Презентация массива

Доступ к элементам массива

Доступ к элементу осуществляется путем индексации имени массива. Это делается путем помещения индекса элемента в квадратные скобки после имени массива. Например —

double salary = balance[9];

Вышеприведенный оператор берет 10- й элемент из массива и присваивает значение переменной salary . В следующем примере реализуются объявления, присваивание и доступ к массивам:

Live Demo

import std.stdio;  
void main() { 
   int n[ 10 ]; // n is an array of 10 integers  
   
   // initialize elements of array n to 0 
   for ( int i = 0; i < 10; i++ ) { 
      n[ i ] = i + 100; // set element at location i to i + 100 
   }
   
   writeln("Element \t Value");
   
   // output each array element's value 
   for ( int j = 0; j < 10; j++ ) { 
      writeln(j," \t ",n[j]); 
   } 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Element   Value 
0         100 
1         101 
2         102 
3         103 
4         104 
5         105 
6         106 
7         107 
8         108 
9         109

Статические массивы и динамические массивы

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

Определение динамических массивов проще, чем определение массивов фиксированной длины, потому что пропуск длины делает динамический массив —

int[] dynamicArray; 

Свойства массива

Вот свойства массивов —

Sr.No. Описание недвижимости
1

.в этом

Статический массив возвращает литерал массива, где каждый элемент литерала является свойством .init типа элемента массива.

2

.размер

Статический массив возвращает длину массива, умноженную на количество байтов на элемент массива, в то время как динамические массивы возвращают размер ссылки на динамический массив, который равен 8 в 32-разрядных сборках и 16 в 64-разрядных сборках.

3

.length

Статический массив возвращает количество элементов в массиве, в то время как динамические массивы используются для получения / установки количества элементов в массиве. Длина имеет тип size_t.

4

.ptr

Возвращает указатель на первый элемент массива.

5

.dup

Создайте динамический массив того же размера и скопируйте в него содержимое массива.

6

.idup

Создайте динамический массив того же размера и скопируйте в него содержимое массива. Копия печатается как неизменяемая.

7

.задний ход

Меняет местами порядок элементов в массиве. Возвращает массив.

8

.Сортировать

Сортирует по порядку элементов в массиве. Возвращает массив.

.в этом

Статический массив возвращает литерал массива, где каждый элемент литерала является свойством .init типа элемента массива.

.размер

Статический массив возвращает длину массива, умноженную на количество байтов на элемент массива, в то время как динамические массивы возвращают размер ссылки на динамический массив, который равен 8 в 32-разрядных сборках и 16 в 64-разрядных сборках.

.length

Статический массив возвращает количество элементов в массиве, в то время как динамические массивы используются для получения / установки количества элементов в массиве. Длина имеет тип size_t.

.ptr

Возвращает указатель на первый элемент массива.

.dup

Создайте динамический массив того же размера и скопируйте в него содержимое массива.

.idup

Создайте динамический массив того же размера и скопируйте в него содержимое массива. Копия печатается как неизменяемая.

.задний ход

Меняет местами порядок элементов в массиве. Возвращает массив.

.Сортировать

Сортирует по порядку элементов в массиве. Возвращает массив.

пример

Следующий пример объясняет различные свойства массива —

Live Demo

import std.stdio;

void main() {
   int n[ 5 ]; // n is an array of 5 integers 
   
   // initialize elements of array n to 0 
   for ( int i = 0; i < 5; i++ ) { 
      n[ i ] = i + 100; // set element at location i to i + 100 
   }
   
   writeln("Initialized value:",n.init); 
   
   writeln("Length: ",n.length); 
   writeln("Size of: ",n.sizeof); 
   writeln("Pointer:",n.ptr); 
   
   writeln("Duplicate Array: ",n.dup); 
   writeln("iDuplicate Array: ",n.idup);
   
   n = n.reverse.dup; 
   writeln("Reversed Array: ",n);
   
   writeln("Sorted Array: ",n.sort); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Initialized value:[0, 0, 0, 0, 0] 

Length: 5 
Size of: 20 

Pointer:7FFF5A373920 
Duplicate Array: [100, 101, 102, 103, 104]
iDuplicate Array: [100, 101, 102, 103, 104] 
Reversed Array: [104, 103, 102, 101, 100] 
Sorted Array: [100, 101, 102, 103, 104]

Многомерные массивы в D

D программирование допускает многомерные массивы. Вот общая форма объявления многомерного массива —

type name[size1][size2]...[sizeN];

пример

Следующая декларация создает трехмерное 5. 10 4-х целочисленный массив —

int threedim[5][10][4];

Двумерные массивы в D

Простейшей формой многомерного массива является двумерный массив. Двумерный массив — это, по сути, список одномерных массивов. Чтобы объявить двумерный целочисленный массив размером [x, y], вы должны написать синтаксис следующим образом:

type arrayName [ x ][ y ];

Где тип может быть любым допустимым типом данных программирования D, а arrayName будет действительным идентификатором программирования D.

Где тип может быть любым допустимым типом данных программирования D, а arrayName является допустимым идентификатором программирования D.

Двумерный массив можно представить как таблицу, которая имеет x количество строк и y количество столбцов. Двумерный массив, содержащий три строки и четыре столбца, может быть показан ниже:

Двумерные массивы

Таким образом, каждый элемент в массиве a идентифицируется элементом как a [i] [j] , где a — это имя массива, а i и j — индексы, которые однозначно идентифицируют каждый элемент в a.

Инициализация двухмерных массивов

Многомерные массивы можно инициализировать, указав значения в скобках для каждой строки. Следующий массив имеет 3 строки, а каждая строка имеет 4 столбца.

int a[3][4] = [   
   [0, 1, 2, 3] ,   /*  initializers for row indexed by 0 */ 
   [4, 5, 6, 7] ,   /*  initializers for row indexed by 1 */ 
   [8, 9, 10, 11]   /*  initializers for row indexed by 2 */ 
];

Вложенные скобки, которые указывают на предполагаемый ряд, являются необязательными. Следующая инициализация эквивалентна предыдущему примеру —

int a[3][4] = [0,1,2,3,4,5,6,7,8,9,10,11];

Доступ к двумерным элементам массива

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

int val = a[2][3];

Вышеупомянутое утверждение берет 4-й элемент из 3-й строки массива. Вы можете проверить это в приведенной выше диграмме.

Live Demo

import std.stdio; 
  
void main () { 
   // an array with 5 rows and 2 columns. 
   int a[5][2] = [ [0,0], [1,2], [2,4], [3,6],[4,8]];  
   
   // output each array element's value                       
   for ( int i = 0; i < 5; i++ ) for ( int j = 0; j < 2; j++ ) {
      writeln( "a[" , i , "][" , j , "]: ",a[i][j]); 
   }
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

a[0][0]: 0 
a[0][1]: 0 
a[1][0]: 1 
a[1][1]: 2 
a[2][0]: 2 
a[2][1]: 4 
a[3][0]: 3 
a[3][1]: 6 
a[4][0]: 4 
a[4][1]: 8

Распространенные операции над массивами в D

Вот различные операции, выполняемые над массивами —

Нарезка массива

Мы часто используем часть массива, и нарезка массива часто весьма полезна. Простой пример нарезки массива показан ниже.

Live Demo

import std.stdio;
  
void main () { 
   // an array with 5 elements. 
   double a[5] = [1000.0, 2.0, 3.4, 17.0, 50.0]; 
   double[] b;
   
   b = a[1..3]; 
   writeln(b); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

[2, 3.4]

Копирование массива

Мы также используем копирование массива. Простой пример копирования массива показан ниже.

Live Demo

import std.stdio;

void main () { 
   // an array with 5 elements. 
   double a[5] = [1000.0, 2.0, 3.4, 17.0, 50.0]; 
   double b[5]; 
   writeln("Array a:",a); 
   writeln("Array b:",b);  
   
   b[] = a;      // the 5 elements of a[5] are copied into b[5] 
   writeln("Array b:",b);  
   
   b[] = a[];   // the 5 elements of a[3] are copied into b[5] 
   writeln("Array b:",b); 
   
   b[1..2] = a[0..1]; // same as b[1] = a[0] 
   writeln("Array b:",b); 
   
   b[0..2] = a[1..3]; // same as b[0] = a[1], b[1] = a[2]
   writeln("Array b:",b); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Array a:[1000, 2, 3.4, 17, 50] 
Array b:[nan, nan, nan, nan, nan] 
Array b:[1000, 2, 3.4, 17, 50] 
Array b:[1000, 2, 3.4, 17, 50] 
Array b:[1000, 1000, 3.4, 17, 50] 
Array b:[2, 3.4, 3.4, 17, 50]

Настройка массива

Простой пример установки значения в массиве показан ниже.

Live Demo

import std.stdio;

void main () { 
   // an array with 5 elements. 
   double a[5]; 
   a[] = 5; 
   writeln("Array a:",a); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —

Array a:[5, 5, 5, 5, 5]

Конкатенация массивов

Простой пример объединения двух массивов показан ниже.

Live Demo

import std.stdio;

void main () { 
   // an array with 5 elements. 
   double a[5] = 5; 
   double b[5] = 10; 
   double [] c; 
   c = a~b; 
   writeln("Array c: ",c); 
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —