Задание 3. Массивы массивов




Еще одним видом массивов C# являются массивы массивов, называемые также изрезанными массивами (jagged arrays). Такой массив массивов можно рассматривать как одномерный массив, элементы которого являются массивами, элементы которых, в свою очередь, снова могут быть массивами, и так может продолжаться до некоторого уровня вложенности.

В каких ситуациях может возникать необходимость в таких структурах данных? Эти массивы могут применяться для представления деревьев, у которых узлы могут иметь произвольное число потомков. Таковым может быть, например, генеалогическое дерево. Есть некоторые особенности в объявлении и инициализации таких массивов. Если при объявлении типа многомерных массивов для указания размерности использовались запятые, то для изрезанных массивов применяется более ясная символика - совокупности пар квадратных скобок; например, int[][] задает массив, элементы которого - одномерные массивы элементов типа int.

Сложнее с созданием самих массивов и их инициализацией. Здесь нельзя вызвать конструктор new int[3][5], поскольку он не задает изрезанный массив. Фактически нужно вызывать конструктор для каждого массива на самом нижнем уровне. В этом и состоит сложность объявления таких массивов. Рассмотрим формальный пример:

 

//массив массивов - формальный пример

//объявление и инициализация

int[][] jagger = new int[3][]

{

new int[] {5,7,9,11},

new int[] {2,8},

new int[] {6,12,4}

};

 

Массив jagger имеет всего два уровня. Можно считать, что у него три элемента, каждый из которых является массивом. Для каждого такого массива необходимо вызвать конструктор new, чтобы создать внутренний массив. В данном примере элементы внутренних массивов получают значение, будучи явно инициализированы константными массивами. Конечно, допустимо и такое объявление:

int[][] jagger1 = new int[3][]

{

new int[4],

new int[2],

new int[3]

};

 

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

 

int[][] jagger2 =

{

new int[4],

new int[2],

new int[3]

};

А вот конструкторы нижнего уровня необходимы. Еще одно важное замечание - динамические массивы возможны и здесь. В общем случае, границы на любом уровне могут быть выражениями, зависящими от переменных. Более того, допустимо, чтобы массивы на нижнем уровне были многомерными. Но это уже "от лукавого" - вряд ли стоит пользоваться такими сложными структурами данных, ведь с ними предстоит еще и работать.

1. В классе Arrs напишите функцию PrintArr3 для вывода двумерного массива массивов;

Методические указания: Поскольку в данном случае используется не «матрица», а массив массивов, то логично вместо функции GetLength() использовать свойство Length для соответствующего массива.

2. В классе Arrs напишите функцию CreateAr3 заполнения двумерного массива произвольными числами (по аналогии с одномерным массивом);

3. Опишите массив R размерностью 10 массивов, каждый из которых на 1 больше предыдущего; (R[0] – содержит массив из одного элемента, а R[5] – массив из шести элементов)

4. Инициализируйте массив R случайными значениями;

5. Выведите его содержимое на консоль;

 

Основные свойства и методы для работы с массивами класса Array

1) свойство Length возвращает общее число элементов массива во всех измерениях;

2) свойство Rank возвращает размерность массива (1 — одномерный, 2 — двухмерный и т.д.);

3) статический метод Clear() очищает массив, устанавливая для всех его элементов (или его части) значение по умолчанию;

4) статический метод Copy() копирует часть одного массива в другой массив;

5) статический метод Exists() проверяет, содержит ли массив определенный элемент;

6) статический метод Find() находит элемент, который удовлетворяет определенному условию;

7) статический метод FindAll() находит все элементы, которые удовлетворяет определенному условию;

8) статический метод IndexOf() возвращает индекс элемента;

9) статический метод Resize() изменяет размер одномерного массива;

10) статический метод Reverse() располагает элементы массива в обратном порядке;

11) статический метод Sort() сортирует элементы одномерного массива;

12) статический метод BinarySearch() выполняет бинарный поиск в отсортированном массиве.

 

Синтаксис метода:

[ атрибуты ] [ спецификаторы ] тип имя_метода ([ параметры ])

тело_метода

 

[ атрибуты ] [ спецификаторы ] class имя_класса [: предки ]

тело_класса

Контрольные вопросы

1. Почему для работы с массивами в данной лабораторной работе, в основном, используются статические методы?

2. Как можно определить размер переданного в функцию массива?

3. Можно ли в массивах на языке C# использовать индексацию? начинающуюся с 1?

4. Можно ли создать массив без его инициализации?

5. Разрешена ли операция присваивания между массивами?

6. Как в языке C# объявить динамический массив? Как объявить статический?

7. Как описывается многомерный массив? Как определяется его размерность?

8. Чем отличаются многомерные массивы от изрезанных массивов?

9. Каковы отличия свойства Length и метода GetLength с точки зрения возвращаемого значения?

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-12-05 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: