Урок 5.3. Условный оператор if

Урок 5.5. Оператор выбора switch

Читать далее

Урок 5.6. Оператор разрыва break

Читать далее

Урок 5.7. Оператор цикла while

5.7. Оператор цикла while

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

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

Оператор цикла while работает следующим образом: если <выражение> истинно (или не равно нулю, что с точки зрения Си одно и то же), то <оператор> выполняется один раз, а затем <выражение> вновь проверяется. Эта последовательность действий, состоящая из проверки <выражение> и выполнения <оператор>, периодически повторяется до тех пор, пока <выражение> не станет ложным (или с точки зрения Си равным нулю).

<Оператор>, входящий в while, часто называют телом цикла, ибо в большинстве случаев это блок, в состав которого входит несколько операторов. Алгоритмическая схема выполнения оператора цикла while представлена на рис 5.4.

Fig5.4.whileРис.5.4 Алгоритмическая схема выполнения оператора цикла while.

 Из алгоритмической схемы выполнения видно, что оператор while – это цикл с предусловием; решение, выполнять ли в очередной раз тело цикла, принимается перед началом его прохождения. Поэтому вполне возможно, что тело цикла не будет выполнено ни разу. Кроме того, чтобы тело цикла выполнялось не бесконечно, а определенное количество раз, необходимо при каждом новом выполнении цикла изменять каким-то образом переменную, входящую в состав <выражение> так, чтобы в конце концов <выражение> стало ложным. Т

акая переменная, которая при каждом новом выполнении цикла изменяется, обеспечивая завершение цикла, обычно называется переменной цикла. Си позволяет обеспечить изменение переменной цикла либо в <выражение>, либо в <оператор>.

Рассмотрим эти оба случая на примере вычисления ,

т.е. y =СУММА по n от 1 до 50 ДЛЯ n/(n+5).

Вариант 1. Изменение переменной цикла в <выражение> :

int n = 0;
float y = 0;
while(++n <= 50) y += n/(n + 5.0);

Вариант 2. Изменение переменной цикла в <оператор>:

int n = 1;
float y = 0;
while(n <= 50)
{ 
  y += n/(n + 5.0);
  ++n;
}

Гибкость языка Си предоставляет возможность записать еще один вариант этой программы:

int n = 1;
float y = 0;
while(y += n/(n + 5.0), ++n, n <= 50);

В этом примере тело цикла вырождено, на месте <оператор> записан пустой оператор, а вычисления, обеспечивающие суммирование, перенесены в <выражение>, в качестве которого записано выражение с запятой. Это правомочно, ибо значением выражения с запятой является значение самого правого выражения – оно в данном случае является выражением отношения и обеспечивает завершение выполнения оператора цикла while.

Организацию вложенных циклов рассмотрим на примере вычисления SummaSumm_G5_7

int i=0;
double y=0;
 
