Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Как и при создании экземпляра класса, приведенное выше объявление массиваможно разделить на два отдельных оператора. Например:int[] sample;sample = new int[10];
В данном случае переменная sample не ссылается на какой-то определенный физический объект, когда она создается в первом операторе. И лишь после выполнениявторого оператора эта переменная ссылается на массив.
Доступ к отдельному элементу массива осуществляется по индексу: Индекс обозначает положение элемента в массиве. В языке C# индекс первого элемента всех массивовоказывается нулевым. В частности, массив sample состоит из 10 элементов с индексами от 0 до 9. Для индексирования массива достаточно указать номер требуемого элемента в квадратных скобках. Так, первый элемент массива sample обозначается какsample [0], а последний его элемент — как sample[9]. Ниже приведен пример программы, в которой заполняются все 10 элементов массива sample.// Продемонстрировать одномерный массив.using System;class ArrayDemo { 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]: 6sample[7]: 7sample[8]: 8sample[9]: 9
Схематически массив sample можно представить таким образом.
Массивы часто применяются в программировании потому, что они дают возможность легко обращаться с большим числом взаимосвязанных переменных. Например,в приведенной ниже программе выявляется среднее арифметическое ряда значений,хранящихся в массиве nums, который циклически опрашивается с помощью оператора цикла for.// Вычислить среднее арифметическое ряда значений.using System;class Average { static void Main() { int[] nums = new int[10]; int avg = 0; nums[0] = 99; nums[1] = 10; nums[2] = 100; nums[3] = 18; nums[4] = 78; nums[5] = 23; nums[6] = 63; nums[7] = 9; nums[8] = 87; nums[9] = 49; for(int i=0; i < 10; i++) avg = avg + nums[i]; avg = avg / 10; Console.WriteLine("Среднее: " + avg); }}
Результат выполнения этой программы выглядит следующим образом.Среднее: 53Инициализация массива
В приведенной выше программе первоначальные значения были заданы для элементов массива nums вручную в десяти отдельных операторах присваивания. Конечно,такая инициализация массива совершенно правильна, но то же самое можно сделатьнамного проще. Ведь массивы могут инициализироваться, когда они создаются. Нижеприведена общая форма инициализации одномерного массива:тип[] имя_массива = {vall, val2, val3, ..., valN};
где val1-valN обозначают первоначальные значения, которые присваиваются по очереди, слева направо и по порядку индексирования. Для хранения инициализаторовмассива в C# автоматически распределяется достаточный объем памяти. А необходимость пользоваться оператором new явным образом отпадает сама собой. В качествепримера ниже приведен улучшенный вариант программы, вычисляющей среднееарифметическое.// Вычислить среднее арифметическое ряда значений.using System;class Average { static void Main() { int[] nums = { 99, 10, 100, 18, 78, 23, 63, 9, 87, 49 }; int avg = 0; for(int i=0; i < 10; i++) avg = avg + nums[i]; avg = avg / 10; Console.WriteLine("Среднее: " + avg); }}
Любопытно, что при инициализации массива можно также воспользоваться оператором new, хотя особой надобности в этом нет. Например, приведенный ниже фрагмент кода считается верным, но избыточным для инициализации массива nums в упомянутой выше программе.int[] nums = new int[] { 99, 10, 100, 18, 78, 23, 63, 9, 87, 49 };
Несмотря на свою избыточность, форма инициализации массива с оператором newоказывается полезной в том случае, если новый массив присваивается уже существующей переменной ссылки на массив. Например:int[] nums;nums = new int[] { 99, 10, 100, 18, 78, 23, 63, 9, 87, 49 };
В данном случае переменная nums объявляется в первом операторе и инициализируется во втором.
И последнее замечание: при инициализации массива его размер можно указыватьявным образом, но этот размер должен совпадать с числом инициализаторов. В качестве примера ниже приведен еще один способ инициализации массива nums.int[] nums = new int[10] { 99, 10, 100, 18, 78, 23, 63, 9, 87, 49 );
В этом объявлении размер массива nums задается равным 10 явно.Соблюдение границ массива
Границы массива в C# строго соблюдаются. Если границы массива не достигаютсяили же превышаются, то возникает ошибка при выполнении. Для того чтобы убедиться в этом, попробуйте выполнить приведенную ниже программу, в которой намеренно превышаются границы массива.// Продемонстрировать превышение границ массива.using System;class ArrayErr { static void Main() { int[] sample = new int[10]; int i; // Воссоздать превышение границ массива. for(i = 0; i < 100; i = i+1) sample[i] = i; }}
Как только значение переменной i достигает 10, возникнет исключительная ситуация типа IndexOutOfRangeException, связанная с выходом за пределы индексирования массива, и программа преждевременно завершится. (Подробнее об исключительных ситуациях и их обработке речь пойдет в главе 13.)Многомерные массивы
В программировании чаще всего применяются одномерные массивы, хотя и многомерные не так уж и редки. Многомерным называется такой массив, который отличаетсядвумя или более измерениями, причем доступ к каждому элементу такого массиваосуществляется с помощью определенной комбинации двух или более индексов.Двумерные массивы
Простейшей формой многомерного массива является двумерный массив. Местоположение любого элемента в двумерном массиве обозначается двумя индексами. Такоймассив можно представить в виде таблицы, на строки которой указывает один индекс,а на столбцы — другой.
В следующей строке кода объявляется двумерный массив integer размерами10×20.int[,] table = new int[10, 20];
Обратите особое внимание на объявление этого массива. Как видите, оба его размера разделяются запятой. В первой части этого объявления синтаксическое обозначение[,]
означает, что создается переменная ссылки на двумерный массив. Если же память распределяется для массива с помощью оператора new, то используется следующее синтаксическое обозначение.int[10, 20]
В данном объявлении создается массив размерами 10×20, но и в этом случае его размеры разделяются запятой.
Для доступа к элементу двумерного массива следует указать оба индекса, разделивих запятой. Например, в следующей строке кода элементу массива table с координатами местоположения (3,5) присваивается значение 10.table[3, 5] = 10;
Ниже приведен более наглядный пример в виде небольшой программы, в которойдвумерный массив сначала заполняется числами от 1 до 12, а затем выводится его содержимое.// Продемонстрировать двумерный массив.using System;class TwoD { static void Main() { 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+1; Console.Write(table[t,i] + " "); } Console.WriteLine(); } }}
В данном примере элемент массива table[0,0] будет иметь значение 1, элементмассива table[0,1] — значение 2, элемент массива table[0,2] — значение 3 и т.д.А значение элемента массива table[2,3] окажется равным 12. На рис. 7.1 показаносхематически расположение элементов этого массива и их значений.
Рис. 7.1. Схематическое представление массива table, созданного в программе TwoD
СОВЕТЕсли вам приходилось раньше программировать на С, C++ или Java, то будьте особенновнимательны, объявляя или организуя доступ к многомерным массивам в С#. В этих языкахпрограммирования размеры массива и индексы указываются в отдельных квадратныхскобках, тогда как в C# они разделяются запятой.Массивы трех и более измерений