Оператор break.Как видно из предыдущего примера, принятый способ проверки исходных данных с повторным запросом значения точности eps не очень удобен, так как на экране отсутствует сообщение об ошибке. В примере, рассмотренном в предыдущем параграфе (сумма членов ряда Фибоначчи), на экран выводится конкретное указание о сделанной ошибке ("Ошибка! k должно быть > 2 !"), что упрощает ее исправление. Однако в этом случае в программе использованы метки и оператор перехода, что считается некорректным с точки зрения структурного программирования.
Добиться такого же результата можно, не нарушая принципов структурного программирования и применяя оператор цикла, если использовать в его теле оператор прерывания break.Этот оператор (рис. 2.4) прекращает выполнение оператора цикла и передает управление следующему за ним (за циклом) оператору.
Рис. 2.4. Схемы выполнения в циклах операторов break и continue:
а - цикл с предусловием while;б - цикл с постусловием do;
в — параметрический цикл for
Необходимость в использовании оператора прерывания в теле цикла возникает, когда условие продолжения итераций нужно проверять не в начале цикла (как в циклах forи while) и не в конце тела цикла (как в цикле do), а в середине тела цикла. Наиболее естественна в этом случае такая структура тела цикла:
Рассмотрим пример с использованием оператора прерывания breakв цикле ввода исходных данных.
Сумма отрезка степенного ряда.Введя значения переменных n и g, вычислить сумму, где п>0. Задачу решает следующая программа:
Для защиты от неверных исходных данных использован цикл (строки 9 ¸15), в заголовке которого после whileзаписано заведомо истинное выражение 1, т.е. цикл может быть прерван только за счет выполнения операторов его тела. В строке 13 оператор breakвыполняется в случае истинности условия "n>0". При этом цикл заканчивается, и следует переход к оператору строки 16. Таким образом, сообщение об ошибке, выводимое функцией printf() из строки 14, печатается для каждого неположительного значения n.
Вычисляя сумму ряда (строки 16 ¸ 20), очередной его член получаем, умножая предыдущий на g (строка 18). Тем самым устранена необходимость явного возведения в степень. В выражении_1 оператора forформируются начальные значения переменных, изменяемых при выполнении цикла. В строках 18, 19 использованы составные операции присваивания.
Приведем результаты выполнения программы для Turbo С:
Полученное значение суммы довольно трудно прочесть. По-видимому, в этой задаче следует применять печать результата в экспоненциальной форме, т.е. в printf( )из строки 21 использовать спецификацию преобразования %е. При этом получится такой результат: