Программирование на языке C#


Download 1.19 Mb.
Pdf ko'rish
bet38/66
Sana23.10.2023
Hajmi1.19 Mb.
#1717181
1   ...   34   35   36   37   38   39   40   41   ...   66
Bog'liq
Программирование на языке C#

9.5. 
Оператор foreach 
Оператор 
foreach
применяется для перебора элементов массива, а 
также элементов в перечислимых коллекциях.
60 


Синтаксис оператора имеет следующий вид: 
foreach ( тип имя in имя_массива ) 
тело_цикла; 
Имя задает локальную по отношению к циклу переменную, которая 
будет по очереди принимать все значения из массива. В одномерных 
массивах элементы просматриваются в порядке возрастания индекса 
начиная с 0. 
Рассмотрим работу с оператором 
foreach
на примере ( листинг 14), в 
котором организуем вывод всех элементов массива на экран. 
int[] massiv = { 24, 50, 18, 3, 16, -7}; 
foreach ( int elem in massiv )
Console.WriteLine( elem ); 
Листинг 14.
Наглядно работу оператора можно представить следующим 
образом (Pис. 10.). Определяется переменная elem, тип которой 
совпадает с типом значений ячеек массива 
massiv
. Как показано на 
рисунке, в начальный момент времени переменная 
elem
(
Рис. 10.) 
принимает значение первой ячейки, а на следующей итерации, 
переменная 
elem
примет значение следующей ячейки и т.д. пока не 
закончится массив.
massiv
elem
24 50 18 3 16 -7
int
int
int
int
int
int
in massive)
foreach( int
Рис. 10. Схема работы оператора foreach 
Заметим, что при работе с оператором требуется следить за тем, 
чтобы ссылки не были пустыми. Например, если в листинге 14 
рассмотреть случай, когда 
int[] massiv=null
, то в переменную 
elem
не будет записано начальное значение, после чего будет сгенерировано 
исключение 
System.NullReferenceException
.
В следующем примере определим количество отрицательных 
элементов и их сумму, также найдем максимальный элемент массива.
Для решения этой задачи, достаточно организовать один проход по 
циклу с помощью оператора 
foreach
. В переменную 
sum
будем 
накапливать сумму отрицательных элементов массива, в переменной 
num
их количество.
Решение организуем с помощью условного оператора, в котором 
будем выполнять проверку на отрицательность текущего элемента 
массива 
elem
. В случае, если текущий элемент отрицательный, то 
суммируем его с переменной 
sum
, а также увеличиваем значение 
61 


переменной 
num
на 
1
. В переменной 
max
сохраним максимальное 
значение массива, с этой целью, до начала итерации, необходимо 
инициализировать эту переменную некоторым эталонным значением
относительно которого будем определять максимум. Как правило, в 
качестве начального эталонного элемента разумно выбрать, например, 
первый элемент массива. То есть, предположим, что первый элемент 
является максимальным, далее, выполняя поэлементное сравнение 
текущего элемента с максимальным значением. Обновление значения 
переменной 
max
будет происходить в том случае, если текущий 
элемент массива больше 
max
. Следовательно, после просмотра всех 
элементов, в переменной 
max
будет сохранено максимальное значение.
Пример реализации представлен в листинге 15. 
int []Mx = {11,-2,31,-4,51,-61,17,18,99,-110}; 
long sum = 0;//сумма отрицательных элементов; 
int num = 0;// количество отрицательных элементов; 
int max = Mx[0];//максимальный элемент; 
foreach ( int elem in Mx ){ 
if ( elem < 0 ) { 
sum += elem; 
num++; 

if (elem > max) 
max = elem; 
}
foreach ( int elem in Mx ){ 
Console.Write("\t"+ elem); 

Листинг 15. 
В случае многомерного массива, массив воспринимается как 
одномерный длинный массив, в котором строки расположены 
последовательно друг за другом.
Например, рассмотрим вывод элементов на экран двумерного 
массива, состоящего из трёх строк и трёх столбцов. Массив
int [,] Mx = {{1,2,3},{4,5,6},{7,8,9}}; 
будет восприниматься как последовательность элементов –
{1, 2, 3, 4, 5, 6, 7, 8, 9}
.
обход элементов, с помощью оператора 
foreach
, будет реализован 
следующим образом: 
foreach
(
int

in
Mx) 
System.Console.Write("{0} ", i); 
62 


В случае ступенчатых массивов при обходе элементов с помощью 
оператора 
foreach
учитывается вся иерархия структуры.
Например, рассмотрим ступенчатый массив типа
int[][] arrA
– 
массив массивов.
Процедура обхода является такой же многоступенчатой, как и 
создание такого массива, то есть сначала выполняем обход по массиву, 
элементы которого являются ссылками на массив, далее выполняем 
обход для каждой ссылки. С этой целью организуем обход с помощью 
оператора 
foreach
по уровням. На первом уровне идем по массиву 
ссылок, элемент для оператора 
foreach
обозначим 
levelA
,
его тип 
int[]. На
втором уровне (вложенный 
foreach
) идем по массиву 
levelA, 
где каждый элемент является конкретным значением
int 
elem

Реализация представлена в листинге 16. 
int[][] arrA = new int[3][]; 
arrA[0] = new int[5] { 1, 2, 3, 4, 5 }; 
arrA[1] = new int[3] { 1, 2, 3 }; 
arrA[2] = new int[4] { 1, 2, 3, 4}; 
foreach (int[] levelA in arrA){ 
foreach (int elem in levelA) 
Console.Write("\t"+ elem); 
Console.WriteLine(); 

Листинг 16. 
В следующем примере рассмотрим более сложную конструкцию. 
Определяем массив размерности 
szA
прямоугольных массивов 
размерности 
szB
, элементами которых являются одномерные массивы 
размерности 
szC
.
Создание и инициализация такой конструкции представлена в 
листинге 17. 
int[][,][] arrX = null; 
int szA, szB, szC; 
szA = 3; 
szB = 2; 
szC = 3; 
//Создание массива по первой размерности
arrX = new int [szA][,][];
Random rnd = new Random(); 
for (int i = 0; i < szA; i++) { 
arrX[i] = new int[szB,szB][];
63 



for(int i=0; i < szA; i++) { 
for(int j = 0; j < szB; j++) { 
for(int k = 0; k < szB; k++) { 
arrX[ix] [j, k] = new int[szC]; 
for(int z = 0; z < szC; z++) { 
arrX[i] [j, k] [z] = rnd.Next (1, 10); 




Листинг 17. 
Далее, реализуем обход данной структуры, с выводом всех 
элементов на экран. Для организации обхода необходимо использовать 
три вложенных оператора 
foreach

На первом уровне идем по массиву 
с элементами типа 
int[,][] levelA

На втором уровне перебираем 
элементы в двумерном массиве
levelA
, являющиеся ссылкой на 
одномерный массив
int[] levelB
.
На последнем уровне в массиве 
levelB
перебираем конкретные значения, которые обозначим 
int 
value

Реализация обхода предложенной структуры реализована в 
листинге 18. 
foreach(int[,][] levelA in arrX){ 
foreach(int[]levelB in levelA){ 
foreach (int value in levelB) { 
Console.Write ("\t"+value); 

Console.WriteLine (); 



Листинг 18. 
Заметим, что вариант обхода с использованием оператора
foreach

представляет собой более компактный код, нежели код с 
использованием оператора 
for


Download 1.19 Mb.

Do'stlaringiz bilan baham:
1   ...   34   35   36   37   38   39   40   41   ...   66




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling