Операторы цикла и операторы передачи управления



 

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

 

Организация циклов с помощью операторов if и goto

 

Циклы используются для организации многократно повторяющихся вычислений. Любой цикл состоит из тела цикла, то есть тех операторов, которые выполняются несколько раз, начальных установок, модификации параметра цикла и проверки условия продолжения выполнения цикла, которое записывается в виде логического выражения (рис. 2.1). Выход из цикла может быть организован как при истинности выражения – «Да», так и при его неистинности «Нет» (на рис. 2.1 лишь пример выхода по – «Нет»).

Один проход цикла называется итерацией. Проверка условия выполняется на каждой итерации либо до тела цикла (тогда говорят о цикле с предусловием), либо после тела цикла (цикл с постусловием). Разница между ними состоит в том, что тело цикла с постусловием всегда выполняется хотя бы один раз, после чего проверяется, надо ли его выполнять еще раз. Проверка необходимости выполнения цикла с предусловием делается до тела цикла, поэтому возможно, что он не выполнится ни разу.

 

 

 


Рис. 3.1, Структурные схемы операторов цикла:

а – цикл с предусловием; б – цикл с постусловием

 

Переменные, изменяющиеся в теле цикла и используемые при проверке условия продолжения, называются параметрами цикла. Целочисленные параметры цикла, изменяющиеся с постоянным шагом на каждой итерации, называются счетчиками цикла.

Начальные установки могут явно не присутствовать в программе, их смысл состоит в том, чтобы до входа в цикл задать значения переменным, которые в нем используются.

Цикл завершается, если условие его продолжения не выполняется. Передавать управление извне внутрь тела цикла, минуя его заголовок, не рекомендуется, так как параметры цикла могут быть не определены.

Рассмотрим пример, который можно использовать для решения задания 1. Требуется вычислить арифметическое выражение, содержащее бесконечную сумму:

Для инициализации вычислений переменной n присваивается начальное значение 0 и переменной F также присваивается 0. В цикле переменная n после каждого вычисления выражения, стоящего под знаком суммы должна изменяться по формуле n = n + 1. Таким образом, n – счетчик цикла. Если бы был конечный верхний предел суммы, то условием завершения цикла было бы равенство n конечному пределу. Но в данном случае предел бесконечный и, следовательно, F может быть вычислена только приближенно.

Для этого вводится понятие погрешности вычисления e. Истинную погрешность вычислений найти можно аналитически, но не для всех выражений. Поэтому воспользуемся приближенными методами оценки погрешности. Один из вариантов такой оценки – отбросить все слагаемые, абсолютная величина которых меньше e. Конечно, это не та e, которая близка к истинной погрешности вычислений, но зато такая оценка универсальна (для любого выражения). Понятно, что истинная погрешность всегда больше e. Поэтому e следует выбирать меньше ожидаемой истинной погрешности раз в 10. В большинстве случаев это оправданно. Хотя, конечно, анализ выражения под знаком суммы никогда не помешает.

Переменная F, то есть сумма должна накапливаться с каждым циклом, для этого слагаемые, содержащие в том или ином виде n, складываются с переменной F и результат заносится также в F.

Цикл с постусловием для приведенного выше выражения будет выглядеть так:

 

n=0; F=0;eps=0.001; //инициализация переменных

// переменную eps в задании 3 следует вводить с клавиатуры

m1: Fp=1.0/n;        //вычисление выражения под знаком суммы

   F=F+Fp;          //накопление суммы

   n++;                 //изменение переменной цикла

if (Fp>=eps) goto m1;

 

 


Здесь eps – погрешность e;

Переменная Fp вводится, чтобы при анализе условия не вычислять выражение повторно. После выхода из цикла переменная F будет содержать сумму вычисленную приближенно. Можно также контролировать число циклов n с целью защиты от ошибок программирования. Обычно это делают при отладке программы. Если число циклов программирования слишком велико (например, n>100000) можно выйти из цикла по этому условию. Для этого в последней строке программы можно связать 2 условия логическим оператором:

 

if (Fp>=eps & n<=100000) goto m1;

 

Операторы цикла

 

Операторы цикла используются для организации многократно повторяющихся вычислений. Любой цикл состоит из тела цикла, то есть тех операторов, которые выполняются несколько раз, начальных установок, модификации параметров цикла и проверки условия продолжения выполнения цикла (рис. 3.1). Выше было показано, как реализовать цикл с помощью двух операторов if и goto. Операторы цикла позволяют организовать цикл «явным» образом, что способствует большей оптимизации программного кода.

Переменные, изменяющиеся в теле цикла и используемые при проверке условия продолжения, называются параметрами цикла. Целочисленные параметры цикла, изменяющиеся с постоянным шагом на каждой итерации, называются счетчиками цикла.

Начальные установки могут явно не присутствовать в программе, их смысл состоит в том, чтобы до входа в цикл задать значения переменным, которые в нем используются.

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение, как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue, и goto. Передавать управление извне внутрь тела цикла, минуя его заголовок, не рекомендуется, так как параметры цикла могут быть не определены.

Для удобства, а не по необходимости, в C++ есть три разных оператора цикла – while, do while и for.

 

Цикл с предусловием (while)

 

Цикл с предусловием реализует структурную схему, приведенную на рис. 3.1, а, и имеет вид:

 

