Программирование на языке C#
Download 1.19 Mb. Pdf ko'rish
|
Программирование на языке C#
9.4.
Ступенчатые массивы В языке C# можно создавать ступенчатые (зубчатые) массивы, являющиеся специальным типом массива либо, другими словами, массивы массивов. Они отличаются от массивов, которые рассматривались ранее, по способу объявления, создания, а также возможностям. Основной отличительной чертой этих массивов является, то, что каждая строка такого массива может иметь собственную длину. Объявление ступенчатого массива выполняется с помощью последовательности спецификаторов размерности массива, они могут иметь различные измерения и размеры. Чтобы понять, какая структура создается, необходимо спецификаторы читать слева направо. Например, рассмотрим объявление int[][,,][,] array; – здесь объявляется одномерный массив, элементы которого являются трехмерным массивом, в свою очередь, элементы которого являются двумерным массивом. Если быть точнее, то объявляется ссылка на массив такой структуры, после чего необходимо создать экземпляр массива в памяти. Заметим, что с формальной точки зрения последовательность видов спецификаторов (одномерные, двумерные, трехмерные), могут быть разными, здесь нужно четко понимать, какую многомерную структуру требуется создать. За один шаг с помощью оператора new такую структуру создать невозможно, как в случае прямоугольных массивов. Необходимо создавать массивы для каждой размерности отдельно. Рассмотрим процедуру создания ступенчатого массива более подробно, на простом примере, в котором объявим пустую ссылку вида int[][] array . Предполагаемая структура в памяти (читаем слева направо) это массив массивов. Для создания такой структуры потребуется выполнить два шага, на первом шаге создаем массив ссылок на одномерный массив, на втором шаге каждую ссылку необходимо проинициализировать, т. е. создать массив. Распишем необходимые действия по шагам. int[][] array = null; //Объявление ссылки array = new int[5][]; //Создание массива ссылок из пяти элементов В первой строке объявляется ссылка на создаваемый массив рассматриваемой структуры. Во второй строке создаем массив из 5 элементов, где каждый элемент также является массивом. Поскольку 56 массив – это ссылочная структура, мы можем сказать, что создан массив ссылок из 5 элементов, в котором требуется выполнить их инициализацию. Для этого организуем цикл for , в котором проинициализируем каждую ячейку массива array[i] с помощью оператора new , в результате получим структуру, показанную на Рис. 9. for(int i=0;i<5;i++){ array[i] = new int [5]; } array array[0] N array[1] array[2] array[3] array[4] Рис. 9. Структура массив массивов, состоящая из пяти строк и пяти столбцов Рассмотрим создание ступенчатых массивов более сложных конструкций, например. int[,][] array = null; В этом примере объявляется ссылка на двумерный массив, в которой каждая ячейка есть ссылка массив. Создание такой структуры реализуется следующим образом. Сначала создаем двумерный массив ссылок, здесь, в качестве примера, рассмотрим размерность 3 на 2, далее в цикле обращаемся к каждой ячейке array[i,j] , являющейся ссылкой на одномерный массив и инициализируем ее с помощью оператора new , т. е. создаем одномерный массив, например из трех элементов. array = new int [3,2][]; for(int i=0; i<3 ; i++){ for(int j=0; j<2;j++){ array[i,j] = new int[3]; } } В следующем фрагменте кода рассмотрим способ обращения к ячейкам такой структуры, заполнив её случайными числами. С этой целью сначала выполняем обход по первой размерности, т.е двумерной матрице, далее по второй, являющейся одномерным массивом. В результате получаем три вложенных цикла for . С 57 помощью первых двух реализуется обход по матрице, с помощью третьего for обход по элементам одномерного массива. Random rnd = new Random(); for(int i=0; i<3 ;i++){ for(int j=0;j<2;j++){ for(int k=0;k<3;k++) array[i,j][k] = rnd.Next(1,10); } } Ступенчатые массивы представляют собой более гибкую многомерную структуру, чем прямоугольные массивы. Это связано с тем, что в ступенчатых массивах появляется возможность манипуляции не только с элементами, но и со строками, за счет наличия прямого доступа к ссылкам строк. К таким манипуляциям можно отнести обмен строк и удаление строк. Операция обмена строк применяется, когда необходимо установить некоторый порядок следования строк в матрице. Например, для реализации обмена i-ой и j-ой строки в прямоугольной матрице потребуется организация цикла, в котором будет выполняться обмен строк поэлементно, как показано в листинге 10, что, на самом деле затратно, если такую операцию необходимо выполнять часто. int[,] Mx = new int[3, 3] { { 0, 0, 0 }, { 1, 2, 3 }, { 4, 5, 6 } }; int tmp; int i = 0, j = 2; for (int k = 0; k<3; k++){ tmp = Mx[i, k]; Mx[i, k] = Mx[j,k]; Mx[j,k] = tmp; } Листинг 10. В случае ступенчатого массива при обмене строк цикл использовать не нужно, достаточно поменять местами только ссылки в соответствующих ячейках, как показано в листинге 11. Для реализации операции обмена объявляется временная переменная int[] tmpR , тип которой соответствует типу ячейки ступенчатого массива, затем выполняется обычная операция обмена строк с номерами i , j . int[][] MxJ= new int[3][] { new int[3] { 0, 0, 0 }, new int[3] { 1, 2, 3 }, new int[3] { 4, 5, 6 }}; i = 0; j = 2; int[] tmpR = MxJ[i]; 58 MxJ[i] = MxJ[j]; MxJ[j] = tmpR; Листинг 11. Очевидно, что код, представленный в листинге 11, содержит меньше операций, чем в случае обмена строк для прямоугольной матрицы (листинг 10). Следовательно, если в решение задачи обмен строк является частой операцией, то в качестве основной структуры лучше использовать ступенчатые массивы. Для ступенчатой структуры также доступна операция исключения (удаления) строк, которая выполняется простой заменой значения соответствующей ячейки на значение null . Такая операция требуется в случае, когда необходимо исключить из рассмотрения некоторые данные. Рассмотрим на примере. Пусть имеются целочисленные данные, хранящиеся в ступенчатом двумерном массиве. Предположим, что данные, хранящиеся в строках, участвуют в вычислении, причем, именно те, в которых хранятся различные значения. Строки матрицы, содержащие одинаковые значения, не участвуют в процессе вычисления, следовательно их необходимо как-то помечать, чтобы исключать из решения. В случае прямоугольной матрицы, как правило, заводят дополнительный 3>3> Download 1.19 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling