Листинг 6.14. Программа zeno.c

Результат выполнения программы, в ходе которого суммируются первые 15 элементов последовательности, выглядит следующим образом:
Введите желаемое количество элементов последовательности: 15 Время = 1.000000, когда количество элементов = 1.
Время = 1.500000, когда количество элементов = 2.
Время = 1.750000, когда количество элементов = 3.
Время = 1.875000, когда количество элементов = 4.
Время = 1.937500, когда количество элементов = 5.
Время = 1.968750, когда количество элементов = 6.
Время = 1.984375, когда количество элементов = 7.
Время = 1.992188, когда количество элементов = 8.
Время = 1.996094, когда количество элементов = 9.
226 Глава 6
Время = 1.998047, когда количество элементов = 10.
Время = 1.999023, когда количество элементов = 11.
Время = 1.999512, когда количество элементов = 12.
Время = 1.999756, когда количество элементов = 13.
Время = 1.999878, когда количество элементов = 14.
Время = 1.999939, когда количество элементов = 15.
Легко заметить, что хотя мы и добавляем все новые элементы, общая сумма, по-видимому, не превысит некоторой величины. И в самом деле, математики доказали, что сумма этой последовательности стремится к 2.0 по мере того, как количество просуммированных элементов стремится к бесконечности, на что указывают результаты выполнения программы. Ознакомьтесь со следующими математическими выкладками. Предположим, что S представляет собой такую сумму:
S = 1 + 1/2 + 1/4 + 1/8 + ...
Здесь многоточие означает "и т.д.”. Разделив S на 2, получаем:
S/2 = 1/2 + 1/4 + 1/8 + 1/16 + ...
Вычитание второго выражения из первого дает:
S - S/2 = 1 +1/2 -1/2 + 1/4 -1/4 + .. .
За исключением начального значения 1 все остальные значения образуют пары, в которых одно значение положительное, а второе — отрицательное, так что эти элементы уничтожают друг друга, в результате оставляя:
S/2 = 1
И, наконец, умножение обеих сторон на 2 дает:
S = 2
Мораль, которую можно извлечь отсюда, такова: прежде чем начинать сложные вычисления, проверьте, не нашли ли математики более простого способа делать это.
Что можно сказать о самой программе? Она показывает, что в выражении можно использовать более одной операции запятой. Вы инициализировали переменные time, power of 2 и count. После того, как вы определили условия для цикла, программа оказалась совсем короткой.
Цикл с постусловием: do while
Циклы while и for являются циклами с предусловием. Условия проверки вычисляются перед каждой итерацией цикла, поэтому вполне возможно, что операторы, помещенные в цикл, никогда не выполнятся. В языке С имеется также цикл с постусловием, в котором проверка условия производится после прохода каждой итерации цикла, благодаря чему гарантируется выполнение операторной части цикла минимум один раз. Эта разновидность цикла называется циклом do while. В листинге 6.15 приведен пример.
Листинг 6.15. Программа do while.с

Управляющие операторы С: циклы 227

Программа в листинге 6.15 читает входные значения до тех пор, пока пользователь не введет 13. Ниже показан результат выполнения этой программы:
Чтобы войти в клуб лечения трискадекафобии, пожалуйста, введите секретный код: 12 Чтобы войти в клуб лечения трискадекафобии, пожалуйста, введите секретный код: 14 Чтобы войти в клуб лечения трискадекафобии, пожалуйста, введите секретный код: 13 Поздравляем! Вас вылечили!
Эквивалентная программа, в которой применяется цикл while, была бы несколько длиннее, как можно видеть в листинге 6.16.
Листинг 6.16. Программа entry.с

Общая форма цикла do while имеет вид:
do
оператор
while ( выражение );
Оператор может быть простым или составным. Обратите внимание на то, что сам цикл do while считается оператором и таким образом требует наличия после него точки с запятой (рис. 6.5).
228 Глава 6

Рис. 6.5. Структура цикла do while
Цикл do while всегда выполняется, по меньшей мере, один раз, потому что проверка условия производится после того, как тело цикла выполнено. С другой стороны, циклы for и while могут не выполниться ни разу, поскольку проверка условия цикла осуществляется перед входом в цикл. Использование циклов do while должно быть ограничено случаями, при которых требуется выполнение хотя бы одной итерации. Например, программа запроса пароля мола бы содержать цикл, как демонстрируется в следующем псевдокоде:
Читать дальше