while ( выражение ) оператор

 

Выражение определяет условие повторения тела цикла, представленного простым или составным оператором. Выполнение цикла начинается с вычисления выражения. Если оно истинно (не равно false), выполняется оператор цикла. Если при первой проверке выражение равно false, цикл не выполнится ни разу. Тип выражения должен быть арифметическим или приводимым к нему. Выражение вычисляется перед каждой итерацией цикла. Когда выражение оказывается ложным, управление передается следующему после цикла оператору.

Тело цикла может состоять не из одного оператора, а представлять собой блок.

Пример (программа находит все делители целого положительного числа):

Для краткости изложения начало всех программ этой главы не приводится, но подразумевается

 

int num;

cout <<RUS( "\nВведите число : "); cin>> num;

int div = 2; // кандидат на делитель

while (div <= num)

{if (!(num % div))cout << div <<"\n";

div++;}

 

Для краткости изложения начало всех программ этой главы не приводится, но подразумевается, что оно включает функцию RUS, известную из предыдущих примеров, а также необходимые директивы и библиотеки.

 

2.2 Цикл с постусловием (do … while)

 

Цикл с постусловием реализует структурную схему, приведенную на рис. 3.1, б, и имеет вид:

 

do оператор while (выражение);

 

Сначала выполняется оператор или блок, составляющий тело цикла, а затем вычисляется выражение. Если оно истинно (не равно false), тело цикла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления. Тип выражения должен быть арифметическим или приводимым к нему.

Пример (программа осуществляет проверку ввода):

 

char answer;

do{cout << RUS("\nКупи слоника! "); cin >> answer; }

while (answer != 'y');

 

Цикл с параметром for

 

Цикл имеет следующий формат:

 

for ( инициализация; выражение; модификации) оператор;

 

Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой (операцией «последовательное выполнение»), например, так:

 

for (int i = 0, j = 2; ...

или

int k, m:

for (k = 1, m = 0; ...

Областью действия переменных, объявленных в части инициализации цикла, является цикл. Инициализация выполняется один раз вначале исполнения цикла.

Выражение определяет условие выполнения цикла: если его результат, приведенный к типу bool, равен true, цикл выполняется, иначе происходит выход из цикла и управление передается следующему за оператором цикла оператору. Цикл реализован как цикл с предусловием: сначала проверяется условие "на истинность", затем выполняется оператор (тело цикла), затем производятся модификации, после чего управление возвращается к проверке условия "на истинность" и т.д.

Модификации выполняются после каждой итерации цикла и служат для изменения управляющих переменных цикла (параметров цикла). В части модификаций можно записать несколько операторов через запятую. Обычно здесь записывается модификация счетчика цикла. Пример (оператор, вычисляющий сумму чисел от 1 до 100):

 

for (int i = 1, s = 0; i<=100; i++) s += i;

 

Здесь i – счетчик цикла. Он инициализируется значением 1. В начале каждой итерации проверяется, не достиг ли он значения 100. Как только i станет равным 101, оператор s+= i пропускается и управление передается следующему за оператором цикла оператору. В конце каждой итерации i увеличивается на 1 ( операция i++).

Оператор в структуре цикла for может быть простым оператором или блоком.

Любая из частей оператора for может быть опущена, но точки с запятой надо оставить на своих местах. Поэтому пример бесконечного цикла for выглядит следующим образом:

for( ; ; )

 cout<<” Бесконечный цикл”;

 

Пример (программа печатает таблицу значений функции у=х2+1 во введенном диапазоне):

 

float Xn, Xk, Dx, X;

printf(RUS("Введите диапазон и шаг изменения аргумента: "));

scanf("%f%f%f", &Xn, &Xk, &Dx);

printf("| X | Y |\n");

for (X = Xn; X<=Xk; X += Dx);

printf("| %5.2f | %5.2f |\n", X, X*X + 1);

 

Часто встречающиеся ошибки при программировании циклов – использование в теле цикла неинициализированных переменных и неверная запись условия выхода из цикла.

Чтобы избежать ошибок, рекомендуется:

- проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);

- проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;

- предусмотреть аварийный выход из цикла по достижению некоторого количества итераций;

- если в теле цикла требуется выполнить более одного оператора, нужно заключать их в фигурные скобки;

- при программировании цикла for не допускать изменение значения счетчика в теле цикла. Это может приводить к " выпадению " итераций или к бесконечному циклу.

В блок-схемах цикл с параметром for можно изображать с использованием блока «модификация». Внутри блока записывается начальное значение, конечное значение и шаг изменения параметра (рис. 3.2). Если шаг равен 1, его можно не указывать.

 


Рис. 3.2 Цикл с параметром for

 

Операторы цикла взаимозаменяемы, но можно привести некоторые рекомендации по выбору наилучшего в каждом конкретном случае.

Оператор do … while обычно используют, когда цикл требуется обязательно выполнить хотя бы раз (например, если в цикле производится ввод данных).

 Оператором while удобнее пользоваться в случаях, когда число итераций заранее не известно, очевидных параметров цикла нет или модификацию параметров удобнее записывать не в конце тела цикла.

Оператор for предпочтительнее использовать в большинстве остальных случаев (однозначно – для организации циклов со счетчиками).

 


Дата добавления: 2018-11-24; просмотров: 458; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!