Операторы continue и break

Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае мы можем воспользоваться оператором break.

Например:

1 2 3 4 5 6 for (int i = 0; i < 9; i++) { if (i == 5) break; Console.WriteLine(i); }

Хотя в условии цикла сказано, что цикл будет выполняться, пока счетчик i не достигнет значения 9, в реальности цикл сработает 5 раз. Так как при достижении счетчиком i значения 5, сработает оператор break, и цикл завершится.

 

0

1

2

3

4

Теперь поставим себе другую задачу. А что если мы хотим, чтобы при проверке цикл не завершался, а просто пропускал текущую итерацию. Для этого мы можем воспользоваться оператором continue:

1 2 3 4 5 6 for (int i = 0; i < 9; i++) { if (i == 5) continue; Console.WriteLine(i); }

В этом случае цикл, когда дойдет до числа 5, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующей итерации:

0

1

2

3

4

6

7

8

 

Лекция 9. Массивы

Массив представляет набор однотипных переменных. Объявление массива похоже на объявление переменной за тем исключением, что после указания типа ставятся квадратные скобки:

1 тип_переменной[] название_массива;

Например, определим массив целых чисел:

1 int[] numbers;

После определения переменной массива мы можем присвоить ей определенное значение:

1 int[] nums = new int[4];

Здесь вначале мы объявили массив nums, который будет хранить данные типа int. Далее используя операцию new, мы выделили память для 4 элементов массива: new int[4]. Число 4 еще называется длиной массива. При таком определении все элементы получают значение по умолчанию, которое предусмотренно для их типа. Для типа int значение по умолчанию - 0.

Также мы сразу можем указать значения для этих элементов:

1 2 3 4 5 6 7 int[] nums2 = new int[4] { 1, 2, 3, 5 };   int[] nums3 = new int[] { 1, 2, 3, 5 };   int[] nums4 = new[] { 1, 2, 3, 5 };   int[] nums5 = { 1, 2, 3, 5 };

Все перечисленные выше способы будут равноценны.

Для обращения к элементам массива используются индексы. Индекс представляет номер элемента в массиве, при этом нумерация начинается с нуля, поэтому индекс первого элемента будет равен 0. А чтобы обратиться к четвертому элементу в массиве, нам надо использовать индекс 3, к примеру: nums[3]. Используем индексы для получения и установки значений элементов массива:

1 2 3 4 5 6 int[] nums = new int[4]; nums[0] = 1; nums[1] = 2; nums[2] = 3; nums[3] = 5; Console.WriteLine(nums[3]); // 5

И так как у нас массив определен только для 4 элементов, то мы не можем обратиться, например, к шестому элементу: nums[5] = 5;. Если мы так попытаемся сделать, то мы получим исключение IndexOutOfRangeException.

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

Массивы бывают одномерными и многомерными. В предыдущих примерах мы создавали одномерные массивы, а теперь также создадим двухмерный:

1 2 3 int[] nums1 = new int[] { 0, 1, 2, 3, 4, 5 };   int[,] nums2 = { { 0, 1, 2 }, { 3, 4, 5 } };

Визуально оба массива можно представить следующим образом:

Одномерный массив nums1

0 1 2 3 4 5

Двухмерный массив nums2

0 1 2
3 4 5

Поскольку массив nums2 двухмерный, он представляет собой простую таблицу. Объявление трехмерного массива могло бы выглядеть так:

1 int[,,] nums3 = new int[2, 3, 4];

Все возможноные способы определения двухмерных массивов:

1 2 3 4 5 6 int[,] nums1; int[,] nums2 = new int[2, 3]; int[,] nums3 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } }; int[,] nums4 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } }; int[,] nums5 = new [,]{ { 0, 1, 2 }, { 3, 4, 5 } }; int[,] nums6 = { { 0, 1, 2 }, { 3, 4, 5 } };

Массив массивов

От многомерных массивов надо отличать массив массивов или так называемый "зубчатый массив":

