Г. Шилдт - С#4.0 Полное руководство (1160795), страница 35
Текст из файла (страница 35)
язык СФ Ниже приведен пример программы, в которой сначала организуется трехмерный массив, содержащий матрицу значений Зх3х3, а затем значения элементов этого массива суммируются по одной из диагоналей матрицы. Суммировать значения по одной из диагоналей матрицы ЗхЗхЗ. цв1пд Бувсезг с1ввв тпгееонаггьх ( вгагьс чо1г) Мазо() ьпь[,,) и = пен 1пг[3, 3, 3]; 1пс вцз = 0; ьпс и = 1; Гог(1пс х=О; х < 3) х++) Гог(гпс у=01 у < Зг у+е) Гог(ьпг а=О) з < 3) з+е) в[х, у, з] = пет; вци = и[0, О, 0] е и [1, 1, 1] + и[2, 2, 2]; Сопао1е.нгтгеьгпе("Сумма значений по первой диагонали: " + вци) Вот какой результат дает выполнение этой программы.
Сумма значений по первой диагонали: 42 Инициайизация многомерных массивов Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера. Ниже в качестве примера приведена общая форма инициализации двумерного массива: тип[, ] имя массива = ( ( га1, та1, га1, ..., га1), (га1, га1, га1, ..., га1], ( ча1, га1, га1, ..., иа1) )' где уа1 обозначает инициализирующее значение, а каждый внутренний блок — отдельный ряд. Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение — на второй позиции и т.д.
Обратите внимание на то, что блоки инициализаторов разделяются запятыми, а после завершающей эти блоки закрывающей фигурной скобки ставится точка с запятой. В качестве примера ниже приведена программа, в которой двумерный массив вс]гз инициализируется числами от 1 до 10 и квадратами этих чисел. Инициализировать двумерный массив.
цв1пч зувсеви Глава 7. Массивы и строки 185 с1авв 8Чиагев ( всасгс чогг) Нагп() ( 1пг[,] вЯгв = ( ( 1, 1 ), < 2, 4 ), ( 3, 9 ), ( 4, 16 ), ( 5, 25 ), <6,36), ( 7, 49 ), ( 8, 64 (9,81), <1О,(ОО) 1пг г, бог(1=0; г < 10; гаа) бог(3 — 04 1 с 24 зче) Сопво1е.истое(вЧгв[1,3) 4 " "); Сопвс1Е.ИГ1СЕЬ1ПЕ<) 1 При выполнении втой программы получается следующий результат. 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100 Ступенчатые массивы В приведенных выше примерах применения двумерного массива, по существу, создавался так называемый ирямоугольныи массив.
Двумерный массив можно представить в виде таблицы, в которой длина каждой строки остается неизменной по всему массиву. Но в Сс можно также создавать специальный тип двумерного массива, называемый сагуиеичаагым массивом. Ступенчатый массив представляет собой массив массивов, в котором длина каждого массива может быль разной. Следовательно, ступенчатый массив может быть использован для составления таблицы из строк разной длины.
Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого массива служит следующая общая форма: тип[) [) имя массива = пеи тип(раэмер) () 1 186 Часть!. Язык С№ где размер обозначает число строк в массиве. Память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной.
Например, в приведенном ниже фрагменте кода объявляется ступенчатый массив 3 аддед. Память сначала распределяется для его первого измерения автоматически, а затем для второго измерения вручную. 1пп [] [] заддес) = пен ьпг [3! [) ) Заддед[0) = пен 1пс[4); Заддед[1] = пен ьпп(3); ]аддед[2) = пен ьпо[5)) После выполнения этого фрагмента кода массив 3 аддед выглядит так, как показано ниже. ]аяяед [ОЦО] ]аяяед [ОЦ1] ]аяяед [ОЦ2] ]аяяед [ОЦЗ] ]аяяед [1ЦО] ]аяяед [1Ц1] ]аяяед [1Ц2] ]аЯЯед [2ЦО] ]а№Яед [2][1] ]аЯ№ед [2Ц2] ]аЯ№ед [2ЦЗ] ]аЯ№ед [2][4] Теперь нетрудно понять, почему такие массивы называются ступенчатыми! После создания ступенчатого массива доступ к его элементам осуществляется по индексу, указываемому в отдельных квадратных скобках. Например, в следующей строке кода элементу массива 3 аддед, находящемуся на позиции с координатами (2,1), присваивается значение 10. заддед(2)[1) = 10) Обратите внимание на синтаксические отличия в доступе к элементу ступенчатого и прямоугольного массива.
В приведенном ниже примере программы демонстрируется создание двумерного ступенчатого массива. // Продемонстрировать применение ступенчатых массивов. ивьпд Зувгев) с1авв Заддед ( воап1с но1д Иа1п() ( ьпс[) [] заддед = пен ьпс[3] []) ]аддед[0) = пен 1пс[4); заддед[1) = пен ьпс(3]) заддед[2) = пен 1пс[5]; ьпс ь) // Сохранить значения в первом массиве.
гог(1=0; 1 < 4; 14+) ]аддед[0)(1] // Сохранить значения во втором массиве. Год(1=0; 1 < 3; 1++) Заддед[1) (1) = 1) Глава 7. Массивы и строки 187 Сохранить значения в третьем массиве. Гог(1=0; 1 < 51 1++) )аээеа[2)[1] Вывести значения из первого массива. Гог(г=о; 1 < 4; д++) Сопяоге.нггсе()адчео[0)[1) Сопяо1е.нгггеььпе (); Вывести значения из второго массива. Гог(1=01 1 < 3; 1++) Сопяо1е.нгьсе()асздес)[1)[1) Сопяо1е.иггсевгпе () г // Вывести значения из третьего массива. Гог(а=о~ т < 51 сопзо1е.иггге(задчес[2)[1) + " ")г Сопяо1е.нггсеьгпе()," Выполнение этой программы приводит к следующему результату. 0123 0 1 2 01234 Ступенчатые массивы находят полезное применение не во всех, а лишь в некоторых случаях. Так, если требуется очень длинный двумерный массив, который заполняется не полностью, т.е, такой массив, в котором используются не все, а лишь отдельные его элементы, то для этой цели идеально подходит ступенчатый массив.
И последнее замечание: ступенчатые массивы представляют собой массивы массивов, и поэтому они не обязательно должны состоять из одномерных массивов. Например, в приведенной ниже строке кода создается массив двумерных массивов. гпг[)[,] ]аодеа = пен ьпг[3)[,)г В следующей строке кода элементу массива 3 аооес] [О] присваивается ссылка на массив размерами 4х2. ]аооеС[0) = пен гпс[4, 2] А в приведенной ниже строке кода элементу массива 3 асгсес) [ О ! [1, О ] присваивается значение переменной 1.
)аодеа[0) [1, О] Присваивание ссылок на массивы Присваивание значения одной переменной ссылки на массив другой переменной, по существу, означает, что обе переменные ссылаются на один и тот же массив, 188 Часть!. Язык С№ и в этом отношении массивы ничем не отличаются от любых других объектов. Такое присваивание не приводит ни к созданию копии массива, ни к копированию содержимого одного массива в другой. В качестве примера рассмотрим следующую программу.
// Присваивание ссылок на массивы. пягпд зуяяега; с1аяя Аяя1дпйяеГ ( ясасгс то10 Ма1п() ( 1пт 1пт[] пшпя1 = пеи ьпс(10] 1пс[] поия2 = пем 1пс[10] гог(г=О; г < 10; г++) ппия1[г] Гог(1=01 1 < 10; 14+) ппмв2(г] = -1; Сопяо1е.иггсе("Содержимое массива поия1: ")) Гог(1=0; 1 < 10; 1++) Сопяо1е.иггге(ппия1(1] Сспяо1е.нг1гесгпе(); Сопво1е.Иггсе("Содержимое массива поия2: Гог(я=01 г < 10; 1++) Сопяо1е.нгъяе (поп1я2 (1] е " "); Сопяо1е.нггяеъгпе() 1 пиия2 = поия11 // теперь поия2 ссылается на пиия1 Сопяо1е.Хг1се("Содержимое массива поия21п" + "после присваивания: ") Гог(1=08 1 < 10; 1++) Сопяо1е.нгвое(пшяя2[1) + " '); Сопяо1е.Хгьтеь1пе (); Палее оперировать массивом поия1 посредством переменной ссылки на массив пиия2.
пшяя2(3) = 99; Сопяо1е.нггсе("Содержимое массива поия1 после измененияМ" "посредством переменной поия2: гог(1=0; 1 < 10; гте) Сопяо1е.нггое (ппвя1(г] я " ") 1 Сопяо1е.иг1геьгпе() 1 Выполнение этой программы приводит к следующему результату. Содержимое массива пожя1: 0 1 2 3 4 5 6 7 8 9 Содержимое массива поия2: 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 Содержимое массива поия2 после присваивания: 0 1 2 3 4 5 6 7 8 9 Содержимое массива ппия1 после изменения посредством переменной ппия2: О 1 2 99 4 5 6 7 8 9 Глава т. Массивы и строки 189 Как видите, после присваивания переменной пцвя2 значения переменной пцвя1 обе переменные ссылки на массив ссылаются на один и тот же объект. Применение свойства Ьепд~Ь Реализация в С)) массивов в виде объектов дает целый ряд преимуществ.
Одно из них заключается в том, что с каждым массивом связано свойство Ьепдг) Ь СОдЕРжащее число элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину. Ниже приведен пример программы, в которой демонстрируется это свойство. /! Использовать свойство Ьепдпн массива. пяьпд Яуясев( с1ая* Ьепдпноево ( яяавгс но10 Наьп() ( Ьпп() ппвя = лен 1пс(10]; Сопяо1е.иг1пеъьпе("Длина массива ппвв равна " + пцвя,ьепдяп) Использовать свойство Ьепдпь для инициализации массива ппвя.
бог(ьпп 1=0; 1 < ловя.ьепдгш ловя(1] = ь * 1; А теперь воспользоваться свойством Ьепдгп // для вывода содержимого массива ловя. сопяо1е.игьсе("содержимое массива пива: "); бог(ьпс я=о; 1 < ппвя.ьепдси( 1++) Сопяо1е.игьпе(пцвя(1] ь " "); Сопяо1е.игтяеЬЬпе() ) При выполнении этой программы получается следующий результат. Длина массива пцвя равна 10 Содержимое массива ппвя: 0 1 4 9 1б 25 Зб 49 64 81 Обратите внимание на то, как в классе ьепдс](()ево свойспю пцвя.