Начала программирования на языке Си, страница 11

8.5.3. Параметрический цикл

Имеет вид:

for(выражение_1; выражение_условие; выражение_3)

{ тело цикла }

Выражения в операторе for могут состоять из нескольких выражений, разделенных запятыми. Выражение_1 определяет действия выполняемые до начала цикла., т.е. задает начальные условия для цикла. Выражение_условие обычно-логическое или арифметическое. Оно определяет условие окончания или продолжения цикла. Если оно истинно (т.е. не равно 0), то выполняется тело цикла, а затем вычисляется выражение_3). Выражение_3 обычно задает необходимые для следующей итерации изменения параметров или любых переменных тела цикла. После выполнения Выражения_3 вычисляется истинность выражения_условия и все повторяется. Т.е. Выражение_1 вычисляется один раз, а выражение_условие и выражение_3 вычисляются после каждого выполнения тела цикла. Цикл выполняется до тех пор пока не станет ложным выражение_условие.

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

Пример:

for (    ;x<0; x++)

{ printf(“x=%5.2f”,x);

}

Здесь Выражение_1 отсутствует, считается, что начальное значение  x определено ранее, выражение_условие имеет вид x<0, а тело цикла это printf(“x=%5.2f”,x).

То есть здесь написано следующее: для ранее заданного x, пока x<0 увеличивать его значение на единицу и на каждом таком шаге выводить значение x на печать.

8.5.4. Иллюстрация применения операторов цикла

Для иллюстрации трех операторов цикла (С предусловием, постусловием и параметрического) воспользуемся следующей задачей.

Необходимо вычислить с заданной точностью eps сумму членов ряда:

для данного значения x.

Пусть          i – номер члена ряда;

r – очередной член ряда;

b – результат.

Для нашей задачи цикл с предусловием может быть реализован следующим образом:

1  i=2;

2  b=1.0;

3  r=x;

4  while(r>eps||r<-eps)       //* означает “или” *//

{

5  b=b+r;

6  r=r*x/i;

7  i++;

}

Блок-схема цикла с предусловием представлена на рис. 8.3.

Рис. 8.3. Блок-схема цикла с предусловием

Если команду цикла с предусловием можно сформулировать как: “До тех пор пока выполняется выражение_условие (в нашем примере: “До тех пор пока переменная r>eps или r<-eps”) выполнять операторы внутри фигурных скобок или тело цикла”.

Для рассмотренной нами задачи цикл с постусловием реализуется так:

1  i=1;  b=0.0;  r=1.0;

2  do

{

3  b=b+r;

4  r=r*x/i;

5  i++;

}

6  while(r>=eps||r<=-eps);

Блок-схема цикла с постусловием представлена на рис. 8.4.

Рис. 8.4. Блок-схема цикла с постусловием

Команду цикла с постусловием можно сформулировать так: “выполнять операторы тела цикла до тех пор, пока не будет выполняться выражение_условие”. (В нашем примере: “Выполнять операторы с3 по 5 до тех пор пока переменная r>=eps или r<=-eps”.)

Для нашего примера параметрический цикл может быть реализован следующим образом:

i=2; b=1.0; r=x;

for(;r>eps||r<-eps;)

{       b=b+r;

r=r*x/i;

i=i+1;          }

или так

for(i=2, b=1.0, r=x;r>eps||r<-eps;)

{        b=b+r;

r=r*x/i;

i=i+1;         }

или так

for(i=2, b=1.0, r=x;r>eps||r<-eps;i++)

{         b=b+r;  

r=r*x/i;         }

или так

for(i=2, b=1.0, r=x; r>eps||r<-eps; b+=r, r*=x/i; i++);

Здесь тело цикла пустой оператор.

Блок-схема параметрического оператора представлена на рис. 8.5.

Рис. 8.5. Блок-схема параметрического оператора

Контрольные вопросы и задания

1. Какими операторами реализуются циклические конструкции?

2. Напишите программу вычисления значений функции       

     на  отрезке   [0,1]   с шагом    .

3. Найдите ошибки в следующих фрагментах программ:

a)   if(y-1<=12);

{for  (i=1; j=1;k=0;i>j;i++;j=j+2);

y=i*j*k-sqrt(k);

else

y=x*i*j-k;}

b)   do

{z=pow(x+y);

x=x+5;

printf(“x=%5.2f”,z);}

while (x<0)

c)    while(a>0 && b>9);