1 2 3 4 int[][] nums = new int[3][]; nums[0] = new int[2] { 1, 2 }; nums[1] = new int[3] { 1, 2, 3 }; nums[2] = new int[5] { 1, 2, 3, 4, 5 };

Здесь две группы квадратных скобок указывают, что это массив массивов, то есть такой массив, который в свою очередь содержит в себе другие массивы. В данном случае у нас массив nums содержит три массива. Причем размерность каждого из этих массивов может не совпадать.

Зубчатый массив nums2

1 2
1 2 3
1 2 3 4 5

Причем мы можем использовать в качестве массивов и многомерные:

1 2 3 4 5 6 int[][,] nums = new int[3][,] { new int[,] { {1,2}, {3,4} }, new int[,] { {1,2}, {3,6} }, new int[,] { {1,2}, {3,5}, {8, 13} } };

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

Перебор массивов. Цикл foreach

Цикл foreach предназначен для перебора элементов в контейнерах, в том числе в массивах. Формальное объявление цикла foreach:

1 2 3 4 foreach (тип_данных название_переменной in контейнер) { // действия }

Например:

1 2 3 4 5 int[] numbers = new int[] { 1, 2, 3, 4, 5 }; foreach (int i in numbers) { Console.WriteLine(i); }

Здесь в качестве контейнера выступает массив данных типа int. Поэтому мы объявляем переменную с типом int

Подобные действия мы можем сделать и с помощью цикл for:

1 2 3 4 5 int[] numbers = new int[] { 1, 2, 3, 4, 5 }; for (int i = 0; i < numbers.Length; i++) { Console.WriteLine(numbers[i]); }

В то же время цикл for более гибкий по сравнению с foreach. Если foreach последовательно извлекает элементы контейнера и только для чтения, то в цикле for мы можем перескакивать на несколько элементов вперед в зависимости от приращения счетчика, а также можем изменять элементы:

1 2 3 4 5 6 int[] numbers = new int[] { 1, 2, 3, 4, 5 }; for (int i = 0; i < numbers.Length; i++) { numbers[i] = numbers[i] * 2; Console.WriteLine(numbers[i]); }

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int[][] numbers = new int[3][]; numbers[0] = new int[] { 1, 2 }; numbers[1] = new int[] { 1, 2, 3 }; numbers[2] = new int[] { 1, 2, 3, 4, 5 }; foreach(int[] row in numbers) { foreach(int number in row) { Console.Write($"{number} \t"); } Console.WriteLine(); }   // перебор с помощью цикла for for (int i = 0; i<numbers.Length;i++) { for (int j =0; j<numbers[i].Length; j++) { Console.Write($"{numbers[i][j]} \t"); } Console.WriteLine(); }

Задачи с массивами

Рассмотрим пару задач для работы с массивами.

Найдем количество положительных чисел в массиве:

1 2 3 4 5 6 7 8 9 10 int[] numbers = { -4, -3, -2, -1, 0, 1, 2, 3, 4 }; int result = 0; foreach(int number in numbers) { if(number > 0) { result++; } } Console.WriteLine($"Число элементов больше нуля: {result}");

Вторая задача - инверсия массива, то есть переворот его в обратном порядке:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int[] numbers = { -4, -3, -2, -1,0, 1, 2, 3, 4 };   int n = numbers.Length; // длина массива int k = n / 2; // середина массива int temp; // вспомогательный элемент для обмена значениями for(int i=0; i < k; i++) { temp = numbers[i]; numbers[i] = numbers[n - i - 1]; numbers[n - i - 1] = temp; } foreach(int i in numbers) { Console.Write($"{i} \t"); }

Поскольку нам надо изменять элементы массива, то для этого используется цикл for. Алгоритм решения задачи подразумевает перебор элементов до середины массива, которая в программе представлена переменной k, и обмен значений элемента, который имеет индекс i, и элемента с индексом n-i-1.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: