Г. Шилдт - Полный справочник по C# (1160789), страница 31
Текст из файла (страница 31)
Введение в классы, объекты и методы153Полныйсправочник поМассивы и строкиВэтой главе мы возвращаемся к теме типов данных языка С# (познакомимся стипом данных s t r i n g ) . Помимо массивов здесь будет уделено внимание использованию цикла f oreach.МассивыМассив (array) — это коллекция переменных одинакового типа, обращение к которым происходит с использованием общего для всех имени. В С# массивы могут бытьодномерными или многомерными, хотя в основном используются одномерные массивы. Массивы представляют собой удобное средство группирования связанных переменных.
Например, массив можно использовать для хранения значений максимальных дневных температур за месяц, списка цен на акции или названий книг по программированию из домашней библиотеки.Массив организует данные таким способом, который позволяет легко ими манипулировать. Например, если у вас есть массив, содержащий дивиденды, выплачиваемые по выбранной группе акций, то, построив цикл опроса всего массива, нетрудновычислить средний доход от этих акций. Кроме того, организация данных в формемассива позволяет легко их сортировать в нужном направлении.Хотя массивы в С# можно использовать по аналогии с тем, как они используютсяв других языках программирования, С#-массивы имеют один специальный атрибут, аименно: они реализованы как объекты. Этот факт и стал причиной того, что рассмотрение массивов в этой книге было отложено до введения понятия объекта Реализация массивов в виде объектов позволила получить ряд преимуществ, причем одно изних (и к тому же немаловажное) состоит в том, что неиспользуемые массивы могутавтоматически утилизироваться системой сбора мусора.Одномерные массивыОдномерный массив — это список связанных переменных.
Такие списки широкораспространены в программировании Например, один одномерный массив можноиспользовать для хранения номеров счетов активных пользователей сети. В другом —можно хранить количество мячей, забитых в турнире бейсбольной командой.Для объявления одномерного массива используется следующая форма записи.тип[] имя__массива = new тип [размер] ;Здесь с помощью элемента записи тип объявляется базовый тип массива. Базовыйтип определяет тип данных каждого элемента, составляющего массив. Обратите внимание на одну пару квадратных скобок за элементом записи ТИП. ЭТО означает, чтоопределяется одномерный массив. Количество элементов, которые будут храниться вмассиве, определяется элементом записи размер.
Поскольку массивы реализуютсякак объекты, их создание представляет собой двухступенчатый процесс. Сначала объявляется ссылочная переменная на массив, а затем для него выделяется память, и переменной массива присваивается ссылка на эту область памяти. Таким образом, в С#массивы динамически размещаются в памяти с помощью оператора new.ilia заметкуЕсли вы уже знакомы с языками С или C++, обратите внимание на объявлениемассивов в С# Квадратные скобки располагаются за именем типа, а не заименем массиваГлава 7. Массивы и строки155Рассмотрим пример. При выполнении приведенной ниже инструкции создаетсяint-массив (состоящий из 10 элементов), который связывается со ссылочной переменной массива sample.кI i n t [ ] sample = new i n t [10];Это объявление работает подобно любому объявлению объекта.
Переменнаяsample содержит ссылку на область памяти, выделенную оператором new.Доступ к отдельному элементу массива осуществляется посредством индекса. Индекс описывает позицию элемента внутри массива. В С# первый элемент массиваимеет нулевой индекс. Поскольку массив sample содержит 10 элементов, его индексыизменяются от 0 до 9. Чтобы получить доступ к элементу массива по индексу, достаточно указать нужный номер элемента в квадратных скобках.
Так, первым элементоммассива sample является sample [0], а последним — sample [9]. Например, следующая программа помещает в массив sample числа от 0 до 9.// Демонстрация использования одномерного массива.using System;class ArrayDemo {public static void Main() {int[] sample = new int[10];int i ;for(i = 0 ; i < 10; i = i+1)sample[i] = i;for(i = 0 ; i < 10; i = i+1)Console.WriteLine("sample[" + i + " ] : " +sample[i]);Результаты выполнения этой программы имеют такой вид:sample[0]: 0sample[1]: 1sample[2]: 2sample[3]: 3sample[4]: 4sample[5]: 5sample[6]: бsample[7]: 7sample[8]: 8sample[9]: 9Схематично массив sample можно представить в таком виде:2 3 4ОCDrHCDCMCD00CD^rCD56LOCD7r-CDCD8 900алCDCDС / З С П С О С О С П С О Ю С ОМассивы широко применяются в программировании, поскольку позволяют легкообрабатывать большое количество связанных переменных.
Например, следующаяпрограмма вычисляет среднее арифметическое от множества значений, хранимых вмассиве nums, опрашивая в цикле for все его элементы.156Часть I. Язык С#// Вычисление среднего арифметического от// множества значений.using System;class Average {public static void Main() {int[] nums = new int[10];int avg = 0;nums [0]nums [1]nums [2]nums C3]nums [4]nums [5]nums [6]nums [7]nums [8]nums [9]==========99;10;100;18;78;23;63$9;87;49;for(int i=0; i < 10;avg = avg + nums[i];avg = avg / 10;Console.WriteLine("Среднее: " + avg)Вот результат выполнения программы:I Среднее: 53Инициализация массиваВ предыдущей программе значения массиву nums были присвоены вручную, т.е.
спомощью десяти отдельных инструкций присваивания. Существует более простойпуть достижения той же цели: массивы можно инициализировать в момент их создания. Формат инициализации одномерного массива имеет следующий вид:тип[] имя_массива = [vail,val2,. ..,valN];Здесь начальные значения, присваиваемые элементам массива, задаются с помощью последовательности vail—vaIN. Значения присваиваются слева направо, в порядке возрастания индекса элементов массива. С# автоматически выделяет для массива область памяти достаточно большого размера, чтобы хранить заданные значенияинициализации (инициализаторы). В этом случае нет необходимости использовать вявном виде оператор new. Теперь рассмотрим более удачный вариант программыAverage.// Вычисление среднего арифметического от// множества значений.using System;class Average {public static void Main() {int[] nums = { 99, 10, 100, 18, 78, 23,63, 9, 87, 49 };Глава 7.
Массивы и строки157int avg = 0;;for(int i=0; i < 10; i )avg = avg + nums[i];avg = avg / 10;Console.WriteLine("Среднее: " + avg);Хотя, как уже было отмечено выше, в этом нет необходимости, при инициализации массива все же можно использовать оператор new.
Например, массив nums изпредыдущей программы можно инициализировать и таким способом, хотя он и несетв себе некоторую избыточность.I i n t [ ] nums = new i n t [ ] { 99, 10, 100, 18, 78, 23,I63, 9, 87, 49 };Несмотря на избыточность new-форма инициализации массива оказывается полезной в том случае, когда уже существующей ссылочной переменной массива присваивается новый массив. Например:i n t [ ] nums;nums = new i n t [ ] { 99, 10, 100, 18, 78, 23,63, 9, 87, 49 };I|Здесь массив nums объявляется в первой инструкции и инициализируется во второй.И еще. При инициализации массива допустимо также явно указывать его размер,но размер в этом случае должен соответствовать количеству инициализаторов. Вот,например, еще один способ инициализации массива nums.i n t [ ] nums = new i n t [ 1 0 ] { 99, 10, 100, 18, 78, 23,63, 9, 87, 49 };В этом объявлении размер массива nums явно задан равным 10.Соблюдение "пограничного режима"Границы массивов в С# строго "охраняются законом".
Выход за границы расценивается как динамическая ошибка. Чтобы убедиться в этом, попытайтесь выполнитьследующую программу, в которой намеренно делается попытка нарушения границмассива.// Демонстрация выхода за границу массива.using System;class ArrayErr {public static void Main() {int[] sample = new int[10];int i;// Организуем нарушение границы массива.for(i = 0; i < 100; i = i+1)sample[i] = i;Как только i примет значение 10, будет сгенерирована исключительная ситуациятипа IndexOutOfRangeException, и программа прекратит выполнение.158Часть I. Язык С#Многомерные массивыНесмотря на то что в программировании чаще всего используются одномерныемассивы, их многомерные "собратья" — также не редкость. Многомерным называетсятакой массив, который характеризуется двумя или более измерениями, а доступ к отдельному элементу осуществляется посредством двух или более индексов.Двумерные массивыПростейший многомерный массив —- двумерный.
В двумерном массиве позициялюбого элемента определяется двумя индексами. Если представить двумерный массивв виде таблицы данных, то один индекс означает строку, а второй — столбец.Чтобы объявить двумерный массив целочисленных значений размером 10x20 сименем t a b l e , достаточно записать следующее:I m t [ , ] t a b l e = new i n t [ 1 0 , 2 0 ] ;Обратите особое внимание на то, что значения размерностей отделяются запятой.Синтаксис первой части этого объявленияозначает, что создается ссылочная переменная двумерного массива.
Для реальноговыделения памяти для этого массива с помощью оператора new используется болееконкретный синтаксис:| i n t [ 1 0 , 20]Тем самым обеспечивается создание массива размером 10x20, причем значенияразмерностей также отделяются запятой.Чтобы получить доступ к элементу двумерного массива, необходимо указать обаиндекса, разделив их запятой. Например, чтобы присвоить число 10 элементу массиваt a b l e , позиция которого определяется координатами 3 и 5, можно использовать следующую инструкцию:1 t a b l e [ 3 , 5] = 10;Рассмотрим пример программы, которая заполняет двумерный массив числами отJ до 12, а затем отображает содержимое этого массива.// Демонстрация использования двумерного массива.using System;class TwoD {public static void MainO {int t, i;int[,] table = new int[3, 4 ] ;for(t=0; t < 3; ++t) {for(i=0; i < 4; ++i) {table[t,i] = (t*4)+i+l;Console.Write(table[t,i] + " " ) ;Console.WriteLine() ;Глава 7.