Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Операторы циклов, их виды, особенности и области применения

Содержание:

ВВЕДЕНИЕ

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

Для реализации многократно повторяемых действий применяются операторы цикла. В их задачу входит организация цепочки инструкций, производимых над какими-либо данными или действиями, которая будет повторяться заданное количество раз или до возникновения необходимости прервать её.

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

В подавляющем большинстве случаев структура циклов представлена в виде двух составляющих. Это условие, управляющее количеством повторов, и само тело цикла, то есть набор последовательно выполняемых операторов, которые будут выполняться до тех пор, пока условия выхода из цикла не позволят выйти из него и передать работу следующим после цикла операторам.

В этой работе предстоит подробно изучить функционирование операторов цикла их различия между собой, особенности реализации и возможность их применения в решении различных задач. Для удобства понимания и упрощения сравнения циклических операторов был выбран один язык программирования – C#, так как в большинстве случаев их логика одинакова, а различия только в оформлении из-за разного синтаксиса языков.

ГЛАВА 1. ЦИКЛЫ И ИХ ПРИМЕНЕНИЕ

1.1 Определение цикла

Цикл – это часть программного кода, выполняющаяся несколько раз. Операторы цикла являются управляющими операторами, их задача состоит в многократном повторении определённого участка кода до достижения, определённого условия выхода из него. У циклов выделяют заголовок и тело. Повторяемый блок кода является телом цикла. Заголовок определяет условие, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину. После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла.

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

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

1.2 Цикл со счётчиком

Цикл со счётчиком — цикл, в котором переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве языков программирования реализуется оператором for, в котором указывается счётчик, то есть переменная цикла, требуемое количество проходов или количество итераций и шаг, с которым изменяется счётчик. Логика цикла со счётчиком представлена на блок-схеме (рисунок 1).

Рисунок 1. Цикл со счётчиком

Цикл может не выполниться ни разу, так как перед его выполнением будет выполняться проверка условий выхода и в случае отрицательного результата тело цикла будет пропущено.

В языке C# доступна довольно гибкая возможность настраивать условия цикла for. Она заключается в отсутствии ограничения по количеству переменных, проверок условий, и итераторов. Простой пример цикла представлен в листинге 1.

Листинг 1

Цикл for

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

{

Console.WriteLine(i);

}

Оператор for в данном примере выполняет следующие действия:

  1. Устанавливается начальное значение переменной i. Это происходит только один раз, независимо от числа повторений цикла. Можно представить эту инициализацию происходящей вне циклического процесса.
  2. Далее значение i сравнивается с 5.
  3. Если значение i меньше или равно 5, условие определяется, как true и выполняются следующие действия.
  4. Оператор Console.WriteLine в теле цикла выводит в консоль сообщение со значением i.
  5. Значение i увеличивается на единицу.
  6. Цикл возвращается к началу выполнения шага 2, чтобы повторно вычислить условие.
  7. Если значение i больше 5, условие определяется как false и выполняется выход из цикла.

Если в этом примере значение i инициализировать значением больше 5, то тело цикла вовсе не запустится.

Эффективнее всего использовать цикл for для выполнения операций известное количество раз. Также этот цикл можно определить, как цикл с предусловием без каких-либо счётчиков, оставив в скобках только условие выхода (листинг 2).

Листинг 2

Цикл for без счётчика

int i = 1;

for ( ; i <= 5;)

{

Console.WriteLine(i);

i++;

}

В этом случае нет необходимость инициализации счётчика, а все манипуляции над данными, которые проверяются в заголовке цикла, будут производиться в теле цикла. Для цикла с предусловием удобнее пользоваться конструкцией описанной в следующем параграфе.

1.3 Цикл с предусловием

Если в задаче число повторений заранее неизвестно, цикл for использовать неудобно и можно воспользоваться оператором цикла while. Этот цикл совершает повторы до тех пор, пока условие выхода из цикла не будет иметь значение false, тогда управление программой передаётся строке кода, следующей после цикла (рисунок 2). Тело цикла может ни разу не выполниться, так как проверка условий происходит в начале, отсюда и следует название цикл с предусловием.

Рисунок 2. Цикл с предусловием

Простой пример (листинг 3) наглядно демонстрирует работу цикла while.

