Операторы цикла позволяют выполнить участок программы требуемое число раз

Для организации цикла используются три оператора – for, whileиdo_while.

for– выполнение тела цикла для описанных в заголовке значений управляющей переменной (перебор);

while – пока указанное условие истинно выполняется тела цикла (с предусловием);

do_while – выполняется тела цикла, пока указанное условие не станет ложным (с постусловием).

 

1. Оператор цикла for (перебор)

 

Оператор цикла for имеет следующий вид:

for(инициализация; условие; изменение) оператор

 

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

Инициализация задает начальное значение некоторой переменной, называемой управляющей переменной цикла.

Условие задает условие выполнения цикла, при обращении в FALSE цикл завершается.

Изменение описывает, как меняется переменная цикла в каждой итерации выполнения.

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

 

Пример 1.Например, для вывода на экран значений целых чисел от 1 до 10 можно использовать следующий цикл:

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

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

 

Переменная цикла часто объявляется непосредственно в инициализации (как в примере 1.) и, соответственно, являются локальной в цикле переменной, так что после завершения цикла она перестанет существовать.

 

 

Пример 1A.Напечатать числа в виде таблицы:

 

1 2 1 2 3 1 2 3 4 1 2 3 4 5 for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i; j++) Console.Write(" {0}", j); Console.WriteLine(); }  
5 5 5 5 5 6 6 6 6 7 7 7 8 8 for (int i = 5; i <= 9; i++) { for (int j = 1; j <= 10-i; j++) Console.Write(" {0}", i); Console.WriteLine(); }  

 

Пример 2. Вычислить сумму чисел от 1 до 100.

int s = 0;

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

s += i;

Console.WriteLine(s);

 

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

Цикл завершает свою работу, когда переменная i достигнет значения 101. То есть, последним числом, которое будет прибавлено к переменной s, будет 100.

В конце работы оператора for переменная s будет содержать число 5050 – сумму натуральных чисел от 1 до 100.

Если в заголовке цикла изменить знак в условии:

int s = 0;

for (int i = 1; i >= 100; i++) s += i;

то цикл не выполнит ни одной итерации.

 

Пример 3.Для заданного натурального n вычислить сумму

.

Фактически, требуется вычислить значение выражения .

Такая форма записи очень удобна, т.к. здесь присутствует вся информация (управляющая переменная цикла, её начальное и конечное значения, шаг по умолчанию равный 1), которая указывается в заголовке цикла for.

Console.Write("n=");

string w = Console.ReadLine();

int n = Convert.ToInt32(w);

double s = 0;

for (i = 1; i <= n; i++)

s = s + 1.0 / i / (i + 1); // или s += 1.0 / i / (i + 1)

Console.WriteLine("s={0}",s);

 

Кстати, попробуйте догадаться, почему в числителе слагаемого единица представлена константой 1.0 .

 

Пример запуска программы показан ниже:

Шаг управляющей переменной не всегда равен 1. Так, в задаче табулирования функции (получения таблицы значений функции для аргумента из заданного интервала с заданным шагом) шаг управляющей переменной цикла должен быть вещественным.

Пример 4. Распечатать таблицу значений функции y=y(x), для аргумента, изменяющегося в заданных пределах (от -3 до 14) с заданным шагом (1,8). Значения функции, большие 100, выводить без дробной части.

 

double Xn=-3, Xk=14, dX=1.8, y;

Console.WriteLine("------------------------------");

Console.WriteLine("| X | Y |");

Console.WriteLine("------------------------------");

for ( double x = Xn; x <= Xk; x += dX)

{

if ( x < 0 ) y = 0;

else if ( x < 10 ) y = x;

else y = x * x;

if (y>100) Console.WriteLine("| {0,9:F2} | {1,9:F0} |", x, y);

else Console.WriteLine("| {0,9:F2} | {1,9:F2} |", x, y);

}

Console.WriteLine("------------------------------");

 

