Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 36
Текст из файла (страница 36)
Многомерным называется такой массив, который отличается двумя или более измерениями, причем доступ к каждому элементу такого массива осуществляется с помощью определенного сочетания двух или более индексов. 17В Часть!. Язык СЗ Двумерные массивы Простейшей формой многомерного массива является двумерный массив. Местоположение любого элемента в двумерном массиве обозначается двумя иидексами.
Такой массив можно представить в виде таблицы, иа строки которой указывает один иидекс, а иа столбцы — другой. В следующей строке кода объявляется двумерный массив 1псечег размерами 10х20: зпС[, ) Савве = пеы 1пС [10, 20]; Обратите особое внимание иа объявление этого массива. Как видите, оба его размера разделяются запятой. В первой части этого объявления синтаксическое обозначение означает, что создастся переменная ссылки иа двумерный массив.
Если же память распределяется для массива с помощью оператора пеы, то используется следующее сиитаксическое обозначение: 1пС[10, 20] В данном объявлеиии создается массив размерами 10х20, ио и в этом случае его размеры разделяются запятой. Для доступа к элементу двумерного массива следует указать оба индекса, разделив их запятой. Например, в следующей строке кода элементу массива Саиге с координатами местоположения (3,5) присваивается значение 10: СаЬ1е[э, 5] = 10( Ниже приведен более наглядный пример в виде небольшой программы, в которой двумерный массив сначала заполняется числами от 1 до 12, а затем выводится его содержимое.
// Продемонстрировать двумерный массив. нязпЧ Зуясемт с1аяя тноР ( вкаС1с то16 Ма1п() ( 1пС С, 1; ъпс[,] саЪ1е = пен 1пс[3, 4]> гог(с=от с < з; ььс) ( Гог(1=04 1 < 4; ++1) ( СаЬ1е[С,'] = (С*4)е ь1; Сопяо1е.ыс).Се(СаЬ1е[С, 1] + " "); ) Сопяо1е.исъсеьъпе() т ) ) В данном примере элемент массива саЬ1е [О, О] будет иметь значение 1, элемент массива саьге [О, 1] — значение 2, элемент массива саь1е [О, 2] — значение 3 и тд. А значение элемента массива саЬ1е [2, 3] окажется равным 12. На рис.
7.1 показано схематически расположение элементов этого массива и их значений. Глава 7. Массивы а строки 179 0 1 2 3< — правый индекс левый (аые[1][2] Рис. 7.1. Схематическое представление массива са)з1е, СОЗДаннагО в прсграМмв т о На заметку! Если вы ранее программировали на С, С++ или ]аоа, гпо будьте особенно внимательны, обьяеляя или организуя доступ к многомерным массивам в С№. В этих языках программирования размеры массива и индексы указываются в отдельных квадратных схобках, тогда как в С№ они разделяются запятой.
Массивы трех и более измерений В С№ допускаются массивы трех и более измерений. Ниже приведена общая форма объявления многомерного массива. тип[,..., ] нмя массива = пен тнп[резмер1, резмер2, ... размеры]; Например, в приведенном ниже объявлении создается трехмерный целочисленный массив размерами 4х10хЗ. ъпь[,,] вц1К101в = пен 1пс[4, 10, 3]г А в следующем операторе элементу массива вц111г]1в с координатами местоположения [2,4,1) присваивается значение 100: вц1С161в[2, 4, 1] = 100) Ниже приведен пример программы, в которой сначала организуется трехмерный массив, содержащий матрицу значений Зхдхд. А затем значения элементов этого массива суммируются по одной из диагоналей матрицы.
// Суммировать значения по одной из диагоналей // матрицы ЗхЗхЗ. цз1пч Бузкееи с1азз ТьгееОМакгух ( зкакгс то1с( Ма1п() ( 1пк[,,] в = пен 1пс[3, 3, 3]г 1пк зцв = Ог 1пк и = 1; лог(тпк х=04 х < Зг хьь) лог(1пс у=04 у < Зг уьь) Гок(1пь г=сг г < Зг гьь) в[х, у, г] = и н-; 180 Часть ). Язык С№ зцв = и[0, О, 0] 4 в[1, 1, 1] + и[2, 2, 2]) Сопзо1е.вггкеЬ1пе("Сумма значений по первой диагонали: " + вцв); ) ) Вот какой результат дает выполнение этой программы: Сумма значений по первой диагонали: 42 Инициализация многомерных массивов Для инициализации многомерного массива достаточио заключить в фигурные скобки список ииициализаторов каждого его размера. Ниже в качестве примера приведена общая форма инициализации двумерного массива.
тип[,) имл массива = ( (га1, га1, уа1, ..., га1], (га1, 1а1, 1а1, ..., га1], (уа1, уа1, уа1, ..., уа1] )' где уа1 обозначает инициализирующее значение, а каждый внутренний блок — отдельиый ряд. Первое значение в каждом ряду сохраняется иа первой позиции в массиве, второе зиачеиие — иа второй позиции и т.д. Обратите внимание иа то, что блоки ииициализаторов разделяются запятыми, а после завершающей эти блоки закрываюшей фигурной скобки ставится точка с запятой. В качестве примера ниже приведена программа, в которой массив зс[гз ииициализируется числами от 1 до 10 и квадратами этих чисел.
// Инициализировать двумерный массив. цзьпд зузкев) с1азв эяцагез ( всас1с чо1к) Маьп() ( 1пп[,] впгз = ( ( 1, 1 ( 2, 4 (3, 9], ( 4, 16 (5,25], ( б, 36), [7, 49), ( 8, 64 ( 9, 81 (10, 100) 1пс 1, бог(1=0; 1 < 10) 1++) Глава 7. Массивы и строки 181 тот(1=0; 3 < 2; ]+а) Сопао1е.ыт)те (аята [!.,3] ь " "); Сопио1е.итгтеь1пе(): ) ) При выполнении этой программы получается следующий результат: 11 2 4 3 9 4 16 5 25 б 36 7 49 8 64 9 81 10 100 Ступенчатые массивы В приведенных выше примерах применения двумерного массива, по существу, создавался так называемый прямоугольный массив. Двумерный массив можно представить в виде таблицы, в которой длина каждой строки остается неизменной по всему массиву.
Но в С№ можно также создавать специальный тип двумерного массива, называемый стуленчатькммассивом. Ступенчатый массив представляет собой массив массивов, в котором длина каждого массива может быть разной. Следовательно, ступенчатый массив может быть использован для составления таблицы из строк разной длины. Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого массива служит следуюшая обшая форма: тип[][) ммя массива = пеи тип[размер][]: где размер обозначает число строк в массиве. Память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной.
Например, в приведенном ниже фрагменте кода объявляется ступенчатый массив 3 аддес). Память сначала распределяется для его первого измерения автоматически, а затем для второго измерения вручную. 1пт[! [] Заддес( = пеи тот [3] []; )аддек([0] = пеи тпт(4); 3аддек[(1! = пеи 1пт(3]; )аддек[[2] = пеи 1пт[5]; После выполнения этого фрагмента кода массив ]аддек[ выглядит так, как показано ниже. (аяяек[ (О] [Ц (аяяек] [О] [2] ]анке() [О] [3] ]аййек) [0][0] ]аяяек) [Ц (О] ]аяяек) (Ц[Ц ]аяйек) [1Ц2] ]аяяек) [2][0] (аяйек[ [2][Ц ]аяйек) (2](2] [аяйек) [2][3] [аяяек) [2][4] 182 часть ). Взык с№ Теперь нетрудно понять, почему такие массивы называются ступенчатыми! После создания ступенчатого массива доступ к его элементам осуществляется по индексу, указываемому в отдельных квадратных скобках.
Например, в следующей строке кода элементу массива 3 аддес), находящемуся иа позиции с координатами (2,1), присваивается значение 10: Оаддеа[г)[1) = 10з Обратите внимание иа синтаксические отличия в доступе к элементу ступенчатого и прямоугольного массива. В приведенном ниже примере программы демонстрируется создание двумерного ступенчатого массива. // Продемонстрировать применение ступенчатых массивов.
пв1пд Бувсеиз с1авв Оаддес ( вгаг1с чо10 ма1п() ( зпс[] (] Оаддео = пеи 1пь[3] [) з )аддео[0] = пен тпг[4)з Заддей[1] = пен тпс[3); Оаддео[2] = пен 1пс[5)," 1пс 1) // Сохранить значения в первом массиве. Гог(1=Оз 1 < 4; 1++) Оаддез)[0][1] = з.з // Сохранить значения во втором массиве. тот(г=Оз 1 < Зз 1++) Оаддес[1![1] = 1з // Сохранить значения в третьем массиве.
Хог(1=Оз г < 5з 1ьь) )аддеп[2] [1] = 1; // Вывести значения из первого массива. Гог(1=Оз г < 4з 1++) Сопво1е.иг1се(3аддес[0] [1] + " "); Сопво1е.иг1се11пе() // Вывести значения из второго массива. тот(1=0з 1 < Зз г++) сопво1е.иг1ге(1аддес)[1][1) + " "): Сопво1е.иг1сеьтпе()з // Вывести значения из третьего массива. тог(1=0) 1 < 5; 1++) сопво1е.игхге(3аддес[2)[1) + " "); Сопво1е.иг№сеЬ№пе()) ) Глава 7. Массивы и строки 183 Выполнение этой программы приводит к следующему результату: 0123 012 01234 Ступенчатые массивы находят полезное применение не во всех, а лишь в некоторых случаях.
Так, если требуется очень длинный двумерный массив, который заполняется не полностью, т.е. такой массив, в котором используются не все, а лишь отдельные его элементы, то для этой цели идеально подходит ступенчатый массив. И последнее замечание: ступенчатые массивы представляют собой массивы массивов, и поэтому они не обязательно должны состоять из одномерных массивов. Например, в приведенной ниже строке кода создается массив двумерных массивов. ].пс[)[,] засчет( = пен гни[3][,]; В следующей строке кода элементу массива 3 ассе<] [ 0 ] присваивается ссылка на массив размерами 4к2: засчеа(0] = пен ьпя[4, 2] А в приведенной ниже строке кода элементу массива 3 ассе<( [ О] [1, О] присваивается значение переменной 1.
]ачсет][0) [1, 0] = 1) Присваивание ссылок на массивы Присваивание значения одной переменной ссылки на массив другой переменной, по существу, означает, что обе переменные ссылаются на один и тот же массив, и в этом отношении массивы ничем не отличаются от любых других объектов. Такое присваивание не приводит ни к созданию копии массива, ни к копированию содержимого одного массива в другой.