Оператор цикла с постусловием
Предназначен для реализации в программе варианта цикла с постусловием – вычисление тела цикла с последующей проверкой текущего значения параметра цикла на соответствие диапазону изменения.
Если условие выполняется – управление передается на повторное выполнение тела.
В противном случае (условие не выполняется) осуществляется выход из цикла.
Структура оператора
do
{
тело
цикла
}
while( усл_выр);
где do – ключевое слово (выполнять);
тело цикла – совокупность операторов, вычисление которых требуется повторять;
{ } – ограничители тела цикла;
while – ключевое слово (пока);
усл_выр – выражение, определяющее проверку условия повторения цикла;
( ) – ограничители выражения;
; – признак оператора.
Как и в операторе цикла с предусловием первая строка формирует заголовок цикла.
Оператор работает следующим образом:
· реализуются требование входа в цикл (do);
· выполняются операторы тела цикла;
· вычисляется условное выражение (усл_выр);
· если выражение истинно (результат не равен нулю) – управление передается заголовку цикла и весь процесс повторяется при следующих значениях параметра цикла;
· если усл_выр ложно (результат равен нулю) – осуществляется нормальный выход из цикла, т.е. управление передается оператору, расположенному под строкой while (усл_выр).
Схема выполнения оператора
do
{
тело
цикла
}
while(усл_выр);
ЛОЖЬ ИСТИНА
Стрелки определяют последовательность работы оператора в зависимости от результатов проверки условного выражения – ИСТИНА или ЛОЖЬ.
ü Внимание! Оператор do ... while безусловно предписывает однократное выполнение тела цикла до проверки условного выражения (усл_выр) независимо от ее будущих результатов.
Так, фрагмент программы:
do /* вход в цикл */
{
yi = sin( xi ); /* вычисления в */
zi = 2.* yi; /* теле цикла */
}
while( zi <= b ); /* проверка условия повторения цикла */
sum = 0.;
предписывает повторение вычислений yi и zi пока zi <= b. Как только условие zi <= b перестанет выполняться, произойдет нормальный выход из цикла – управление передастся оператору sum = 0.
Правила записи и выполнения
В качестве усл_выр могут использоваться любые выражения Cи/Си++. Арифметические, например (sin(b)+0.5), (2*c–d/f), (a) или простые (составные) логические выражения, например (а!=b), (sin( x ) < b), ( x <= a && x >= b ).
Тело цикла может оформляться одним составным или одним простым оператором. Например
do { yi=2. * cos( xi ); printf(“ %f %f”, xi, yi); } while( yi >= b | | yi <= c ); | do xi=sin( ci ); while( xi<=a ); |
В теле цикла возможно использование специальных операторов break, goto, continue, обеспечивающих искусственный (принудительный) выход из цикла. Оператор break прекращает выполнение цикла и передает управление оператору, записанному непосредственно под телом цикла. Оператор goto m организует выход из цикла с передачей управления оператору, помеченному его меткой. Оператор continue прерывает выполнение тела цикла и возвращает управление элементу цикла while(усл_выр), например:
do { . . . if( c < a ) break; . . . } while( a > b ); d = 15.; | do { . . . if( c < a ) goto k; . . . } while( a > b ); d = 15.; . . . k: d=12.; | do { . . . if( c < a ) continue; . . . } while( a > b ); d = 15.; |
Первый фрагмент предписывает искусственный выход из цикла при выполнении в теле цикла условия c < a с передачей управления оператору d = 15. Второй – нарушает естественный порядок вычисления тела цикла при c < a с передачей управления оператору d=12., помеченному меткой k. Третий прерывает выполнение тела цикла по тому же условию, но управление возвращается элементу цикла while(усл_выр).
В цикле возможно использование других (вложенных) операторов цикла.
Вывод: оператор do while позволяет программировать арифметические циклы с постусловием, например, представленные схемами рис. 5.5 (блоки 5, 6, 7, 8, 9); рис. 5.7б (блоки 5, 6, 7, 8), при условии, что начальное значение параметра цикла (блок 4) задается до входа в цикл, а изменение параметра (блок 8 рис. 5.5; блок 7 рис. 5.7б) осуществляется в теле цикла.