Оператор с предусловием while
Цикл с предусловием реализует структурную схему, приведенную на рис. 7.1, а, и имеет вид
while (выражение)
код цикла;
Выражение определяет условие повторения кода цикла, представленного простым или составным оператором.
Если выражение в скобках – истина (не равно 0), то выполняется код цикла. Это повторяется до тех пор, пока выражение не примет значение 0 (ложь). В этом случае происходит выход из цикла и выполняется оператор, следующий за конструкцией while. Если выражение в скобках изначально ложно (т.е. равно 0), то цикл не выполнится ни разу.
Код цикла может включать любое количество операторов, связанных с конструкцией while, которые нужно заключить в фигурные скобки (организовать блок), если их более одного.
Переменные, изменяющиеся в коде цикла и используемые при проверке условия продолжения, называются параметрами цикла. Целочисленные параметры цикла, изменяющиеся с постоянным шагом на каждой итерации, называются счетчиками цикла.
Начальные установки могут явно не присутствовать в программе, их смысл состоит в том, чтобы до входа в цикл задать значения переменным, которые в этом цикле используются.
Рис. 7.1. Схемы операторов цикла:
а – цикл с предусловием; б – цикл с постусловием
Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом.
Для этого используют оператор continue – переход к следующей итерации цикла и break – выход из цикла (см. разд. 9.2, 9.3).
Передавать управление извне внутрь цикла не рекомендуется, так как получите непредсказуемый результат.
Например, необходимо сосчитать количество символов в строке. Предполагается, что входной поток настроен на начало строки. Тогда подсчет символов выполняется следующим образом:
int count = 0;
char ch = getchar();
while ( ch != \n') {
count++;
ch = getchar();
}
В языке Си в выражение, управляющее циклом, можно включить и оператор присваивания переменной ch, например:
char ch;
int count = 0;
while (( ch=getchar()) != '\n') count++;
Как видим, переменная ch применяется только в выражении, управляющем циклом, поэтому от ch можно отказаться:
int count = 0;
while ( getchar() !='\n') count ++;
Полезные примеры
1. Организация выхода из бесконечного цикла по нажатии клавиши Esc
while (1) { // Бесконечный цикл
...
if (kbhit() && getch()==27 ) break;
...
}
Функция kbhit() возвращает значение > 0, если нажата любая клавиша, а функция getch() возвращает код нажатой клавиши (код клавиши Esc равен 27). В результате выполнения оператора if, если будет нажата клавиша Esc, выполнится оператор break и произойдет выход из цикла.
Приведенный пример – распространенный прием программирования.
2. Организации паузы в работе программы с помощью цикла, выполняющегося до тех пор, пока не нажата любая клавиша
...
while (!kbhit());
...
7.3. Оператор цикла с постусловием do – while
Цикл с постусловием реализует структурную схему, приведенную на рис. 7.1, б.
Общий вид записи такой конструкции
do
код цикла;
while (выражение);
Код цикла будет выполняться до тех пор, пока выражение истинно. Все, что говорилось выше, справедливо и здесь, за исключением того, что данный цикл всегда выполняется хотя бы один раз, даже если изначально выражение ложно.
Здесь сначала выполняется код цикла, после чего проверяется, надо ли его выполнять еще раз.
Следующая программа будет «вас приветствовать» до тех пор, пока будем вводить символ Y или y (Yes). После введения любого другого символа цикл завершит свою работу.
#include <stdio.h>
void main(void)
{
char answer;
do {
puts(" Hello! => ");
scanf(" %c ", &answer);
}
while ((answer=='y')||(answer=='Y'));
}
Результат выполнения программы:
Hello! => Y
Hello! => y
Hello! => d