Оператор цикла с параметром (for)

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

for (инициатор; условие; модификатор) // заголовок цикла

оператор // тело цикла, где

for (для) – ключевое слово;

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

условие – выражение сравнимое с нулем, определяющее условие продолжения цикла;

модификатор – одно или несколько выражений, изменяющих переменные оператора цикла;

оператор (тело цикла) – одиночный, составной или пустой оператор, выполняющий действия в цикле.

Оператор for действует следующим образом.

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

· Вычисляется выражение условия. Если его значение не равно 0 (истинно), то выполняется оператор (тело цикла), иначе при значении равном 0 (ложно) управление передается следующему оператору.

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

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

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

Пример23.

Возможные варианты заголовков оператора цикла for.

1. Вывод значений изменяющихся переменных:
for (i=20, k=i; i > - 45; k += i, i -= 5) printf (“k=%d i=%d\n”, k, i);

2. Получение величины переменной x с заданной точностью:
for (x=d/2.0; fabs(x*x-d) > 0.01; x=(x+d/x)/2)
/* тело цикла – пустой оператор, за которым стоит точка с запятой */;

3. Оператор суммирует первые 10 ненулевых целых значений:
for (c=1, sum=0; c <= 10; sum +=c, c++);

4. Пустой оператор тела цикла можно использовать для организации задержки выполнения:
for (i=0; i < 100000; i++); // заголовок цикла с пустым телом цикла

Прерывание выполнения оператора for может быть осуществлено с помощью операторов break (прервать), continue (продолжить), goto (перейти) аналогично их действию в операторе while. Во вложенных циклах оператор break прерывает самый внутренний, содержащий его цикл for; оператор continue передает управление на конец самого внутреннего тела цикла, в котором он находится, для продолжения итераций. Оператор goto из тела цикла оператора for любой глубины вложения передает управление любому оператору блока функции. Он используется для аварийного выхода из внутренних и любых циклов вообще. Рассмотрим примеры применения оператора for.

 
 

Пример 24.

Вычислить сумму ряда

где N – количество членов ряда.

Рекуррентная формула суммы Sk = Sk-1 + sin(kx), при начальном значении параметра цикла k=1 начальное значение S0 = 0.

Программа.

# include<stdio.h>

#include<conio.h>

# include <math.h>

void main()

{ int k, N; float S, x; // описание переменных

clrscr (); // чистка экрана

printf (“ Введите x, N: ”);

scanf (“ %f%d”, &x, &N); // ввод данных ряда

for (k=1, S=0; k<=N; k++) // заголовок цикла

S += sin(k * x); // вычисление суммы ряда

printf (“Сумма = %f ”, S); // вывод результата

}

Пример 25. Программа вывода четных чисел меньше 100.

void main ()

{ int n;

for (n = 0; n < 100; n++)

{ if (n % 2) // если нечетные (≠0) – продолжить

continue;

printf(“%3d ”, n); // печать четных чисел

}

}

Пример 26.

Ввести натуральное число N и определить, является ли оно простым.

Простое число делится без остатка только на 1 и N, а не простое число может делиться без остатка и на другие числа в диапазоне от 2 до N/2.

Программа:

void main()

{ int N, i, p=1; // р=1 – признак простого числа

clrscr ();

printf (“ Введите натуральное число N>1: ”);

sсanf (“ %d”, &N); // ввод числа

for (i=2; i <= N / 2; i++) // цикл по делителям

if (!(p = N % i)) break; // деление без остатка (р=0)

if (p) printf (“Число %d простое.”, N);

else printf (“Число %d не простое.”, N);

}

Рассмотрим пример применения всех трех операторов цикла с вложенными циклами.

Пример27.

Ввести натуральное число N и найти его разложение на простые множители, произведение которых дает N. Организовать диалог с пользователем (интерактивный режим) по вводу любого числа N и контроль его ввода.

Программа.

void main()

{ int N, n, i, p; // описание переменных

clrscr(); // очистка экрана

puts (“ Разложение числа на простые множители ”);

do // цикл диалога

{ do // цикл проверки числа

{ printf(“\nВведите натуральное число >1:”);

scanf (“ %d”, &N); // ввод числа

} while (N<=1); // условие продолжения ввода

n=N; // текущее значение N

p=1; // признак простого числа

printf(“\n %d =”, N); // вывод числа N

for (i=2; i<=N/2; i++) // цикл по множителям

{ if (n % i == 0) // если число не простое

{ p=0; // признак не простого числа

while (n % i == 0) // цикл по одинаковым множителям

{ printf (“%d*”, i); // вывод множителя

n /= i; // число делится на множитель

}

}

} // конец цикла по множителям

if (p) printf(“ простое число ”);

printf (“\nПродолжить? Да – нажмите 1, Нет – любую клавишу”);

i=getche(); // ввод видимого символа

} while (i == ’1’); // условие продолжения диалога

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: