Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
![]()
|
Оператор цикла do-while.Оператор цикла do-while предназначен для реализации циклических алгоритмов и имеет следующую форму записи БНФ: цикл_do-while = "do" цикл_оп "while" "("выражение")" ";" Оператор выполняется циклически до тех пор, пока выражение отлично от нуля. В отличие от оператора while, тело оператора do-while выполняется хотя бы один раз до первого вычисления условия. Работу оператора do-while проиллюстрируем на примере программы, которая определяет корень уравнения x-cos(sin(x))=0 методом итераций, который заключается в циклическом вычислении очередного приближения x_new по предыдущему приближению x_old, согласно выражению x_new=cos(sin(x_old)), вытекающему из исходного уравнения. Процесс итерации заканчивается тогда, когда x_new станет равен x_old. Программа, реализующая этот алгоритм, приведена ниже. #include #include /* Решение уравнения x-cos(sin(x))=0 */ void main (void) { double x_new=0.9, x_old, eps=0.0001; do { x_old = x_new; x_new = cos(sin(x_old)); } while ( fabs( x_new - x_old ) > eps ); printf ( "x=%lf", x_new ); } Сравнение двух вещественных чисел осуществляется с использованием точности eps. Это необходимо потому, что из-за погрешностей округления прямая проверка на равенство двух вещественных чисел, скорее всего, даст в результате 0 (ложь). Оператор цикла forОператор цикла for обычно называют циклом с параметром или циклом с известным количеством повторений. Однако в языке Си он имеет более гибкие возможности и имеет следующую форму записи БНФ: цикл_for = "for(" выражение1 “;” выражение2 “;” выражение3 “)” цикл_оп Вначале вычисляется выражение1, затем вычисляется выражение2 и, если результат выражени2 отличен от нуля, то выполняется цикловый оператор (цикл_оп), затем вычисляется выражение3. На этом виток цикла завершается, и цикл переходит к следующему витку, вычисляя выражение2. Витки выполняются до тех пор, пока при вычислении выражения2 результат отличен от нуля. Как только в результате вычисления выражения2 получится 0, управление будет передано следующему за циклом оператору. Обычно выражение1 строится таким образом, чтобы в результате его вычисления параметры цикла получили нужные значения. По смыслу выражение1 является инициализацией цикловых переменных. Выражение2 по смыслу является условием продолжения цикла, а выражение3 – модификацией цикловых переменных. Обычно считается плохим тоном изменять значения цикловых переменных за пределами заголовка цикла for. int i; // Считаем до десяти с помощью цикла for for(i=1; i<=10; i++) printf(“%d “, i); Пусть требуется проверить, имеются ли на заданном промежутке табулирования отрицательные значения функции sin. Следующий пример решает эту задачу: for (x = x1; x<=x2; x+=dx) { if(sin(x)<0) printf(“Обнаружено отрицательное значение”); } Предыдущая программа имеет существенный недостаток: перебираются все значения синуса, хотя цикл можно остановить, когда появится первое отрицательное значение. Этот недостаток можно исправить, как показано в следующем фрагменте: for (minus = 0, x = x1; x<=x2 && minus==0; x+=dx) { if(sin(x)<0) { printf(“Обнаружено отрицательное значение”); minus = 1; } } В языке Си есть специальный оператор для прерывания цикла. Это оператор "break;". Выполнение его в программе немедленно прерывает цикл, в котором он находится и управление передается на следующий за циклом оператор. Используя оператор break, цикл предыдущей программы можно переписать в виде: for (x = x1; x<=x2; x+=dx) { if(sin(x)<0) { printf(“Обнаружено отрицательное значение”); break; } } Оператор продолжения циклаОператор "continue;" вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются: ![]() ![]() { ... ![]() ... /* операторы пропускаются */ } |