1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 31
Текст из файла (страница 31)
Массивы и строки159В этом примере элемент массива table[0,0] получит число 1, элементtable[0,1] — число 2, элемент table[0,2] — число 3 и т.д. Значение элементаtable[2,3] будет равно 12. Схематически этот массив можно представить, как показанона рис. 7.1.0123012341567829101112Левый индексПравый индексtable[1,2]Рис. 7.1. Схематическое представление массива table, созданное программой TwoDНа заметкуЕсли вы уже знакомы с языками C или C++, обратите внимание на объявлениемногомерных массивов в C# и доступ к их элементам.
В языках C или C++значения размерностей массивов и индексы указываются в отдельных парахквадратных скобок В C# значения размерностей отделяются запятыми.Массивы трех и более измеренийВ C# можно определять массивы трех и более измерений. Вот как объявляетсямногомерный массив:тип[, .. ,] имя = new тип[размер1, ..., размерN];Например, с помощью следующего объявления создается трехмерныйцелочисленный массив размером 4x10x3:int[, ,] multidim = new int[4, 10, 3];Чтобы присвоить число 100 элементу массива multidim, занимающему позицию скоординатами 2,4,1, используйте такую инструкцию:multidim[2, 4, 1] = 100;Рассмотрим программу, в которой используется трехмерный массив, содержащий3x3x3-матрицу значений.// Программа суммирует значения, расположенные// на диагонали 3x3x3-матрицы.using System;class ThreeDMatrix {public 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; y < 3; y++)for(int z=0; z < 3; z++)m[x, y, z] = n++;160Часть I.
Язык C#}}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 {public 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();}}}Глава 7. Массивы и строки161Результаты выполнения этой программы:1 12 43 94 165 256 367 498 649 8110 100Рваные массивыВ предыдущем примере мы создавали двумерный массив, который в C# называетсяпрямоугольным.
Если двумерный массив можно представить в виде таблицы, топрямоугольный массив можно определить как массив, строки которого имеют одинаковуюдлину. Однако 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[0][0]jagged[0][1]jagged[0][2]jagged[l][0]jagged[l][1]jagged[l][2]jagged[2][0]jagged[2][1]jagged[2][2]jagged[0][3]jagged[2][3]jagged[2][4]Теперь вам, вероятно, понятно, откуда у рваных массивов такое название.После создания рваного массива доступ к элементу осуществляется посредствомзадания индекса внутри собственного набора квадратных скобок.
Например, чтобыприсвоить число 10 элементу массива jagged с координатами 2 и 1, используйте такуюинструкцию:jagged[2][1] = 10;Обратите внимание на то, что этот синтаксис отличается от того, которыйиспользуется для доступа к элементам прямоугольного массива.Следующая программа демонстрирует создание рваного двумерного массива.162Часть I. Язык C#// Демонстрация рваных массивов.using System;class Jagged {public 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;// Сохраняем значения в третьем массиве.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Рваные массивы используются нечасто, но в некоторых ситуациях они могутоказаться весьма эффективными.
Например, если вам нужен очень большой двумерныймассив с неполным заполнением (т.е. массив, в котором используются не все его элементы),то идеальным решением может оказаться массив именно такой, неправильной формы.Глава 7. Массивы и строки163И еще. Поскольку рваные массивы — это по сути массивы массивов, то совсем необязательно, чтобы “внутренние” массивы имели одинаковый тип. Например, этаинструкция создает массив двумерных массивов:int[][,] jagged = new int[3][,];А эта инструкция присваивает элементу jagged[0] ссылку на массив размером 4x2:jagged[0] = new int[4][2];Следующая инструкция присваивает значение переменной i элементуjagged[0][1,0].jagged[0][1,0] = i;Присвоение значений ссылочным переменныммассивовКак и в случае других объектов, присваивая одной ссылочной переменной массивадругую, вы просто изменяете объект, на который ссылается эта переменная.
При этом неделается копия массива и не копируется содержимое одного массива в другой. Рассмотрим,например, следующую программу:// Присвоение значений ссылочным переменным массивов.using System;class AssignARef {public static void Main() {int i;int[] nums1 = new int[10];int[] nums2 = new int[10];for(i=0; inums1[i]for(i=0; inums2[i]<=<=10; i++)i;10; 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("Содержимое массива nums2 после \nприсваивания; ");for(i=0; i < 10; i++)Console.Write(nums2[i] + " ");Console.WriteLine();// Теперь воздействуем на массив nums1164Часть I.
Язык C#}}// посредством переменной nums 2.nums2[3] = 99;Console.Write("Содержимое массива nums1 после\n" +"его изменения посредством nums2: ");for(i=0; i < 10; i++)Console.Write(nums1[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Как видно по результатам выполнения этой программы, после присвоениясодержимого переменной nums1 переменной nums2 обе они ссылаются на один и тот жеобъект.Использование свойства LengthИз того факта, что в C# массивы реализованы как объекты, программисты могутизвлечь много пользы.
Например, с каждым массивом связано свойство Length,содержащее количество элементов, которое может хранить массив. Использование этогосвойства демонстрируется в следующей программе.// Использование свойства Length.using System;class LengthDemo {public static void Main() {int[] nums = new int[10];Console.WriteLine("Длина массива nums равна " +nums.Length);// Используем Length для инициализации массива nums.for(int i=0; i < nums.Length; i++)nums[i] = i * i;}}// Теперь используем Length для отображения nums.Console.Write("Содержимое массива nums: ");for(int i=0; i < nums.Length; i++)Console.Write(nums[i] + " ");Console.WriteLine();При выполнении этой программы получаются следующие результаты:Длина массива nums равна 10Содержимое массива nums: 0 1 4 9 16 25 36 49 64 81Глава 7.