Листинг 3

Цикл while

int n = 1;

while (n < 6)

{

Console.WriteLine(n);

n++;

}

Рассмотрим работу этого цикла:

  1. Перед тем, как программа передаст управление циклу, необходимо инициализировать переменную цикла, которая и будет участвовать в проверке условий выхода из него.
  2. Далее идёт оператор цикла while и выражение проверки в скобках. Если выражение имеет истинное значение, то работа программы переходит к первой строчке тела цикла.
  3. В данном примере программа выводит сообщение со значением переменной n на экран.
  4. Далее выполняется приращение значения n на единицу. На этом действии заканчивается одна итерация цикла.
  5. Происходит переход к выражению проверки условий цикла, если оно истинно, то цикл повторяется.
  6. Цикл будет повторяться до тех пор, пока n не примет значение 6 или больше, в таком случае выражение проверки станет ложным, и программа продолжит выполнение со следующей строки после цикла.

1.4 Цикл с постусловием

Ещё одной разновидностью циклов является цикл с постусловием. Главным отличием его от предыдущего заключается в проверке условий выхода из цикла, точнее последовательность, с которой выполняется цикл. В первую очередь выполняется тело цикла, а в конце идёт проверка условий выхода (рисунок 3).

Рисунок 3. Цикл с постусловием

Листинг 4 демонстрирует работу цикла do-while.

Листинг 4

Цикл do-while

int x = 0;

do

{

Console.WriteLine(x);

x++;

} while (x < 5);

Рассмотрим работу этого цикла:

  1. Перед тем, как программа передаст управление циклу, необходимо инициализировать переменную цикла, которая и будет участвовать в проверке условий выхода из него.
  2. Далее идёт оператор do, после него сразу начинается выполнение тела цикла.
  3. В данном примере программа выводит сообщение со значением переменной x на экран.
  4. Далее выполняется приращение значения x на единицу.
  5. Затем происходит переход к выражению проверки условий цикла, если оно истинно, то цикл повторяется.
  6. Цикл будет повторяться до тех пор, пока x не примет значение 5 или больше, в таком случае выражение проверки станет ложным, и программа продолжит выполнение со следующей строки после цикла.

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

1.5 Цикл коллекции

Если предстоит работать с группами объектов, поочерёдно ведя их обработку, то удобнее всего воспользоваться циклом коллекции foreach. Цикл foreach служит для циклического обращения к элементам коллекции, представляющей собой группу объектов.

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

Ниже приведён простой пример (листинг 5) использования цикла foreach.

Листинг 5

Цикл foreach

foreach(int х in nums)

{

Console.WriteLine(х);

}

В этом примере нам необходимо последовательно вывести на экран все элементы заранее определённого массива nums. Этот цикл работает следующим образом:

  1. В скобках поле оператора foreach определяется переменная x, которой присваивается первое значение, выбранное из коллекции nums.
  2. Далее происходит переход к телу цикла, и выводится на экран сообщение со значением переменной x.
  3. Происходит возврат в начало цикла, в свою очередь, переменная x получает следующее по порядку значение из коллекции nums.
  4. Происходит очередной повтор цикла. Так будет происходить, пока цикл foreach не выберет все элементы массива. Тогда управление программой перейдёт строке кода, следующей сразу после цикла.

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

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 полезны для последовательного перебора данных какого-либо массива от начала и до конца, не усложняя этот процесс дополнительными условиями.

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Шилдт Герберт, C# 4.0: полное руководство , СПБ: Вильямс, 2011. – 1056 с.
  2. Лафоре Роберт, Объектно-ориентированное программирование в С++ , СПБ: Питер, 2015. – 928 с.
  3. Шилдт Герберт, C++. Базовый курс , СПБ: Вильямс, 2015. – 624с.
  4. Карпиленко Е.В., Основы программирования, Ростов н/Д, Феникс, 2007.-317
  5. Сергиевский М.В. Язык, среда программирования. М.: Машиностроение, 2013.
  6. Ишкова Элеонора, Самоучитель С#. Начала программирования, СПБ: Наука и техника, 2013. – 496 с.
  7. Цикл (программирование) [Электронный ресурс] – https://ru.wikipedia.org