Г. Шилдт - Полный справочник по C# (1160789), страница 32
Текст из файла (страница 32)
Массивы и строки159В этом примере элемент массива t a b l e [ 0 , 0 ] получит число 1, элементt a b l e [ 0 , 1 ] — число 2, элемент t a b l e [ 0 , 2 ] — число 3 и т.д. Значение элементаt a b l e [ 2 , 3 ] будет равно 12. Схематически этот массив можно представить, как показано на рис. 7.1.правый индекс11256910левый индекс34D8и12(table[1][2]Рис.
7.1. Схематическое представление массивасозданное программой TwoDНа заметкуtable,Если вы уже знакомы с языками С или C++, обратите внимание на объявлениемногомерных массивов в С# и доступ к их элементам. В языках С или C++ значения размерностей массивов и индексы указываются в отдельных парахквадратных скобок В С# значения размерностей отделяются запятыми.Массивы трех и более измеренийВ С# можно определять массивы трех и более измерений.
Вот как объявляетсямногомерный массив:ТИП[,.. , ] имя = new тип[размер1,..., размеры] ;Например, с помощью следующего объявления создается трехмерный целочисленный массив размером 4x10x3:I i n t [, ,] multidim = new m t [ 4 , 10, 3 ] ;Чтобы присвоить число 100 элементу массива multidim, занимающему позицию скоординатами 2,4,1, используйте такую инструкцию:I m u l t i d i m [ 2 f 4, 1] = 100;Рассмотрим программу, в которой используется трехмерный массив, содержащийЗхЗхЗ-матрицу значений.// Программа суммирует значения, расположенные// на диагонали ЗхЗхЗ-матрицы.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 <for(int y=0; уfor(int z=0;m[x, y, z]1603; x++)< 3; y++)z < 3; z++)= n++;Часть I.
Язык С #sum= m[0,0,0] + m [ l , l , l ]+ m [ 2 , 2, 2 ] ;C o n s o l e . W r i t e L i n e ( " С у м м а первой д и а г о н а л и : " + s u m ) ;IВот результаты выполнения этой программы:Сумма первой диагонали: 42Инициализация многомерных массивовМногомерный массив можно инициализировать, заключив список инициализаторов каждой размерности в собственный набор фигурных скобок.
Например, вот каковформат инициализации двумерного массива:тип[,] имя_массива = {{val, val, val, ..., val}{val, valf val, ..., val}{val,val,val,...,val}Здесь элемент val — значение инициализации. Каждый внутренний блок означаетстроку. В каждой строке первое значение будет сохранено в первой позиции массива,второе значение — во второй и т.д. Обратите внимание на то, что блоки инициализаторов отделяются запятыми, а точка с запятой становится только после закрывающейфигурной скобки.Например, следующая программа инициализирует массив s q r s числами от 1 до 10и квадратами этих чисел.// Инициализация двумерного массива.u s i n g System;чc l a s s Squares {p u b l i c s t a t i c void Main() {int[,] sqrs = {{ 1, 1 },{ 2, 4 },{ 3, 9 },{ 4, 16 },{ 5, 25 },{ 6, 36 },{ 7, 49 },{ 8, 64 },{ 9, 81 }f{ 10, 100 }inti, 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Рваные массивыВ предыдущем примере мы создавали двумерный массив, который в С# называется прямоугольным. Если двумерный массив можно представить в виде таблицы, топрямоугольный массив можно определить как массив, строки которого имеют одинаковую длину. Однако С# позволяет создавать двумерный массив специального типа,именуемый рваным, или с рваными краями. У такого массива строки могут иметь различную длину. Следовательно, рваный массив можно использовать для создания таблицы со строками разной длины.Рваные массивы объявляются с помощью наборов квадратных скобок, обозначающих размерности массива.
Например, чтобы объявить двумерный рваный массив, используется следующий формат записи:ТИП[][]имя = n e wтип[размер][];Здесь элемент размер означает количество строк в массиве. Для самих строк память выделяется индивидуально, что позволяет строкам иметь разную длину. Например, следующий фрагмент программы при объявлении массива jagged выделяет память для его первой размерности, а память для его второй размерности выделяется"вручную".i n t [ ] [ ] j a g g e d = new i n t [ 3 ] [ ] ;j a g g e d [ 0 ] = new i n t [ 4 ] ;j a g g e d [ 1 ] = new i n t [ 3 ] ;j a g g e d [ 2 ] = new i n t [ 5 ] ;После выполнения этого фрагмента кода массив jagged выглядит так:jagged[0] [0]jagged[0] [1]jagged[0] [2]jagged[1] [0]jagged[1] [1]jagged[1] [2]jagged[2] [0]jagged[2] [13jagged[2] [2]jagged[0] [3]jagged[2] [3]jagged[2] [4]Теперь вам, вероятно, понятно, откуда у рваных массивов такое название.После создания рваного массива доступ к элементу осуществляется посредствомзадания индекса внутри собственного набора квадратных скобок.
Например, чтобыприсвоить число 10 элементу массива jagged с координатами 2 и 1, используйте такую инструкцию:|jagged[2][1]= 10;Обратите внимание на то, что этот синтаксис отличается от того, который используется для доступа к элементам прямоугольного массива.Следующая профамма демонстрирует создание рваного двумерного массива.162Часть I. Язык С#// Демонстрация рваных массивов,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[5j;int i;// Сохраняем значения в первом массиве.for(i=0; i < 4; i++)jagged[0][i] = i ;// Сохраняем значения во втором массиве.for(i=0; i < 3; i++)jagged[l][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] + " 'MrConsole .WriteLine();1Вот как выгладят результаты выполнения этой программы:0 12 30 120 12 3 4'Рваные массивы используются нечасто, но в некоторых ситуациях они могут оказаться весьма эффективными. Например, если вам нужен очень большой двумерныймассив с неполным заполнением (т.е. массив, в котором используются не все его элементы), то идеальным решением может оказаться массив именно такой, неправильной формы.Слава 7. Массивы и строки163И еще. Поскольку рваные массивы — это по сути массивы массивов, то совсем необязательно, чтобы "внутренние" массивы имели одинаковый тип.
Например, эта инструкция создает массив двумерных массивов:I int[] [,] j agged = new int[3] [,];А эта инструкция присваивает элементу j agged [ 0 ] ссылку на массив размером 4x2:I jaggedfO] = 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[] numsl = new int[10];int[] nums2 = new int[10];for(i=0; i < 10; i++) numsl[i] = i ;for(i=0; i < 10; i++) nums2[i] = - i ;Console.Write("Содержимое массива numsl: ") ;for(i=0; i < 10; i++)Console.Write(numsl[i] + " " ) ;Console.WriteLine();Console.Write("Содержимое массива nums2: " ) ;for(i=0; i < 10; i++)Console.Write(nums2[i] + " " ) ;Console.WriteLine();nums2 = numsl; // Теперь nums2 ссылается на numsl.Console.Write("Содержимое массива nums2 после Хпприсваивания: " ) ;for(i=0; i < 10; i++)Console.Write(nums2[i] + " " ) ;Console.WriteLine();// Теперь воздействуем на массив numsli164Часть I.
Язык С#// посредством переменной nums2.nums2[3] = 99;Console.Write("Содержимое массива numsl после\п" +"его изменения посредством nums2: " ) ;for(i=0; i < 10; i++)Console.Write(numsl[i] + " ")Console.WriteLine();Вот результаты выполнения этой программы:Содержимое массива numsl: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Содержимое м а с с и в а numsl послеего изменения посредством nums2: 0 1 2 99 4 5 6 7 8 9Как видно по результатам выполнения этой программы, после присвоения содержимого переменной numsl переменной nums2 обе они ссылаются на один и тот жеобъект.Использование свойства LengthИз того факта, что в С# массивы реализованы как объекты, программисты могутизвлечь много пользы. Например, с каждым массивом связано свойство 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Содержимое м а с с и в а n u m s : 0 1 4 9 1 6 2 5 3 6 4 9 64 8 1^Глава 7. Массивы и строки165Обратите внимание на то, как в классе LengthDemo цикл for использует свойствоnums. Length для управления количеством итераций.