1   2   3   4   5   6
Ім'я файлу: конспект №1.docx
Розширення: docx
Розмір: 71кб.
Дата: 14.11.2021
скачати

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


Массивы характеризуются таким понятием как ранг или количество измерений. Выше мы рассматривали массивы, которые имеют одно измерение (то есть их ранг равен 1) - такие массивы можно представлять в виде горзонтального ряда элемента. Но массивы также бывают многомерными. У таких массивов количество измерений (то есть ранг) больше 1.

Массивы которые имеют два измерения (ранг равен 2) называют двухмерными. Например, создадим одномерный и двухмерный массивы, которые имеют одинаковые элементы:

1

2

3

int[] nums1 = new int[] { 0, 1, 2, 3, 4, 5 };

 

int[,] nums2 = { { 0, 1, 2 }, { 3, 4, 5 } };

Визуально оба массива можно представить следующим образом:
Одномерный массив nums1

0

1

2

3

4

5
Двухмерный массив nums2

0

1

2

3

4

5

Поскольку массив nums2 двухмерный, он представляет собой простую таблицу. Все возможные способы определения двухмерных массивов:

1

2

3

4

5

6

int[,] nums1;

int[,] nums2 = new int[2, 3];

int[,] nums3 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } };

int[,] nums4 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };

int[,] nums5 = new [,]{ { 0, 1, 2 }, { 3, 4, 5 } };

int[,] nums6 = { { 0, 1, 2 }, { 3, 4, 5 } };

Массивы могут иметь и большее количество измерений. Объявление трехмерного массива могло бы выглядеть так:

1

int[,,] nums3 = new int[2, 3, 4];

Соответственно могут быть и четырехмерные массивы и массивы с большим количеством измерений. Но на практике обычно используются одномерные и двухмерные массивы.

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

1

2

3

4

int[,] mas = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };

foreach (int i in mas)

    Console.Write($"{i} ");

Console.WriteLine();

В данном случае длина массива mas равна 12. И цикл foreach выводит все элементы массива в строку:

1 2 3 4 5 6 7 8 9 10 11 12

Но что если мы хотим отдельно пробежаться по каждой строке в таблице? В этом случае надо получить количество элементов в размерности. В частности, у каждого массива есть метод GetUpperBound(dimension), который возвращает индекс последнего элемента в определенной размерности. И если мы говорим непосредственно о двухмерном массиве, то первая размерность (с индексом 0) по сути это и есть таблица. И с помощью выражения mas.GetUpperBound(0) + 1 можно получить количество строк таблицы, представленной двухмерным массивом. А через mas.Length / rows можно получить количество элементов в каждой строке:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

int[,] mas = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };

 

int rows = mas.GetUpperBound(0) + 1;

int columns = mas.Length / rows;

// или так

// int columns = mas.GetUpperBound(1) + 1;

 

for (int i = 0; i < rows; i++)

{

    for (int j = 0; j < columns; j++)

    {

        Console.Write($"{mas[i, j]} \t");

    }

    Console.WriteLine();

}

1 2 3

4 5 6

7 8 9

10 11 12

Массив массивов


От многомерных массивов надо отличать массив массивов или так называемый "зубчатый массив":

1

2

3

4

int[][] nums = new int[3][];

nums[0] = new int[2] { 1, 2 };          // выделяем память для первого подмассива

nums[1] = new int[3] { 1, 2, 3 };       // выделяем память для второго подмассива

nums[2] = new int[5] { 1, 2, 3, 4, 5 }; // выделяем память для третьего подмассива

Здесь две группы квадратных скобок указывают, что это массив массивов, то есть такой массив, который в свою очередь содержит в себе другие массивы. Причем длина массива указывается только в первых квадратных скобках, все последующие квадратные скобки должны быть пусты: new int[3][]. В данном случае у нас массив nums содержит три массива. Причем размерность каждого из этих массивов может не совпадать.
Зубчатый массив nums

1

2










1

2

3







1

2

3

4

5

Примеры массивов:

Причем мы можем использовать в качестве массивов и многомерные:

1

2

3

4

5

6

int[][,] nums = new int[3][,]

{

    new int[,] { {1,2}, {3,4} },

    new int[,] { {1,2}, {3,6} },

    new int[,] { {1,2}, {3,5}, {8, 13} }

};

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

Используя вложенные циклы, можно перебирать зубчатые массивы. Например:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

int[][] numbers = new int[3][];

numbers[0] = new int[] { 1, 2 };

numbers[1] = new int[] { 1, 2, 3 };

numbers[2] = new int[] { 1, 2, 3, 4, 5 };

foreach(int[] row in numbers)

{

    foreach(int number in row)

    {

        Console.Write($"{number} \t");

    }

    Console.WriteLine();

}

 

// перебор с помощью цикла for

for (int i = 0; i
{

    for (int j =0; j
    {

        Console.Write($"{numbers[i][j]} \t");

    }

    Console.WriteLine();

}

Основные понятия массивов


Суммирую основные понятия массивов:

Например, возьмем массив

1

int[,] numbers = new int[3, 4];

Массив numbers двухмерный, то есть он имеет два измерения, поэому его ранг равен 2. Длина первого измерения - 3, длина второго измерения - 4. Длина массива (то есть общее количество элементов) - 12.

Задачи с массивами


Рассмотрим пару задач для работы с массивами.

Найдем количество положительных чисел в массиве:

1

2

3

4

5

6

7

8

9

10

int[] numbers = { -4, -3, -2, -1, 0, 1, 2, 3, 4 };

int result = 0;

foreach(int number in numbers)

{

    if(number > 0)

    {

        result++;

    }

}

Console.WriteLine($"Число элементов больше нуля: {result}");

Вторая задача - инверсия массива, то есть переворот его в обратном порядке:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

int[] numbers = { -4, -3, -2, -1,0, 1, 2, 3, 4 };

             

int n = numbers.Length; // длина массива

int k = n / 2;          // середина массива

int temp;               // вспомогательный элемент для обмена значениями

for(int i=0; i < k; i++)

{

    temp = numbers[i];

    numbers[i] = numbers[n - i - 1];

    numbers[n - i - 1] = temp;

}

foreach(int i in numbers)

{

    Console.Write($"{i} \t");

}

Поскольку нам надо изменять элементы массива, то для этого используется цикл for. Алгоритм решения задачи подразумевает перебор элементов до середины массива, которая в программе представлена переменной k, и обмен значений элемента, который имеет индекс i, и элемента с индексом n-i-1.
1   2   3   4   5   6

скачати

© Усі права захищені
написати до нас