§ 5. Оператор цикла

5.3. Оператор цикла с параметром

Для записи оператора цикла с параметром используется команда for. Формат команды:

for (<Блок1>; <Блок2>; <Блок3>){

  тело цикла;

}

Для организации работы такого цикла необходимо описать три операции:

  • инициализация (блок1) — присваивание начальных значений переменным, которые изменяются в цикле. Если таких команд несколько, то они перечисляются через запятую;
  • условие (блок2) — проверка условия повторения цикла. Условие может быть простым и составным. В блок может входить несколько условий, перечисленных через запятую. В этом случае цикл выполняется до тех пор, пока хотя бы одно из условий истинно.
  • модификация (блок3) — действия, которые выполняются в конце каждой итерации (прохода цикла).

Если в теле цикла for должен выполниться один оператор, тогда фигурные скобки можно опустить.

В записи цикла for можно опустить один или несколько блоков, но нельзя опускать точку с запятой, разделяющую три составляющие цикла (пример 5.3).

Наиболее распространен частный случай записи цикла for, который близок к записи аналогичного цикла на языке Pascal:

for (счетчик = значение;

     счетчик < значение;

     шаг цикла) {

    тело цикла;

}

Счетчик цикла (параметр цикла) — переменная, в которой хранится количество проходов данного цикла. В отличие от Pascal, параметр цикла может быть вещественным и изменяться с любым значением шага цикла (пример 5.4).

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

Пример 5.5. Написать программу для вывода таблицы умножения на заданное число x.

Этапы выполнения задания

I. Исходные данные: x (введенное число).

II. Результат: 9 строк вида straight a space asterisk times space straight x space equals space straight c.

III. Алгоритм решения задачи.

1. Ввод исходных значений.
2. 
Значение переменной a изменяется в цикле от 1 до 9.
3.
Значение переменной c = a × x.
4. 
Так как количество повторений заранее известно, используем цикл for.
5. Вывод значений осуществляется в цикле.

VI. Описание переменных: x, a, c – int.

Пример 5.6. Написать программу, которая выведет все двузначные числа в виде таблицы так, чтобы в каждой строке этой таблицы располагались числа одного десятка.

Этапы выполнения задания

I. Результат программы не зависит от исходных данных.

II. Таблица с числами.

III. Алгоритм решения задачи.

1. Для вывода такой таблицы можно использовать два вложенных цикла. Первый будет определять количество десятков в числе, а второй — количество единиц.
2. 
Вывод значений осуществляется в цикле.
3. 
После завершения вывода одной строки таблицы необходимо перевести курсор на новую строку.

IV. Описание переменных: i, j – int.

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

Пример 5.3. Различные варианты записи заголовка цикла for:

for (int i = 0; i < n;)

for (; i * i < n; i++)

for (; ; )

for (int i = 0, j = 1;

         i < 10, j < 30;

         i++, j += 2)

Если блок проверки условия оставить пустым, то условие всегда будет считаться истинным, и цикл будет выполняться бесконечно. Поэтому он должен будет прерван каким-либо другим способом.

В последнем примере в заголовке цикла объявлены две переменные, которые по-разному меняют свои значения на каждой итерации цикла. Последний раз цикл выполнится для значений    14, j = 29  

Пример 5.4. Различные варианты записи заголовка цикла for с параметром:

for (int i = 0; i < n; i++)

for (int i = n; i < 0; i--)

for (int k = 1< m; i += 2)

for (int j = 1; j < m; i *= 3)

for (double h = 0.1; h <= 1; h += 0.01)

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

Вариант 1

int s = 0;

for (int i = 1; i < 11; i++)

  s += i;

Вариант 2

int s, i;

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

Вариант 3

for (int s = 0, i = 1;

       i <= 11; s += i, i++);

В первых двух вариантах, если после цикла записать команду    cout << s;     получим значение =  55.

Поскольку команды, находящиеся в блоке3, выполняются после выполнения тела цикла, то во втором варианте необходима лишняя итерация.

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

Пример 5.5.

V. Программа:

#include <iostream>

 

using namespace std;

 

int main()

{

  int x;

  cout << "x = ";

  cin >> x;

  for (int a = 1; a < 10; a++) {

    int c = a * x;

    cout << a << " * " << x;

    cout << " = " << c << endl;

  }

  return 0;

}

VI. Тестирование.

Пример 5.6.

VI. Программа:

#include <iostream>

 

using namespace std;

 

int main()

{

for (int i = 1; i < 10; i++) {

  for (int j = 0; j < 10; j++)

    cout << i * 10 + j << " ";

    cout << endl;

  }

  return 0;

}

 VI. Тестирование.