Урок 5.7. Оператор цикла while
5.7. Оператор цикла while
Операторы цикла позволяют организовать многократное выполнение некоторого участка программы. Оператор цикла while является составным и имеет следующую форму записи:
while(<выражение>) <оператор> |
Оператор цикла while работает следующим образом: если <выражение> истинно (или не равно нулю, что с точки зрения Си одно и то же), то <оператор> выполняется один раз, а затем <выражение> вновь проверяется. Эта последовательность действий, состоящая из проверки <выражение> и выполнения <оператор>, периодически повторяется до тех пор, пока <выражение> не станет ложным (или с точки зрения Си равным нулю).
<Оператор>, входящий в while, часто называют телом цикла, ибо в большинстве случаев это блок, в состав которого входит несколько операторов. Алгоритмическая схема выполнения оператора цикла while представлена на рис 5.4.
Рис.5.4 Алгоритмическая схема выполнения оператора цикла while.
Из алгоритмической схемы выполнения видно, что оператор while – это цикл с предусловием; решение, выполнять ли в очередной раз тело цикла, принимается перед началом его прохождения. Поэтому вполне возможно, что тело цикла не будет выполнено ни разу. Кроме того, чтобы тело цикла выполнялось не бесконечно, а определенное количество раз, необходимо при каждом новом выполнении цикла изменять каким-то образом переменную, входящую в состав <выражение> так, чтобы в конце концов <выражение> стало ложным. Т
акая переменная, которая при каждом новом выполнении цикла изменяется, обеспечивая завершение цикла, обычно называется переменной цикла. Си позволяет обеспечить изменение переменной цикла либо в <выражение>, либо в <оператор>.
Рассмотрим эти оба случая на примере вычисления ,
т.е. y =СУММА по n от 1 до 50 ДЛЯ n/(n+5).
Вариант 1. Изменение переменной цикла в <выражение> :
int n = 0; float y = 0; while(++n <= 50) y += n/(n + 5.0); |
Вариант 2. Изменение переменной цикла в <оператор>:
int n = 1; float y = 0; while(n <= 50) { y += n/(n + 5.0); ++n; } |
Гибкость языка Си предоставляет возможность записать еще один вариант этой программы:
int n = 1; float y = 0; while(y += n/(n + 5.0), ++n, n <= 50); |
В этом примере тело цикла вырождено, на месте <оператор> записан пустой оператор, а вычисления, обеспечивающие суммирование, перенесены в <выражение>, в качестве которого записано выражение с запятой. Это правомочно, ибо значением выражения с запятой является значение самого правого выражения – оно в данном случае является выражением отношения и обеспечивает завершение выполнения оператора цикла while.
Организацию вложенных циклов рассмотрим на примере вычисления
int i=0; double y=0; while(++i <= 100) { j = 0; while(++j <= 50) y += 1/(i + sqrt((double)j); } |
В этом фрагменте программы использована встроенная функция вычисления квадратного корня sqrt, которая в качестве аргумента требует тип double, что повлекло за собой применение операции приведения типа. Внутренний цикл с заголовком while(++j <= 50) работает под управлением внешнего цикла с заголовком while(++i <= 100). Выход из цикла, обусловленный ложным значением <выражение>, является естественным и происходит при исчерпании числа повторений тела цикла.
Иногда необходимо выйти из цикла досрочно, т.е. при истинном значении <выражение> на очередном шаге выполнения тела цикла. Для этого в теле цикла используется оператор break, выполнение которого приводит к передаче управления на оператор программы, записанный после тела цикла. Чаще всего оператор break используется в тех случаях, когда заданы два различных условия прекращения работы цикла.
Например, необходимо вычислить , однако, если значение sum превышает 25, то суммирование прекратить:
float sum; int N; sum=0;N=1; while(N <= 100) { sum += N/(N + 1.0); if(sum > 25.0) break; N++; } |
Оператор break используется для досрочного завершения циклов всех видов, которые будут рассмотрены далее: циклов do while и циклов for. В операторе switch и в операторах цикла оператор break действует идентично, передавая управление на оператор, записанный после switch или после тела цикла.
Оставить комментарий