Применение операторов: «do-while» и «foreach» 


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



ЗНАЕТЕ ЛИ ВЫ?

Применение операторов: «do-while» и «foreach»



Применение операторов: «do-while» и «foreach»

 

Цикл do-while

В C# — это версия while с пост проверкой условия. Это значит, что условие цикла проверяется после выполнения тела цикла. Следовательно, циклы do-while удобны в тех ситуациях, когда блок операторов должен быть выполнен как минимум однажды. Ниже приведена общая форма оператора цикла do-while:

 

do

{

// Оператор и операторы

} while (<условие>);

 

При наличии лишь одного оператора фигурные скобки в данной форме записи необязательны. Тем не менее, они зачастую используются для того, чтобы сделать конструкцию do-while более удобочитаемой и не путать её с конструкцией цикла while. Цикл do-while выполняется до тех пор, пока условное выражение истинно. В качестве примера использования цикла do-while можно привести следующую программу, рассчитывающую факториал числа:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

try

{

// Вычисляем факториал числа

int i, result = 1, num = 1;

Console.WriteLine("Введите число:");

i = int.Parse(Console.ReadLine());

Console.Write("\n\nФакториал {0} = ", i);

 

do

{

result *= num;

num++;

} while (num <= i);

 

Console.Write(result);

}

catch (FormatException ex)

{

Console.WriteLine("Вы ввели не число. {0}", ex.Message);

}

finally

{

Console.WriteLine("\nДля продолжения нажмите любую клавишу... ");

Console.ReadKey();

}

}

}

}

/* Выведет:

* Введите число:

*:3

* Факториал 3 = 6

* Для продолжение нажмите любую клавишу...

*/

Цикл foreach

 

Цикл foreach служит для циклического обращения к элементам коллекции, представляющей собой группу объектов. В С# определено несколько видов коллекций, каждая из которых является массивом. Ниже приведена общая форма оператора цикла foreach:

 

foreach (<тип> <имя переменной цикла> in <коллекция>)

{

// Оператор или операторы

}

Здесь тип и имя переменной цикла обозначает тип и имя переменной управления циклом, которая получает значение следующего элемента коллекции на каждом шаге выполнения цикла foreach. А коллекция обозначает циклически опрашиваемую коллекцию, которая здесь и далее представляет собой массив. Следовательно, тип переменной цикла должен соответствовать типу элемента массива. Кроме того, тип может обозначаться ключевым словом var. В этом случае компилятор определяет тип переменной цикла, исходя из типа элемента массива. Это может оказаться полезным для работы с определенного рода запросами. Но, как правило, тип указывается явным образом.

Оператор цикла foreach действует следующим образом. Когда цикл начинается, первый элемент массива выбирается и присваивается переменной цикла. На каждом последующем шаге итерации выбирается следующий элемент массива, который сохраняется в переменной цикла. Цикл завершается, когда все элементы массива окажутся выбранными.

Цикл foreach позволяет проходить по каждому элементу коллекции (объект, представляющий список других объектов). Формально для того, чтобы нечто можно было рассматривать как коллекцию, это нечто должно поддерживать интерфейс IEnumerable. Примерами коллекций могут служить массивы С#, классы коллекций из пространства имен System.Collection, а также пользовательские классы коллекций.

 

Пример использования цикла foreach:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main()

{

// Объявляем два массива

int[] myArr = new int[5];

int[,] myTwoArr = new int[5, 6];

int sum = 0;

Random ran = new Random();

// Инициализируем массивы

for (int i = 1; i <= 5; i++)

{

myArr[i-1] = ran.Next(1, 20);

for (int j = 1; j <= 6; j++)

myTwoArr[i - 1, j - 1] = ran.Next(1, 30);

}

// Вычисляем квадрат каждого элемента одномерного массива

foreach (int fVar in myArr)

Console.WriteLine("{0} в квадрате равно: {1}", fVar, fVar * fVar);

Console.WriteLine();

// Вычисляем сумму элементов многомерного массива

foreach (int fTwoVar in myTwoArr)

sum += fTwoVar;

Console.WriteLine("Сумма элементов многомерного массива: {0}", sum);

Console.WriteLine("\nДля продолжения нажмите любую клавишу... ");

Console.ReadLine();

}

}

}

 

Попробуем запустить данный пример несколько раз и наглядно увидим, что элементы массива изменяются каждый раз (с помощью метода Random.Next), и соответственно опрашиваются в цикле foreach:

 

Рис. 2. 1. Результат работы кода выше

Применение операторов: «goto», «break» и «continue»

Применение операторов: «goto», «break» и «continue»

 

Операторы перехода

Язык С# предлагает несколько операторов, позволяющих немедленно перейти на «другую строку» программы.

 

Оператор goto

 

