Главная страница

Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)


Скачать 319.62 Kb.
НазваниеЛекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Дата11.01.2022
Размер319.62 Kb.
Формат файлаdocx
Имя файлаLecture_Programming_2021_09_01.docx
ТипЛекции
#328427
страница13 из 36
1   ...   9   10   11   12   13   14   15   16   ...   36

Оператор цикла 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 (ложь).

    1. Оператор цикла 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);

    1. Оператор прерывания цикла


Пусть требуется проверить, имеются ли на заданном промежутке табулирования отрицательные значения функции 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;

}

}
    1. Оператор продолжения цикла


Оператор "continue;" вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются:
while( ... )

{

...

if(...) continue;

... /* операторы пропускаются */

}

    1. 1   ...   9   10   11   12   13   14   15   16   ...   36


написать администратору сайта