Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Цикл с постусловием: do while
Циклы while и for являются циклами с предусловием. Условия проверки вычисляются перед каждой итерацией цикла, поэтому вполне возможно, что операторы, помещенные в цикл, никогда не выполнятся. В языке С имеется также цикл с постусловием, в котором проверка условия производится после прохода каждой итерации цикла, благодаря чему гарантируется выполнение операторной части цикла минимум один раз. Эта разновидность цикла называется циклом do while. В листинге 6.15 приведен пример. Листинг 6.15. Программа do_while.c /* do_while.c -- цикл с постусловием */ #include < stdio.h> int main(void) { const int secret_code = 13; int code_entered;
do { printf(" Чтобы войти в клуб лечения трискадекафобии, \n"); printf(" пожалуйста, введите секретный код: "); scanf(" %d", & code_entered); } while (code_entered! = secret_code); printf(" Поздравляем! Вас вылечили! \n"); return 0; } Программа в листинге 6.15 читает входные значения до тех пор, пока пользователь не введет 13. Ниже показан результат выполнения этой программы: Чтобы войти в клуб лечения трискадекафобии, пожалуйста, введите секретный код: 12 Чтобы войти в клуб лечения трискадекафобии, пожалуйста, введите секретный код: 14 Чтобы войти в клуб лечения трискадекафобии, пожалуйста, введите секретный код: 13 Поздравляем! Вас вылечили!
Эквивалентная программа, в которой применяется цикл while, была бы несколько длиннее, как можно видеть в листинге 6.16. Листинг 6.16. Программа entry.с /* entry.c -- цикл с предусловием */ #include < stdio.h> int main(void) { const int secret_code = 13; int code_entered;
printf(" Чтобы войти в клуб лечения трискадекафобии, \n"); printf(" пожалуйста, введите секретный код: "); scanf(" %d", & code_entered); while (code_entered! = secret_code) { printf(" Чтобы войти в клуб лечения трискадекафобии, \n"); printf(" пожалуйста, введите секретный код: "); scanf(" %d", & code_entered); } printf(" Поздравляем! Вас вылечили! \n");
return 0; }
Общая форма цикла do while имеет вид: do оператор while (выражение); Оператор может быть простым или составным. Обратите внимание на то, что сам цикл do while считается оператором и таким образом требует наличия после него точки с запятой (рис. 6.5). Цикл do while всегда выполняется, по меньшей мере, один раз, потому что проверка условия производится после того, как тело цикла выполнено. С другой стороны, циклы for и while могут не выполниться ни разу, поскольку проверка условия цикла осуществляется перед входом в цикл. Использование циклов do while должно быть ограничено случаями, при которых требуется выполнение хотя бы одной итерации. Например, программа запроса пароля мола бы содержать цикл, как демонстрируется в следующем псевдокоде: do { запросить ввод пароля прочитать пользовательский ввод } while (введенные данные не совпадают с паролем);
Избегайте применения структуры do while, которая имеет вид, подобный показанному ниже псевдокоду: do { запросить у пользователя, желает ли он продолжить какие-то действия } while (ответом является 'да'); В этом случае, даже если пользователь ответит “нет” на запрос о продолжении, действия все равно выполняются, т.к. проверка введенного ответа происходит слишком поздно.
|