Имеющийся в С# оператор goto представляет собой оператор безусловного перехода. Когда в программе встречается оператор goto, её выполнение переходит непосредственно к тому месту, на которое указывает этот оператор. Он уже давно «вышел из употребления» в программировании, поскольку способствует созданию «макаронного» кода. Хотя в некоторых случаях он оказывается удобным и даёт определённые преимущества, если используется благоразумно. Главный недостаток оператора goto с точки зрения программирования заключается в том, что он вносит в программу беспорядок и делает её практически неудобочитаемой. Но иногда применение оператора goto может, скорее, прояснить, чем запутать ход выполнения программы.

Для выполнения оператора goto требуется метка — действительный в С# идентификатор с двоеточием. Метка должна находиться в том же методе, где и оператор goto, а также в пределах той же самой области действия.

 

Пример использования оператора goto:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main()

{

// Обычный цикл for выводящий числа от 1 до 5

Console.WriteLine("Обычный цикл for:");

for (int i = 1; i <= 5; i++)

Console.Write("\t{0}",i);

// Реализуем то же самое с помощью оператора goto

Console.WriteLine("\n\nА теперь используем goto:");

int j = 1;

link1:

Console.Write("\t{0}",j);

j++;

if (j <= 5) goto link1;

Console.WriteLine("\nДля продолжения нажмите любую клавишу... ");

Console.ReadKey();

 

}

}

}

/* Выведет:

* Обычный цикл for:

* 1 2 3 4 5

*

* А теперь используем goto:

* 1 2 3 4 5

* Для продолжение нажмите любую клавишу...

*/

 

Репутация оператора goto такова, что в большинстве случаев его применение категорически осуждается. Вообще говоря, он, конечно, не вписывается в рамки хорошей практики объектно-ориентированного программирования.

 

Оператор break

 

С помощью оператора break можно специально организовать немедленный выход из цикла в обход любого кода, оставшегося в теле цикла, а также минуя проверку условия цикла. Когда в теле цикла встречается оператор break, цикл завершается, а выполнение программы возобновляется с оператора, следующего после этого цикла. Оператор break можно применять в любом цикле, предусмотренном в С#:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main()

{

// В данном цикле выведутся числа от 1 до 5 вместо 100

for (int i = 1; i < 100; i++)

if (i <= 5)

Console.WriteLine(i);

else break;

 

Console.WriteLine("\nДля продолжения нажмите любую клавишу... ");

Console.ReadKey();

 

}

}

}

/* Выведет:

* 1

* 2

* 3

* 4

* 5

* Для продолжение нажмите любую клавишу...

*/

 

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

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

 

Оператор continue

 

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

В циклах while и do-while оператор continue вызывает передачу управления непосредственно условному выражению, после чего продолжается процесс выполнения цикла. А в цикле for сначала вычисляется итерационное выражение, затем условное выражение, после чего цикл продолжается:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

// Выводим числа кратные 5

for (byte i = 1; i <= 100; i++)

{

if (i % 5!= 0) continue;

Console.Write("\t{0}", i);

}

Console.WriteLine("\nДля продолжения нажмите любую клавишу... ");

Console.ReadKey();

 

}

}

}

 

Рис. 4. 1. Результат работы кода выше

 

Оператор continue редко находит удачное применение, в частности, потому, что в С# предоставляется богатый набор операторов цикла, удовлетворяющих большую часть прикладных потребностей. Но в тех особых случаях, когда требуется преждевременное прерывание шага итерации цикла, оператор continue предоставляет структурированный способ осуществления такого прерывания.

 

Оператор return

 

Оператор return организует возврат из метода (определяет возвращаемый тип по имени). Его можно также использовать для возврата значения. Имеются две формы оператора return: одна — для методов типа void, т.е. тех методов, которые не возвращают значения, а другая — для методов, возвращающих конкретные значения.

Для немедленного завершения метода типа void достаточно воспользоваться следующей формой оператора return:

 

return;

 

Когда выполняется этот оператор, управление возвращается вызывающей части программы, а оставшийся в методе код пропускается.

 

Для возврата значения из метода в вызывающую часть программы служит следующая форма оператора return:

 

return значение;

 

Применение оператора return:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main()

{

int result = Sum(230);

Console.WriteLine("Сумма чётных чисел от 1 до 230 равна: " + result);

Console.WriteLine("Для продолжения нажмите любую клавишу... ");

Console.ReadKey();

 

}

// Метод, возращающий сумму всех четных чисел

// от 1 до s

static int Sum(int s)

{

int mySum = 0;

for (int i = 1; i <= s; i++)

if (i % 2 == 0)

mySum += i;

return mySum;

}

}

}

/* Выведет:

* Сумма чётных чисел от 1 до 230 равна: 13340

* Для продолжения нажмите любую клавишу...

*/

Рис. 2. 1. Результат работы кода выше



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 378; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.87.209.162 (0.093 с.)