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

Метод Main

Точкой входа в программу на языке C# является метод Main. При создании проекта консольного приложения в Visual Studio, например, создается следующий метод Main:

1 2 3 4 5 6 7 class Program { static void Main(string[] args) { // здесь помещаются выполняемые инструкции } }

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

По сути и класс, и метод представляют своего рода блок кода: блок метода помещается в блок класса. Внутри блока метода Main располагаются выполняемые в программе инструкции.

Регистрозависимость

C# является регистрозависимым языком. Это значит, в зависимости от регистра символов какое-то определенные названия может представлять разные классы, методы, переменные и т.д. Например, название обязательного метода Main начинается именно с большой буквы: "Main". Если мы назовем метод "main", то программа не скомпилируется, так как метод, который представляет стартовую точку в приложении, обязательно должен называться "Main", а не "main" или "MAIN".

Комментарии

Важной частью программного кода являются комментарии. Они не являются собственно частью программы, при компиляции они игнорируются. Тем не менее комментарии делают код программы более понятным, помогая понять те или иные его части.

есть два типа комментариев: однострочный и многострочный. Однострочный комментарий размещается на одной строке после двойного слеша //. А многострочный комментарий заключается между символами /* текст комментария */. Он может размещаться на нескольких строках. Например:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 using System;   namespace HelloApp { /* программа, которая спрашивает у пользователя имя и выводит его на консоль */ class Program { // метод Main - стартовая точка приложения static void Main(string[] args) { Console.Write("Введите свое имя: "); string name = Console.ReadLine(); // вводим имя Console.WriteLine($"Привет {name}"); // выводим имя на консоль Console.ReadKey(); } } }

Циклы

Циклы являются управляющими конструкциями, позволяя в зависимости от определенных условий выполнять некоторое действие множество раз. В C# имеются следующие виды циклов:

· for

· foreach

· while

· do...while

Цикл for

Цикл for имеет следующее формальное определение:

1 2 3 4 for ([инициализация счетчика]; [условие]; [изменение счетчика]) { // действия }

Рассмотрим стандартный цикл for:

1 2 3 4 for (int i = 0; i < 9; i++) { Console.WriteLine($"Квадрат числа {i} равен {i*i}"); }

Первая часть объявления цикла - int i = 0 - создает и инициализирует счетчик i. Счетчик необязательно должен представлять тип int. Это может быть и другой числовой тип, например, float. И перед выполнением цикла его значение будет равно 0. В данном случае это то же самое, что и объявление переменной.

Вторая часть - условие, при котором будет выполняться цикл. Пока условное выражение возвращает true, будет выполняться цикл. В данном случае цикл будет выполняться, пока счетчик i не достигнет 9.

И третья часть - приращение счетчика на единицу. Опять же нам необязательно увеличивать на единицу. Можно уменьшать: i--.

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

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

1 2 3 4 5 int i = 0; for (; ;) { Console.WriteLine($"Квадрат числа {++i} равен {i * i}"); }

Формально определение цикла осталось тем же, только теперь блоки в определении у нас пустые: for (; i <;). У нас нет инициализированной переменной-счетчика, нет условия, поэтому цикл будет работать вечно - бесконечный цикл.

Мы также можем опустить ряд блоков:

1 2 3 4 5 int i = 0; for (; i<9;) { Console.WriteLine($"Квадрат числа {++i} равен {i * i}"); }

Этот пример по сути эквивалентен первому примеру: у нас также есть счетчик, только создан он вне цикла. У нас есть условие выполнения цикла. И есть приращение счетчика уже в самом блоке for.

Цикл do

В цикле do сначала выполняется код цикла, а потом происходит проверка условия в инструкции while. И пока это условие истинно, цикл повторяется. Например:

1 2 3 4 5 6 7 int i = 6; do { Console.WriteLine(i); i--; } while (i > 0);

Здесь код цикла сработает 6 раз, пока i не станет равным нулю. Но важно отметить, что цикл do гарантирует хотя бы единократное выполнение действий, даже если условие в инструкции while не будет истинно. То есть мы можем написать:

1 2 3 4 5 6 7 int i = -1; do { Console.WriteLine(i); i--; } while (i > 0);

Хотя у нас переменная i меньше 0, цикл все равно один раз выполнится.

Цикл while

В отличие от цикла do цикл while сразу проверяет истинность некоторого условия, и если условие истинно, то код цикла выполняется:

1 2 3 4 5 6 int i = 6; while (i > 0) { Console.WriteLine(i); i--; }

Операторы 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, и цикл завершится.

01234

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

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

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

01234678

Цикл foreach

Цикл foreach перебирает коллекции, например, массивы, и будет рассмотрен далее в теме массивов.

Массивы

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

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.

Перебор массивов. Цикл 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]); }

 


Дата добавления: 2020-11-23; просмотров: 141; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!