while(++i <= 100)
{
   j = 0;
   while(++j <= 50)
     y += 1/(i + sqrt((double)j);
}

 


В этом фрагменте программы использована встроенная функция вычисления квадратного корня sqrt, которая в качестве аргумента требует тип double, что повлекло за собой применение операции приведения типа. Внутренний цикл с заголовком while(++j <= 50) работает под управлением внешнего цикла с заголовком while(++i <= 100). Выход из цикла, обусловленный ложным значением <выражение>, является естественным и происходит при исчерпании числа повторений тела цикла.

Иногда необходимо выйти из цикла досрочно, т.е. при истинном значении <выражение> на очередном шаге выполнения тела цикла. Для этого в теле цикла используется оператор break, выполнение которого приводит к передаче управления на оператор программы, записанный после тела цикла. Чаще всего оператор break используется в тех случаях, когда заданы два различных условия прекращения работы цикла.

Например, необходимо вычислить  SummaPoN_G5_7 , однако, если значение sum превышает 25, то суммирование прекратить:

float sum;
int N;
sum=0;N=1;
 
while(N <= 100)
{
   sum += N/(N + 1.0);
   if(sum > 25.0) break;
   N++;
}

 


Оператор break используется для досрочного завершения циклов всех видов, которые будут рассмотрены далее: циклов do while и циклов for. В операторе switch и в операторах цикла оператор break действует идентично, передавая управление на оператор, записанный после switch или после тела цикла.

Урок 5.9. Оператор цикла for

5.9. Оператор цикла for

Оператор цикла for имеет следующую общую форму записи:

for(<выражение1>;<выражение2>;<выражение3>)<оператор>

В операторе for <выражение1> называется инициализирующим выражением и обычно оно устанавливает начальное значение переменной цикла. Выражение <выражение2> называется проверяющим выражением и определяет условие завершения цикла. Выражение <выражение3> называется корректирующим и обычно определяет шаг изменения переменной цикла. Выражения в заголовке цикла for отделяются друг от друга точкой с запятой. Например, фрагмент программы:

float y=0;
 
for(int n = 1; n <= 50; ++n) 
      y += n/(n + 1.0);


вычисляет Formula_5. Здесь n = 1инициализирующее выражение,
n <= 50проверяющее выражение, ++nкорректирующее(отвечающее за итерацию цикла) выражение. Оператор цикла for работает следующим образом. Вначале вычисляется инициализирующее выражение <выражение1>. Затем, если проверяющее выражение <выражение2> истинно, то выполняется <оператор>. После выполнения <оператор> выполняется корректирующее выражение и вновь вычисляется проверяющее выражение, истинность которого влечет за собой повторное выполнение <оператор>. Если проверяющее выражение имеет значение ложь, то выполнение оператора for завершается и управление передается на оператор программы, записанный после оператора for. На месте инициализирующего выражения может быть записан инициализирующий оператор, например:

char *ptr = getStr();
int i = 0, j =0;
int lo = 0, hi = max, mid = max/2;

Алгоритмическая схема выполнения оператора for представлена на рис 5.6.
Fig5_6

Рис 5.6. Алгоритмическая схема выполнения оператора for.

В соответствии с алгоритмической схемой, оператор for, вычисляющий сумму, будет выполняться, как это представлено на рисунке 5.7.

Fig5_7

Рис 5.7. Схема выполнения оператора for.

Из алгоритмической схемы видно, что оператор for – это цикл с предусловием: решение выполнить в очередной раз тело цикла или нет принимается до начала его прохождения и, естественно, может случиться, что тело цикла не будет выполнено ни разу. В Си сняты ограничения на организацию цикла – параметры заголовка цикла можно изменять внутри цикла, переменная цикла сохраняет свое значение после завершения цикла. Кроме того, любое выражение в заголовке цикла или все три могут быть опущены, но при этом разделяющая точка с запятой должна сохраняться.
Например:

for( ; n < 50; n++);
for( ; ; n++);
for( ; ; ) ;

Если какое-либо из выражений заголовка цикла опущено, то в алгоритмической схеме выполнения будет отсутствовать соответствующий обрабатывающий блок. Пустое проверяющее выражение всегда считается истинным. На примере вычисления k=7! рассмотрим циклы с различными видами заголовка for:

// 1.Полный заголовок for:
k=1;
 
for(n = 7; n > 0; --n) k*=n;
 
// 2.Отсутствует инициализирующее выражение:
k=1, n = 7;
 
for( ; n > 0; --n) 
   k *= n;

// 3.Отсутствуют инициализирующие и проверяющие выражения,
// выход из цикла осуществляется оператором break:
k=1, n = 7;
 
for( ; ; --n)
   if(n <= 0) break;
   else k *= n;
 
// 4.Отсутствуют инициализирующие, проверяющие и корректирующие 
// выражения, выход из цикла осуществляется оператором break:
k = 1, n = 7;
 
for( ; ;)
   if(n <= 0) break;
   else {k *= n; 
         --n;
        }

Во всех этих примерах k=7! вычисляется по схеме k=7*6*5*4*3*2*1. Из примеров видно, что если отсутствует инициализирующее выражение, то его необходимо записать до входа в оператор for, а если отсутствует проверяющее и корректирующее выражения, то их необходимо реализовать в теле цикла for. Конечно, это справедливо, если мы желаем хотя бы каким-то образом завершить цикл.

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

Урок 5.8. Оператор цикла do while

5.8. Оператор цикла do while

Оператор цикла do while имеет следующую форму записи:

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

Оператор do while работает следующим образом: сначала выполняется <оператор>, а затем вычисляется значение <выражение> . Если значение <выражение> истинно, то <оператор> выполняется повторно, если <выражение> ложно, то выполнение цикла завершается. Алгоритмическая схема выполнения do while представлена на рис. 5.5.Fig5.4

Рис. 5.5. Алгоритмическая схема выполнения do while.

Оператор do while определяет цикл с постусловием, поскольку проверка на необходимость повторного выполнения <оператор> осуществляется после отработки тела цикла и, таким образом, тело цикла всегда выполняется, по меньшей мере – единожды. Аналогично, как и для цикла while, программист должен позаботиться о завершении цикла путем изменения переменной(условия) цикла либо в теле цикла, либо в <выражение> для while.

Примеры, приведенные в предыдущем разделе 5.7, перепишем с использованием оператора do while.

// 1. Изменение переменной цикла в <выражение>:
int n = 1; 
float y = 0;
 
do
    y +=n/(n+5.0);
while (++n <= 50);
 
// 2. Изменение переменной цикла в <оператор>:
int n = 1; 
float y = 0;
 
do
{ 
  y += n/(n + 5.0); 
  ++n;
} while (n <= 50);
 
// 3. Внесение <оператор> в состав <выражение>:
int n = 1; 
float y = 0;
 
do
   ; /* тело цикла - пустой оператор */
 
while (y += n/(n + 5.0), ++n, n <= 50);
 
// 4. Вложенные циклы:
int i = 1, j;
double y = 0;
 
do
{
  j = 1; 
  do
  {
     y += 1/(i + sqrt((double)j));
  }while (++j <= 50);
}while (++i <= 100);

 


// 5. Прерывание выполнения цикла оператором break; :
float sum;
int N;
sum = 0,N = 1;
 
do
  {   
     sum += N/(N + 1.0);
     if (sum > 25.0) break;
     N++;
  } while (N <= 100);

 


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

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов