Операторы цикла позволяют выполнить участок программы требуемое число раз
Для организации цикла используются три оператора – 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);