Результатом работы программы будет таблица:

.

 

2. Оператор цикла while (цикл с предусловием)

 

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

 

while (<выражение>) <тело оператора>;

 

В конструкции while вычисляется выражение. Если его значение true, то выполняется тело оператора и выражение вычисляется снова. Этот цикл продолжается до тех пор, пока значение выражения не станет false, после чего выполнение программы продолжается с места после тела оператора. Оператор, стоящий после закрывающей скобки, задает тело цикла.

 

Пример 5. Вычислить сумму чисел от 1 до 100.

 

Способ 1 Способ 2
int s = 0, i = 1; while(i <= 100) { s = s + i; i++; } int s = 0; i = 100; while(i > 0) { s = s + i; i--; }
В теле цикла к сумме s (изначально = 0) прибавляется слагаемое i (изначально = 1) и это слагаемое увеличивается на 1. Цикл закончит свое выполнение, когда слагаемоеi станет равным 101 и не будет выполняться условие i<= 100. В теле цикла к сумме s (изначально = 0) прибавляется слагаемое i (изначально = 100) и это слагаемое уменьшается на 1. Цикл закончит свое выполнение, когда слагаемоеi станет равным нулю и не будет выполняться условиеi > 0.

 

В данном примере два оператора в теле цикла можно заменить одним, например, так:

Способ 3 Способ 4 Способ 5
int s = 0, i = 1; while(i <= 100) s += i++;   int s = 0; i = 100; while(i > 0) s += i--; int s = 0, i = 0; while(i < 100) s += i++;

 

Способ 5 аналогичен способу 3. Различие выделено красным цветом. Разберитесь самостоятельно, как здесь работает цикл.

 

Пример 6. Найти наибольший общий делитель (НОД) двух натуральных чисел p и q.

Классическая задача на правильный выбор оператора цикла. Рассмотрим «медленный НОД», в котором большее из двух чисел уменьшается на значение меньшего, пока числа не сравняются. Цикл for использовать нельзя, т.к. число итераций заранее неизвестно. Для учёта случая равных p и q проверку условия следует выполнять перед первой итерацией:

Console.Write("p=");

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

Console.Write("q=");

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

 

int pp = p, qq = q;

while (p != q)

if (p > q) p -= q;

else q -= p;

Console.WriteLine("НОД({0},{1})={2}", pp,qq,p);

 

 


Пример 7. Найти сумму цифр заданного натурального числа n.

В данной задаче необходимо извлекать из числа десятичные цифры и добавлять их к сумматору. Легче эти цифры брать из младшего десятичного разряда и, разделив число на 10, удалять их из числа. Очевидно, что цикл работает, пока число больше 0.

Console.Write("n=");

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

 

int s=0;

while (n > 0)

{ s += n % 10;

n /= 10;

}

Console.WriteLine("Сумма цифр равна {0}", s);

 

3. Оператор цикла do_while (цикл с постусловием)

 

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

 

do <тело оператора> while (<выражение>);

 

Тело оператора do_while выполняется один или несколько раз до тех пор, пока выражение <выражение> не станет ложным. Вначале выполняется <тело оператора>, затем вычисляется <выражение>.

Если выражение ложно, то оператор do_while завершается и управление передается следующему оператору в программе.

Если выражение истинно, то тело оператора выполняется снова и снова проверяется выражение.

 

Пример 8. Найти количество цифр в десятичной записи заданного натурального числа n.

Если записать решение данной задачи по аналогии с примером 7, заменив сумму цифр суммой единиц,

int s=0;

while (n > 0)

{ s++;

n /= 10;

}

то для n=0 программа выдаст неверный ответ (s=0), т.к. «не заметит» единственной цифры 0. Исправим это, применив цикл с постусловием:

Console.Write("n=");

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

 

int s = 0;

do

{ s++;

n /= 10;

}

while (n > 0);

Console.WriteLine("Количество цифр равно {0}", s);