Г. Шилдт - С#4.0 Полное руководство (1160795), страница 36
Текст из файла (страница 36)
ьепдс)г используется в циклах гог для управления числом повторяющихся шагов цикла. У каждого массива имеется своя длина, поэтому вместо отслеживания размера массива вручную можно использовать информацию о его длине. Следует, однако, иметь в виду, что значение свойства Ьепдг)г никак не отражает число элементов, которые в нем используются на самом деле. Свойство Ьепдг]т содержит лишь число элементов, из которых может состоять массив. Когда запрашивается длина многомерного массива, то возвращается общее число элементов, из которых может состоять массив, как в приведенном них<е примере кода. Использовать свойство Ьепдгп трехмерного массива.
ояьпд Буясеяч 190 Часть!. Язык б№ с1аяя ЬепдсьбевоЗО ( япап1с чо1б Магп() ( гпс[,,) опия пен 1пп[10, 5, 6); Сопяо1е.иг1пеььпе("Длина массива поия равна " + опия.ьепдГП) При выполнении этого кода получается следующий результат. Длина массива поия равна 300 Как подтверждает приведенный выше результат, свойство Ьепдгп содержит число элементов, из которых может состоять массив (в данном случае — 300 [10х5хб) элементов).
Тем не менее свойство ьепдс)з нельзя использовать для определения длины массива в отдельном его измерении. Благодаря наличию у массивов свойства Ьепдг[т операции с массивами во многих алгоритмах становятся более простыми, а значит, и более надежными. В качестве примера свойство Ьепдг[т используется в приведенной ниже программе с целью поменять местами содержимое элементов массива, скопировав их в обратном порядке в другой массив. Поменять местами содержимое элементов массива. пягпд Зуясеи) с1аяя Вечсору ( ягап1с чо10 Магд() ( 1пг г,); гпс[) ппия1 = пен 1пс[10); гпс() ппия2 = пеи гпс[10); гог(г=б; г < ппжя1.ьепдгп; г+т) поея1[г) = 1; Сопяо1е.иг1ге("Исходное содержимое массива: ") Гог(1=0; 1 < ппжя2.ЬепдСП; 1++) Сопяо1е.иг1се(ппия1[1) + " "); Сопяо1е.игггеЬ1пе () 1 // Скопировать элементы массива ппия1 в массив поея2 в обратном порядке.
11(ппея2.Ьепдсь >= ппия1.ЬепдГП) // проверить, достаточно ли длины массива ппия2 Гог(1=0, з=пптя1.ЬепдГП-1; 1 < ппия1.ЬепдГП; 1++, 1--) ппия2[1) = ппия1[1); Сопяо1е.иг1пе("Содержимое массива в обратном порядке: "); Гог(1=0) г < ппвя2.Ьепдпьи 1++) Сопяо1е.игьпе (ппия2[г) т " ") 1 Сопяо1е.иг1геЬ1пе()/ ) ) Глава т. Массивы х строки 191 Выполнение этой программы дает следующий результат.
Исходное содержимое массива: 0 1 2 3 4 5 б 7 8 9 Содержимое массива в обратном порядке: 9 8 7 б 5 4 3 2 1 0 В данном прймере свойство ЬепдСЛ помогает выполнить две важные функции. Вопервых, оно позволяет убедиться в том, что длины целевого массива достаточно для хранения содержимого исходного массива. И во-вторых, оно предоставляет условие для завершения цикла Год, в котором выполняется копирование исходного массива в обратном порядке.
Конечно, в этом простом примере размеры массивов нетрудно выяснить и без свойства ЬепдСЛ, но аналогичный подход может быть применен в целом ряде других, более сложных ситуаций. Применение свойства т.епдСЬ при обращении со ступенчатыми массивами Особый случай представляет применение свойства ЬепоСЛ при обращении со ступенчатыми массивами. В этом случае с помощью данного свойства можно получить длину каждого массива, составляющего ступенчатый массив.
В качестве примера рассмотрим следующую программу, в которой имитируется работа центрального процессора (ЦП) в сети, состоящей из четырех узлов. Продемонстрировать применение свойства ЬепчСЛ // при обращении со ступенчатыми массивами. пяьпч зуягещ; с1аяя заччеб ягаС1с усто Маьп() гпС[] [] пегиогс побея = пеи Ьпг[4] [] пегиогк посев[0] = пеи ьпС[3]; пегиогс посев[1) = пеи ьпС[7); пееиосс побея[2] = пеи ьпС[2]; пеСиосс побея[3] = пеи ьпС[5]; 1пс 1, Сфабриковать данные об использовании ЦП. Гос(1=0; 1 < пегиоск посев.ЬепчСЛ; Гог(3=04 3 < пегиогс побея[1].ЬепчСЛ; 3++) пегиоск посев[1][3] = 1 * 3 + 70; Сопяо1е.ис1сеЬ1пе("Общее количество узлов сети: пегиоск побея.ьепдСЛ + "1п"); Гос(я=О; 1 < пегиоск посев.ьепчСЛ; 1++) ( ГОГ(Э=04 3 < ПЕСИОГХ ПОС1ЕЯ[1].ЬЕПОСЛ; 3++) ( Сопяо1е.ильге("Использование в узле сети "ПП" ~-3+": "); Сопяо1е.Хсьге(пегиоск побея[1][3] + "% "); Сопяо1е.нс1Сеьтпе(); ) Сопяо1е.иг1Сеьтпе () 4 192 Часть б Язык 044 При выполнении этой программы получается следующий результат.
Общее количество узлов сети: 4 Использование в узле 0 ЦП О: 704 Использование в узле 0 ЦП 1: 70$ Использование в узле О ЦП 2: 70$ в узле 1 ЦП 0: 70$ в узле 1 ЦП 1: 71$ в узле 1 ЦП 2: 72Ь в узле 1 ЦП 3: 73$ в Узле 1 ЦП 4: 744 в узле 1 ЦП 5: 75% в узле 1 ЦП 6: 76% Использование Использование Использование Использование Использование Использование Использование Использование в узле 2 ЦП 0: 70$ Использование в узле 2 ЦП 1: 72% в узле 3 ЦП 0: 70% в узле 3 ЦП 1: 73$ в узле 3 ЦП 2; 76$ в узле 3 ЦП 3: 79% в узле 3 ЦП 4: 82% Использование Использование Использование Использование Использование Обратите особое внимание на то, как свойство Ьеп9С[7 используется в ступенчатом массиве песногк пес[ее.
Напомним, что двумерный ступенчатый массив представляет собой массив массивов. Следовательно, когда используется выражение пегногк посев.Ьепэбь то в нем определяется число массивов, хранящихся в массиве пегиогх пес[ее [в дан- ном случае — четыре массива). А для получения длины любого отдельного массива, составляющего ступенчатый массив, служит следующее выражение. пегногк посев[0).ЬепчСП В данном случае это длина первого массива. Неявно типизированные массивы Как пояснялось в главе 3, в версии СФ 3.0 появилась возможность объявлять неявно типизированные переменные с помощью ключевого слова уаг.
Зто переменные, тип которых определяется компилятором, исходя из типа инициализирующего выражения. Следовательно, все неявно типизированные переменные должны быть непременно инициализированы. Используя тот же самый механизм, можно создать и неявно типизированный массив. Как правило, неявно типизированные массивы предназначены для применения в определенного рода вызовах, включающих в себя элементы языка [.1)Щ, о котором речь пойдет в главе 19. А в большинстве остальных случаев используется "обычное" объявление массивов.
Неявно типизированйые массивы рассматриваются здесь лишь ради полноты представления о возможностях языка СФ. Неявно типизированный массив объявляется с помощью ключевого слова уаг, но без последующих квадратных скобок [) . Кроме того, неявно типизированный мас- Глава 2. Массивы и строки 193 сив должен быть непременно инициализирован, поскольку по типу инициализаторов определяется тип элементов данного массива. Все инициализаторы должны быть одного и того же согласованного типа. Ниже приведен пример объявления неявно типизированного массива. чатча1в =пен[] ( 1, 2, 3, 4, 5 ); В данном примере создается массив типа 1пс, состоящий из пяти элементов. Ссылка на этот массив присваивается переменной ча1з.
Следовательно, тип этой переменной соответствует типу 1пс массива, состоящего из пяти элементов. Обратите внимание на то, что в левой части приведенного выше выражения отсутствуют квадратные скобки []. А в правой части этого выражения, где происходит инициализация массива, квадратные скобки присутствуют. В данном контексте они обязательны. рассмотрим еще один пример, в котором создается двумерный массив типа с]ои)51е.
чат ча1в = пен[,] ( (1.1, 2.2), (3.3, 4.4),( 5.5, 6.6) ]; В данном случае получается массив ча1 в размерами 2нЗ. Объявлять можно также неявно типизированные ступенчатые массивы. В качестве примера рассмотрим следующую программу. /у Продемонстрировать неявно типизированный ступенчатый массив. ов1п9 5увсевн с1авз Паччег( ( втат1с чоьг( Мвтп() чат зачче<( = пен(] ( пеи() ( 1, 2, 3, 4 ), пен[] ( 9, 8, 7 пен[) ( 11, 12, 13, 14, 15 )' тот (тпт 3 = О; 3 < заччед.ьепчс)н 3тт) ( тот(ьпг т=о; т < заччео[3).ьепчтв( 1++) сопво1е.итьте(]ачче<((з)[1) + " ")„. Сопво1е.ит1теььпе()," Выполнение этой программы дает следующий результат. 1234 987 11 12 13 14 15 Обратите особое внимание на объявление массива 3 аддес].
чат заччег( = пен[] ( пен[) ( 1, 2, 3, 4 ), пен[) ( 9, 8, 7 ), пеи[) ( 11, 12, 13, 14, 15 ) 194 Часть (. Язык С№ Как видите, оператор пеи ( ( используется в этом объявлении двояким образом. Во-первых, этот оператор создает массив массивов.
И во-вторых, он создает каждый массив в отдельности, исходя из количества инициализаторов и их типа. Как и следовало ожидать, все инициализаторы отдельных массивов должны быть одного и того же типа. Таким образом, к объявлению любого неявно типизированного ступенчатого массива применяется тот же самый общий подход, что и к объявлению обычных ступенчатых массивов. Как упоминалось выше, неявно типизированные массивы чаще всего применяются в г.1М3-ориентированных запросах. А в остальных случаях следует использовать явно типизированные массивы. Оператор цикла Ко~еасЬ Как упоминалось в главе 5, в языке С(Г определен оператор цикла гогене(ь но его рассмотрение было отложено до более подходящего момента.
Теперь этот момент настал. Оператор гогеас(г служит для циклического обращения к элементам коллекции, представляющей собой группу объектов. В СФ определено несколько видов коллекций, каждая из которых является массивом. Ниже приведена общая форма оператора цикла гогеас(г. Гогеаов (тип имн переменной цикла гп коллекция( операторг Здесь тип имя переменной цикла обозначает тип и имя переменной управления циклом, которая получает значение следующего элемента коллекции на каждом шаге выполнения цикла гогеас(г. А коллекция обозначает циклически опрашиваемую коллекцию, которая здесь и далее представляет собой массив. Следовательно, тип переменной цикла должен соответствовать типу элемента массива.
Кроме того, тип может обозначаться ключевым словом таг. В этом случае компилятор определяет тип переменной цикла, исходя из типа элемента массива. Это может оказаться полезным для работы с определенного рода запросами, как будет показано далее в данной книге. Но, как правило, тип указывается явным образом. Оператор цикла гогеас(г действует следующим образом. Когда цикл начинается, первый элемент массива выбирается и присваивается переменной цикла.