§ 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).