Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
В C# допускаются массивы трех и более измерений. Ниже приведена общая формаобъявления многомерного массива.тип[,...,] имя_массива = new тип[размер1, размер2, ... размерN];
Например, в приведенном ниже объявлении создается трехмерный целочисленный массив размерами 4×10×3.int[,,] multidim = new int[4, 10, 3];
А в следующем операторе элементу массива multidim с координатами местоположения (2,4,1) присваивается значение 100.multidim[2, 4, 1] = 100;
Ниже приведен пример программы, в которой сначала организуется трехмерныймассив, содержащий матрицу значений 3×3×3, а затем значения элементов этого массива суммируются по одной из диагоналей матрицы.// Суммировать значения по одной из диагоналей матрицы 3×3×3.using System;class ThreeDMatrix { static void Main() { int[,,] m = new int[3, 3, 3]; int sum = 0; int n = 1; for(int x=0; x < 3; x++) for(int y=0; у < 3; y++) for(int z=0; z < 3; z++) m[x, y, z] = n++; sum = m[0, 0, 0] + m[1, 1, 1] + m[2, 2, 2]; Console.WriteLine("Сумма значений по первой диагонали: " + sum); }}
Вот какой результат дает выполнение этой программы.Сумма значений по первой диагонали: 42Инициализация многомерных массивов
Для инициализации многомерного массива достаточно заключить в фигурныескобки список инициализаторов каждого его размера. Ниже в качестве примера приведена общая форма инициализации двумерного массива:тип[,] имя_массива = { {val, val, val, ..., val}, {val, val, val, ..., val}, {val, val, val, ..., val}};
где val обозначает инициализирующее значение, а каждый внутренний блок — отдельный ряд. Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение — на второй позиции и т.д. Обратите внимание на то, что блокиинициализаторов разделяются запятыми, а после завершающей эти блоки закрывающей фигурной скобки ставится точка с запятой.
В качестве примера ниже приведена программа, в которой двумерный массив sqrsинициализируется числами от 1 до 10 и квадратами этих чисел.// Инициализировать двумерный массив.using System;class Squares { static void Main() { int[,] sqrs = { { 1, 1 }, { 2, 4 }, { 3, 9 }, { 4, 16 }, { 5, 25 }, { 6, 36 }, { 7, 49 }, { 8, 64 }, { 9, 81 }, { 10, 100 } }; int i, j; for(i=0; i < 10; i++) { for(j=0; j < 2; j++) Console.Write(sqrs[i,j] + " "); Console.WriteLine(); } }}
При выполнении этой программы получается следующий результат.1 12 43 94 165 256 367 498 649 8110 100Ступенчатые массивы
В приведенных выше примерах применения двумерного массива, по существу, создавался так называемый прямоугольный массив. Двумерный массив можно представитьв виде таблицы, в которой длина каждой строки остается неизменной по всему массиву. Но в C# можно также создавать специальный тип двумерного массива, называемыйступенчатым массивом. Ступенчатый массив представляет собой массив массивов, в котором длина каждого массива может быть разной. Следовательно, ступенчатый массивможет быть использован для составления таблицы из строк разной длины.
Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которыхуказывается их размерность. Например, для объявления двумерного ступенчатого массива служит следующая общая форма:тип[][] имя_массива = new тип[размер][];
где размер обозначает число строк в массиве. Память для самих строк распределяетсяиндивидуально, и поэтому длина строк может быть разной. Например, в приведенномниже фрагменте кода объявляется ступенчатый массив jagged. Память сначала распределяется для его первого измерения автоматически, а затем для второго измерениявручную.int[][] jagged = new int[3][];jagged[0] = new int[4];jagged[1] = new int[3];jagged[2] = new int[5];
После выполнения этого фрагмента кода массив jagged выглядит так, как показано ниже.
Теперь нетрудно понять, почему такие массивы называются ступенчатыми! Послесоздания ступенчатого массива доступ к его элементам осуществляется по индексу,указываемому в отдельных квадратных скобках. Например, в следующей строке кодаэлементу массива jagged, находящемуся на позиции с координатами (2,1), присваивается значение 10.jagged[2][1] = 10;
Обратите внимание на синтаксические отличия в доступе к элементу ступенчатогои прямоугольного массива.
В приведенном ниже примере программы демонстрируется создание двумерногоступенчатого массива.// Продемонстрировать применение ступенчатых массивов.using System;class Jagged { static void Main() { int[][] jagged = new int[3][]; jagged[0] = new int[4]; jagged[1] = new int[3]; jagged[2] = new int[5]; int i; // Сохранить значения в первом массиве. for(i=0; i < 4; i++) jagged[0] [i] = i; // Сохранить значения во втором массиве. for(i=0; i < 3; i++) jagged[1][i] = i; jagged [0][0] jagged [1][0] jagged [2][0] jagged [0][1] jagged [1][1] jagged [2][1] jagged [0][2] jagged [0][3] jagged [1][2] jagged [2][2] jagged [2][3] jagged [2][4] // Сохранить значения в третьем массиве. for(i=0; i < 5; i++) jagged[2][i] = i; // Вывести значения из первого массива. for(i=0; i < 4; i++) Console.Write(jagged[0][i] + " "); Console.WriteLine(); // Вывести значения из второго массива. for(i=0; i < 3; i++) Console.Write(jagged[1][i] + " "); Console.WriteLine(); // Вывести значения из третьего массива. for(i=0; i < 5; i++) Console.Write(jagged [2] [i ] + " ") ; Console.WriteLine(); }}
Выполнение этой программы приводит к следующему результату.0 1 2 30 1 20 1 2 3 4
Ступенчатые массивы находят полезное применение не во всех, а лишь в некоторыхслучаях. Так, если требуется очень длинный двумерный массив, который заполняетсяне полностью, т.е. такой массив, в котором используются не все, а лишь отдельные егоэлементы, то для этой цели идеально подходит ступенчатый массив.
И последнее замечание: ступенчатые массивы представляют собой массивы массивов, и поэтому они не обязательно должны состоять из одномерных массивов. Например, в приведенной ниже строке кода создается массив двумерных массивов.int[][,] jagged = new int[3][,];
В следующей строке кода элементу массива jagged[0] присваивается ссылка намассив размерами 4×2.jagged[0] = new int[4, 2];
А в приведенной ниже строке кода элементу массива jagged[0][1,0] присваивается значение переменной i.jagged[0][1,0] = i;Присваивание ссылок на массивы
Присваивание значения одной переменной ссылки на массив другой переменной, по существу, означает, что обе переменные ссылаются на один и тот же массив,и в этом отношении массивы ничем не отличаются от любых других объектов. Такоеприсваивание не приводит ни к созданию копии массива, ни к копированию содержимого одного массива в другой. В качестве примера рассмотрим следующую программу.// Присваивание ссылок на массивы.using System;class AssignARef { static void Main() { int i; int[] nums1 = new int[10]; int[] nums2 = new int [10]; for(i=0; i < 10; i++) nums1[i] = i; for(i=0; i < 10; i++) nums2[i] = -i; Console.Write("Содержимое массива nums1: "); for(i=0; i < 10; i++) Console.Write(nums1[i] + " "); Console.WriteLine(); Console.Write("Содержимое массива nums2: "); for(i=0; i < 10; i++) Console.Write(nums2[i] + " "); Console.WriteLine(); nums2 = nums1; // теперь nums2 ссылается на nums1 Console.Write("Содержимое массива nums2n" + "после присваивания: "); for(i=0; i < 10; i++) Console.Write(nums2[i] + " "); Console.WriteLine(); // Далее оперировать массивом nums1 посредством // переменной ссылки на массив nums2. nums2[3] = 99; Console.Write("Содержимое массива nums1 после измененияn" + "посредством переменной nums2: "); for(i=0; i < 10; i++) Console.Write(numsl[i] + " "); Console.WriteLine(); }}
Выполнение этой программы приводит к следующему результату.Содержимое массива nums1: 0 1 2 3 4 5 6 7 8 9Содержимое массива nums2: 0 -1 -2 -3 -4 -5 -6 -7 -8 -9Содержимое массива nums2после присваивания: 0 1 2 3 4 5 6 7 8 9Содержимое массива nums1 после измененияпосредством переменной nums2: 0 1 2 99 4 5 6 7 8 9