Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kompyuternye_tekhnologii_C.doc
Скачиваний:
8
Добавлен:
01.02.2015
Размер:
368.64 Кб
Скачать

7.2 Циклы foreach

Цикл foreachпозволяет обращаться к каждому элементу в массиве с помощью

такого простого синтаксиса:

foreach ( <базовый_тип> <имя> in <массив> )

{

// можно использовать <имя> для каждого элемента

}

Этот цикл будет осуществлять проход по всем элементам и помещать каждый из

них по очереди в переменную <имя> безо всякого риска получения доступа к

недопустимым элементам. Такой подход позволяет не беспокоиться о том, сколько элементов содержится в массиве, и быть уверенным, что каждый из них будет использован в цикле. Например:

static void Main(string[] args)

{

string[] friendNames = { "Петя ", "Вася", "Витя" };

Console.WriteLine("Моих друзей {0} их зовут :", friendNames.Length);

foreach (string friendName in friendNames)

{

Console.WriteLine(friendName);

}

Console.ReadKey();

}

Главное отличие между применением цикла foreach и стандартного цикла for состоит в том, что foreach предоставляет к содержимому массива доступ только для чтения, что не позволяет изменять значения элементов.

7.3. Многомерные массивы

Многомерным называется такой массив, в котором для получения доступа к

элементам применяется несколько индексов. Например, предположим, что требуется нарисовать карту высот холма по замеренным позициям.

Позицию можно задать двумя координатами — х и у. Эти две координаты можно

представить в виде индексов, дабы в массиве с именем hillHeight могли храниться

значения высоты, соответствующие каждой паре координат. В такой ситуации может

помочь многомерный массив.

Массивы такого типа объявляются следующим образом:

<базовый_тип> [,] <имя>;

Массивы с большим количеством измерений объявляются с использованием

большего количества запятых:

<базовый_тип> [,,,] <имя>;

Эта строка показывает, как объявить четырехмерный массив. Для присваивания

значений применяется похожий синтаксис, в котором запятые служат для разделения

размеров. Объявить и инициализировать двухмерный массив hi11Heightс базовым типомdoubleи размерностью координаты х, равной 3, а координаты у — 4, можно

следующим образом:

double{ , ] hillHeight = new double[3,4];

В качестве альтернативного варианта для начального присваивания можно

использовать литеральные значения. Эти значения должны иметь вид вложенных блоков,

заключенных в фигурные скобки, и быть отделены друг от друга запятыми:

double[ , ] hillHeight = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};

Данный массив имеет те же самые измерения, что и предыдущий, т.е. три строки

и четыре столбца. Благодаря предоставлению литеральных значений, эти измерения

определяются неявным образом.

Для получения доступа к отдельным элементам многомерного массива

указываются отделенные запятой индексы:

hillHeight[2,1]

7.4. Массивы массивов

Многомерные массивы, о которых рассказывалось в предыдущем разделе,

считаются прямоугольными, потому что каждая "строка" имеет одинаковый размер. Например, в последнем рассмотренном случае любой из возможных координат х могла

соответствовать координата у от 0 до 3.

Однако массивы еще могут быть зубчатыми, т.е. "строки" могут иметь разные

размеры. Для этого каждый элемент в массиве должен являться тоже массивом. При

желании можно также создавать и массивы массивов, состоящие из прочих массивов, или

даже еще более сложные массивы. Однако все эти варианты возможны только при

условии наличия у массивов одного и того же базового типа.

Синтаксис для объявления массивов, состоящих из массивов, подразумевает

указание в объявлении массива нескольких пар квадратных скобок:

int[][] Res;

Инициализация подобных массив не является такой же простой процедурой, как инициализация многомерных массивов.

Существуют всего два возможных варианта. Первый — инициализировать сначала

массив, содержащий другие массивы (которые далее для ясности будут называться

просто подмассивами), а затем по очереди инициализировать подмассивы:

Res = new int[2][];

Res[0] = new int[3];

Res[1] = new int[4];

Второй вариант — использовать модифицированную версию приводившейся выше

операции литерального присваивания:

Res = new int[3][] {new int[] {1, 2, 3}, new int[] {1},

new int[] {1, 2} };

Инициализировать массив можно и в той же строке, в которой он объявляется:

int[][] Res = {new int[] {1, 2, 3}, new int[] {1}, new int[] {1, 2}};

С зубчатыми массивами можно использовать циклы f oreach, но их часто нужно

делать вложенными для того, чтобы они добирались до фактических данных. Например,

предположим, что имеется показанный ниже зубчатый массив, содержащий 10 других

массивов, каждый из которых, в свою очередь, тоже содержит массив целых чисел,

представляющих собой делители целого числа в диапазоне от 1 до 10:

int[][] Res10 = {new int[] {1},

new int[] {1, 2},

new int[] {1, 3},

new int[] {1, 2, 4},

new int[] {1, 5},

new int[] {1, 2, 3, 6},

new int[] {1, 7},

new int[] {1, 2, 4, 8},

new int[] {1, 3, 9},

new int[] {1, 2, 5, 10} };

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]