Файл: Операторы циклов, их виды, особенности и области применения.pdf
Добавлен: 27.04.2023
Просмотров: 264
Скачиваний: 4
1.6 Дополнительные возможности циклов
Многие языки программирования, имеющие в своём синтаксисе циклические конструкции, имеют также специфические команды, позволяющие нарушить порядок работы этих конструкций: команду досрочного выхода из цикла и команду пропуска итерации.
Команда досрочного выхода применяется, когда необходимо прервать выполнение цикла, в котором условие выхода ещё не достигнуто. Такое бывает, например, когда при выполнении тела цикла обнаруживается ошибка, после которой дальнейшая работа цикла не имеет смысла. Рассмотрим работу команды на примере работы цикла for (листинг 6).
Листинг 6
Досрочный выход
for (int i = 1; i <= 100; i++)
{
if (i == 5)
{
break;
}
Console.WriteLine(i);
}
Данный цикл for предполагает вывод на экран 100 сообщений со значением переменной i. Но в теле цикла присутствует проверка значения переменной. Если это значение окажется равным 5, то выполнение цикла будет прервано. Этому будет служить оператор break, он прервёт работу цикла и дальнейшее выполнение программы будет осуществляться со строки кода, следующе после цикла. Таким образом, на экран будет выведено только 4 сообщения.
В случае, если требуется прервать текущую итерацию, но выход из цикла не допустим, то применяется оператор пропуска итерации. По принципу действия он похож на оператор досрочного выхода, но не прерывает цикл полностью, а начинает его заново, условия выхода из цикла будут выполняться также, как обычно.
Листинг 7
Пропуск итерации
for (int i = 1; i <= 10; i++)
{
if (i < 9)
{
continue;
}
Console.WriteLine(i);
}
В этом примере инициализируется счетчик, выполняющий отсчет от 1 до 10. Благодаря использованию оператора continue в сочетании с выражением (i < 9) операторы между continue и концом текста for пропускаются. Соответственно на экран будут выводиться только цифры 9 и 10.
Существует возможность организовать цикл внутри тела другого цикла. Такой цикл будет называться вложенным циклом. Вложенный цикл по отношению к циклу, в тело которого он вложен, будет именоваться внутренним циклом, и наоборот, цикл, в теле которого существует вложенный цикл, будет именоваться внешним по отношению к вложенному. Внутри вложенного цикла, в свою очередь, может быть вложен ещё один цикл, образуя следующий уровень вложенности и так далее. Количество уровней вложенности, как правило, не ограничивается. На первом проходе, внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. И так до тех пор, пока не завершится внешний цикл (рисунок 4).
Рисунок 4. Вложенные циклы
Также, при необходимости, все циклы, кроме foreach, можно сделать бесконечными, то есть выход из их тела не предусмотрен логикой программы. Специальных синтаксических средств для создания бесконечных циклов, ввиду их нетипичности, языки программирования не предусматривают, поэтому такие циклы создаются с помощью конструкций, предназначенных для создания обычных циклов. Для обеспечения бесконечного повторения проверка условия в таком цикле либо отсутствует, либо заменена на константу, эквивалентную значению true. В таком случае выход из тела организовывается в самом теле цикла с помощью команды прерывания цикла (break). Проектировать бесконечные циклы стоит с особой внимательностью, так как компилятор его будет считать корректно оформленным. И при допущенной ошибке в оформлении выхода из цикла возможно «зацикливание» программы.
ГЛАВА 2. РАБОТА ЦИКЛОВ
Изучив принципы действия каждого из циклов, можно сравнить их работу на примере одного несложного консольного приложения. Оно будет выводить на экран один и тот же массив чисел, но при помощи разных циклов.
Листинг 8
Сравнение циклов
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cycles
{
class Program
{
static void Main()
{
int[] mas = {1,2,3,4,5,6,7,8,9,10};
int i;
string s = "Вывод циклом for: ";
for (i = 0; i < 10; i++)
{
s = s + mas[i] + " ";
}
Продолжение листинга 8
Console.WriteLine(s);
//--------------------------------------------------
s = "Вывод циклом while: ";
i = 0;
while (i < mas.Length)
{
s = s + mas[i] + " ";
i++;
}
Console.WriteLine(s);
//----------------------------------------------------
s = "Вывод циклом do while: ";
i = 0;
do
{
s = s + mas[i] + " ";
i++;
}
while (i < mas.Length);
Console.WriteLine(s);
//------------------------------------------------
s = "Вывод циклом foreach: ";
foreach (int j in mas)
{
s = s + j + " ";
}
Console.WriteLine(s);
Продолжение листинга 8
Console.WriteLine();
Console.WriteLine("----------***-----------");
Console.WriteLine();
//-----------------------------------------------------
Console.WriteLine("Вложенный цикл");
for (int j = 0; j < 10; j+)
{
s = "";
for (i = 0; i < 10; i++)
{
s = s + mas[i] + " ";
}
Console.WriteLine(s);
}
Console.WriteLine();
//-----------------------------------------------
s = "Вывод циклом do while с его прерыванием: ";
i = 0;
do
{
s = s + mas[i] + " ";
if (i == 5)
break;
i++;
}
while (i < mas.Length);
Console.WriteLine(s);
Продолжение листинга 8
Console.WriteLine();
//------------------------------------------
s = "Вывод циклом while с пропуском итерации: ";
i = 0;
while (i < mas.Length)
{
s = s + mas[i] + " ";
i++;
if(i == 4)
{
i++;
continue;
}
}
Console.WriteLine(s);
Console.ReadKey();
}
}
}
Данный пример не выполняет никаких действий, кроме вывода одного и того же массива чисел с применением разных циклов.
Результат работы программы представлен на рисунке 5.
Рисунок 5. Работа программы
Подробно разберём вышеприведённые результаты. Первая часть программы демонстрирует работу циклов без дополнительных параметров и изменений. Вторая же её часть представляет в действии некоторые особые возможности циклов.
В начале основного блока программы Main() инициализируется массив mas, содержащий в себе десять чисел с 1 до 10 и переменная i, дальше в программе она будет использоваться, как счётчик (листинг 9). Инициализация строковой переменной вне цикла даёт возможность увидеть результат манипуляций над ней.
Листинг 9
Вывод с помощью for
int[] mas = {1,2,3,4,5,6,7,8,9,10};
int i;
string s = "Вывод циклом for: ";
for (i = 0; i < 10; i++)
{
s = s + mas[i] + " ";
}
Console.WriteLine(s);
Следом идёт определение цикла for. На первом месте в скобках после оператора цикла счётчику i присваивается нулевое значение. Вторым действием производится проверка условий выхода из цикла, чтобы цикл прервался необходимо установить значение переменной i равное 10 или больше. Иначе будет выполняться единственный метод в теле цикла. В нём в каждой итерации строковой переменной присоединяется очередное значение из массива mas, соответствующее позиции i. А строка Console.WriteLine(s) выводит на экран содержимое переменной s после всех преобразований в цикле.
В следующем блоке программы вывод массива осуществляется с помощью цикла while (листинг 10).
Листинг 10
Вывод с помощью while
s = "Вывод циклом while: ";
i = 0;
while (i < mas.Length)
{
s = s + mas[i] + " ";
i++;
}
Console.WriteLine(s);
Строковой переменной s присваивается новое значение. Счётчик i обнуляется перед циклом while. После оператора while в скобках идёт проверка условий выхода из цикла, переменная i должна быть меньше размера массива. Первая строка в теле цикла выполняет точно такие же действия, как и в цикле for. Вторая строка увеличивает значение счётчика на единицу. Сразу после выхода из цикла выводится результат его работы. Как можно было заметить в цикле while счётчик необходимо инициализировать до входа в цикл, а изменение счётчика происходит в теле цикла. Поэтому если нет необходимости использовать счётчик в других частях программы можно использовать цикл for, в котором эти действия производятся в скобках после оператора for.
Далее идёт цикл do-while. В оформлении он почти не отличается от цикла while (листинг 11).
Листинг 11
Вывод с помощью do-while
s = "Вывод циклом do while: ";
i = 0;
do
{
s = s + mas[i] + " ";
i++;
}
while (i < mas.Length);
Console.WriteLine(s);
Единственным отличием является последовательность проверки условий выхода из цикла. Здесь первым идёт оператор do, подсказывающий о том, что сначала будет выполнена минимум одна итерация цикла, а после будет проверка условий. Результат будет тем же, что в предыдущем блоке программы, на экране будут показаны все числа из массива mas.
Последним в списке циклов идёт foreach, который также выводит все значения массива на экран (листинг 12).
Листинг 12
Вывод с помощью foreach
s = "Вывод циклом foreach: ";
foreach (int j in mas)
{
s = s + j + " ";
}
Console.WriteLine(s);
В скобках после оператора foreach объявляется переменная j, которой присваивается первое значение из массива mas, иначе это можно прочитать, как взять значение из массива. В теле цикла строковой переменной присоединяется значение из массива. В следующей итерации переменной j присваивается значение второго элемента из массива mas. И так продолжается, пока цикл foreach не «переберёт» все элементы массива. После чего произойдёт выход из цикла, и выведен результат на экран.
Как видно из рисунка 5, результат работы всех циклов будет одинаковый – все элементы массива mas выведены на экран в прямой последовательности. Но эти циклы не ограничиваются таким функционалом. Рассмотрим вторую часть программы, где циклы были немного модифицированы.
Листинг 13
Вложенный цикл for
Console.WriteLine("Вложенный цикл");
for (i = 0; i < 10; i++)
{
s = "";
for (i = 0; i < 10; i++)
{
s = s + mas[i] + " ";
}
Console.WriteLine(s);
}
В листинге 13 представлен блок программы, демонстрирующий вложенный цикл for в другой цикл for. Во внешнем цикле, то есть тот цикл, который содержит в своём теле ещё один цикл, в параметрах инициализируется новый счётчик j, он будет виден только внутри этого цикла, соответственно, если возникнет необходимость, то им можно воспользоваться и во внутреннем цикле. В первой строчке тела внешнего цикла переменной s присваивается пустое значение, чтобы очистить её от предыдущих данных. Следующая строчка содержит оператор внутреннего цикла for, в которой используется ранее инициализированный счётчик. Далее в теле внутреннего цикла происходит присоединение к переменной s значения из массива. После окончания цикла выводится результат на экран, то есть внутренний цикл функционирует точно также, как если бы он был один в начале программы. Но после вывода на экран результата заканчивается только первая итерация внешнего цикла. В условиях выхода из цикла видно, что он должен повториться десять раз, соответственно будет выведено на экран десять строк с содержимым массива mas.
Следующий блок программы демонстрирует прерывание цикла с помощью ключевого слова break.
Листинг 14
Прерывание цикла do-while
s = "Вывод циклом do while с его прерыванием: ";
i = 0;
do
{
s = s + mas[i] + " ";
if (i == 5)
break;
i++;
}
while (i < mas.Length);
Console.WriteLine(s);
Этот цикл, как и в первой части программы пытается вывести все значения массива, но в его тело был добавлен условный оператор для выполнения прерывания цикла при значении переменной i равному 5. Таким образом переменной s будут присоединены только первые шесть значений массива mas. После чего выполнение цикла будет прервано и выведен результат на экран.
Остаётся последний блок, в котором продемонстрирован пропуск итерации с помощью ключевого слова continue.
Листинг 15
Пропуск итерации цикла while
s = "Вывод циклом while с пропуском итерации: ";
i = 0;
while (i < mas.Length)
{
s = s + mas[i] + " ";
i++;
if(i == 4)
{
i++;
continue;
}
}
Console.WriteLine(s);
Здесь выполнение цикла происходит также как и do-while с прерыванием, только по достижении значения i четырёх, цикл не завершает свою работу, а пропускает одну итерацию. Это позволяет сделать ключевое слово continue.
Пример данной программы наглядно показывает, как можно использовать данные циклы, в чём их различия и особенности.
ЗАКЛЮЧЕНИЕ
Ни один язык программирования не обходится без циклов в той или иной вариации, с какими-то особенностями присущими определённому языку или абсолютно одинаковыми между собой. Не зря компьютер призван облегчит человек работу, выполняя за него всю рутинную или постоянно повторяющуюся работу. Поэтому почти все программы строятся на циклах в том или ином их проявлении. Применять циклы можно в различных комбинациях и количествах, что позволяет проектировать программы любой сложности и направленности. Ведь все они работают циклично, постоянно принимая какие-либо данные и обрабатывая их в циклах.
Были рассмотрены основные типы циклов, чаще всего встречающихся в языках программирования их особенности, применимость. Каждый цикл ввиду своих функциональных возможностей предлагает свой способ решения задач.
- Циклы for удобно применять для обработки уже известного количества данных, используя удобное определение счётчиков и условий выхода из цикла.
- Цикла while может быть применён для неизвестного количества данных, для этого можно в теле цикла определять дополнительные методы манипулирующие условиями выхода из цикла.
- Циклы do-while схожи с циклами while, но имеют полезную особенность, заключающуюся в способности выполнить минимум одну итерацию вне зависимости от условий выхода из цикла.
- Циклы foreach полезны для последовательного перебора данных какого-либо массива от начала и до конца, не усложняя этот процесс дополнительными условиями.