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

5.2. Оператор цикла с постусловием

Цикл, в котором условие для завершения работы проверяется после выполнения тела цикла, в С++ записывается следующим образом:

do {

  тело цикла;

}

while (<условие>);

Цикл работает, пока условие истинно, и прекращает работу, когда условие становится ложным. Этот цикл называют циклом с постусловием, так как проверка условия осуществляется после выполнения тела цикла. Использовать цикл do...while лучше в тех случаях, когда команды в теле цикла должны выполниться хотя бы один раз, либо когда внутри тела цикла происходит инициализация переменных, участвующих в проверке условия окончания его работы.

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

Пример 5.2. Написать программу, которая будет генерировать случайные числа из промежутка [1; x] до тех пор, пока не будет сгенерировано число, кратное k. Вывести это число и количество сгенерированных чисел. Значения k и x вводятся (k < x).

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

I. Исходные данные: числа k и r.

II. Результат: r (искомое число) и n (количество чисел).

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

1. Ввод исходных значений.
2. 
Инициализация счетчика n = 0.
3.
Поскольку нам известно условие окончания цикла — получить число, кратное k, то будем использовать цикл с постусловием. Условие можно записать так: (r % k). Если значение этого выражения не равно нулю, то условие истинно.

3.1. Генерируем случайное число r. В С++ для этого используется функция rand(), которая генерирует случайное число в промежутке [0; 32767). Это число будет использоваться в условии проверки окончания работы цикла.
3.2. Чтобы случайное число попало в промежуток [1; x], найдем остаток от деления на x числа, сгенерированного функцией rand(), и прибавим к нему 1.
3.3. Увеличим значение счетчика на 1.

4. Вывод результата.

IV. Описание переменных: n, k, x — int.

Числа, сгенерированные функцией rand(), называют псевдослучайными, поскольку при каждом запуске программы будет сгенерирована одна и та же последовательность чисел. Каждое новое число в последовательности генерируется по определенному алгоритму из предыдущего. Первое число в этой последовательности — константа, известная компилятору. Такой подход удобен для отладки программы. Однако для получения результатов необходимо при каждом запуске получать другие числа. Функция srand(n) из библиотеки cstdlib позволяет изменить первое число в последовательности в зависимости от значения параметра n. Однако, если значение n является константой, то последовательность чисел изменится по отношению к начальной, но не будет меняться при новых запусках программы. Если в качестве значения n взять системное время (функция time(NULL) из библиотеки ctime), то при каждом запуске программы будем получать новую последовательность случайных чисел.

Пример 5.2.

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

#include <iostream>

#include <cstdlib>

#include <ctime>

 

using namespace std;

 

int main()

{

  srand(time(NULL));

  int x, k;

  cout << "vvedi x, k" << endl;

  cin >> x >> k;

  int r, n = 0;

  do {

    r = rand() % x + 1;

    n++;

  }

  while (% k);

  cout << "r = " << r << endl;

  cout << "chisel - " << n << endl;

  return 0;

}

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

VII. Поскольку числа генерируются случайно, то для одних и тех же исходных данных могут получаться различные результаты (тесты 2—4)