Использование цикла do...while

Цикл do...while используется в тех случаях, когда вы не знаете точного количества повторов, но в то же время вам известно, что цикл необходимо выполнить, по меньшей мере, один раз. Структура цикла do...while приведена на рис. 7.

Выполнение инструкций, заключенных в фигурные скобки, повторяется до тех пор, пока является истинным условие, указанное в while. Правильность условия проверяется только в конце цикла, так что, даже если условие с самого начала не было истинным, цикл будет выполнен, по меньшей мере, один раз.


Рис. 7. Структура цикла do...while

 

Используя цикл do...while, следует указывать условие так, чтобы выполнение его не оказалось бесконечным. Ведь если условие все время будет выполняться, остановить повторение цикла можно будет только перезагрузкой системы с помощью кнопки Reset или комбинации клавиш Ctrl+Alt+Del.

Цикл do...while часто используется для того, чтобы повторять программу до тех пор, пока пользователь не решит закончить ввод:

main() { int temp; float celsius; char repeat; do { printf("Введите значение температуры: "); scanf("%d", &temp); celsius = (5.0 / 9.0) * (temp - 32); printf("%d градусов по Фаренгейту соответствует %6.2f по Цельсию\n", temp, celsius); printf("Желаете ввести еще значение?"); repeat = getchar(); putchar('\n'); } while (repeat == 'y' || repeat == 'Y'); }
 
Чтобы избежать проблем, связанных с использованием функции getchar() после функции scanf(), применяйте вместо getchar() функции getch() или getche(), либо вызывайте функцию fflush(stdin) для очистки буфера.

 

В этом примере практически весь текст программы, исключая определение переменных, входит в большой блок do...while. Цикл будет повторяться до тех пор, пока в ответ на запрос будет вводиться символ Y или y. Обратите внимание, что инструкция, выводящая на экран запрос о продолжении работы, является последней инструкцией в блоке.

Цикл do...while также используют и для того, чтобы обеспечить правильность ввода данных. Например, у нас есть программа, в которой требуется ввести процент скидки стоимости товара в виде десятичной дроби. Если пользователь вводит значение, не соответствующее формату, например, меньше 0 либо больше или равно 1, можно, с помощью цикла do...while, предложить ему повторить ввод, написав инструкции примерно следующего содержания:

do { printf("Введите размер скидки:"); scanf("%f", &discount); }while (discount < 0 || discount >= 1);

Условие, записанное в while с использованием логического оператора ИЛИ, проверяет, находится ли введенное число в определенных допустимых границах. Цикл будет повторяться до тех пор, пока пользователь не введет данные надлежащим образом. Но тут есть одна тонкость.

Описанная процедура может дать хорошие результаты только в том случае, если пользователь в конце концов поймет, что от него требуется, и введет правильное число. Если же вы имеете дело с человеком, который не имеет представления о том, что такое десятичная дробь, цикл может повторяться до бесконечности. Одним из способов справиться с такой ситуацией является использование алгоритма счетчика. Например, можно написать следующую программу:

main() { int count; float discount; count=0; do { printf("Введите размер скидки: "); scanf("%f", &discount); count++; } while ((discount < 0 || discount >= 1) && count < 20); if (count == 20) puts ("Хватит валять дурака"); }

Теперь у пользователя есть 20 попыток, чтобы ввести правильные данные. Значение переменной count увеличивается на единицу после каждой неправильной попытки.

Для того чтобы выполнить только одну инструкцию в цикле do...while, нет необходимости использовать фигурные скобки. Например, следующая программа позволяет вводить символы, пока не будет нажата клавиша Y:

main() { int a; do a = getchar(); while (a != 'y' && a != 'Y'); }


Рис. 8. Вложенные циклы do...while

Вложенные циклы do

Вложенные циклы do...while можно использовать для того, чтобы обеспечить несколько уровней повторов. Можно, например, использовать внешний цикл, чтобы повторять всю программу, пока пользователь не решит заняться чем-нибудь другим, и одновременно внутренний цикл для проверки правильности ввода, как это показано на рис.8. Внутренний цикл используют для ввода чисел, значения которых должны изменяться в промежутке от 0 до 100. Если ввод данных соответствует этому условию, внутренний цикл завершается и выполняются инструкции внешнего цикла. Выполнение внешнего цикла повторяется, пока является истинным условие

while (repeat == 'y' || repeat == 'Y');

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

Использование цикла while

Цикл while используется в том случае, когда не известно точное число повторов и при этом нет необходимости, чтобы цикл непременно был выполнен хотя бы один раз. Структура цикла while такова:

while (condition)instruction;

Синтаксис показан на рис.9. Составные инструкции записываются следующим образом:

while (condition) { instructions; }


Рис. 9. Структура цикла while

Так же, как и цикл do, цикл while выполняется до тех пор, пока является истинным условие, но в отличие от конструкции do...while, условие проверяется до начала выполнения цикла, даже если цикл выполняется первый раз. Если условие окажется ложным, цикл не будет выполнен ни разу.

Используя цикл для проверки правильности ввода, помещайте первую инструкцию ввода вне цикла. После этого можно продолжать запрос о вводе данных до тех пор, пока не будет введено правильное значение. Например, таким образом:Так же, как и цикл do, цикл while выполняется до тех пор, пока является истинным условие, но в отличие от конструкции do...while, условие проверяется до начала выполнения цикла, даже если цикл выполняется первый раз. Если условие окажется ложным, цикл не будет выполнен ни разу.