Бесконечные циклы
Если условие цикла while никогда не становится ложным, цикл никогда не заканчивается. Это называется бесконечным циклом, и это одна из самых частых ошибок при работе с циклами. Здесь не хватает строки number++:
int number = 1;
while (number <= 5) {
std::cout << number << std::endl;
}Переменная number остаётся равной 1, условие number <= 5 всегда истинно, и программа выводит 1 снова и снова:
1
1
1
1
...На вашем компьютере такая программа работала бы, пока вы её не остановите. В этих упражнениях её останавливают через 5 секунд, и вы видите сообщение Программа работала слишком долго, поэтому её остановили. Нет ли в ней бесконечного цикла? Увидев его, проверьте каждый цикл: меняет ли что-нибудь в его блоке переменную из условия, чтобы в какой-то момент условие стало ложным?
Типичные причины:
- Ничто не меняет переменную, как в примере выше.
- Переменная меняется не в ту сторону. Обратный отсчёт
while (number >= 1)сnumber++вместоnumber--делаетnumberвсё больше и больше, так что условие остаётся истинным. - Изменение стоит вне блока. Повторяется только код между фигурными скобками. Если
number++оказался под закрывающей скобкой}, он выполнится только после цикла, а до этого дело никогда не дойдёт. То же произойдёт, если опустить скобки: тогда к циклу относится только первая инструкция после условия. Поэтому всегда ставьте их, даже если в блоке всего одна строка. - Условие не достигает цели. Условие с
!=(не равно) истинно для любого числа, кроме одного. Если переменная перепрыгнет через это число, цикл будет продолжаться вечно. Поэтому в циклах со счётом обычно используют<,<=,>или>=: они останавливаются, даже если переменная проскочила предел.
Задание
- 1
Программа в редакторе должна вывести нечётные числа от 1 до 9, а затем
Готово. Запустите её: числа продолжают расти, и через 5 секунд программу останавливают. Выясните, почему условие никогда не становится ложным, и исправьте его, чтобы программа выводила1,3,5,7,9иГотово, каждое в своей строке.