§ 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. Зыходныя даныя:  (уведзены лік).

II. Вынік: 9 радкоў выгляду .

III. Алгарытм рашэння задачы.

  1. Увод зыходных значэнняў.
  2. Значэнне пераменнай a змяняецца ў цыкле ад 1 да 9.
  3. Значэнне пераменнай c = a × x.
  4. Паколькі колькасць паўтарэнняў загадзя вядомая, выкарыстаем цыкл for.
  5. Вывад значэнняў ажыццяўляецца ў цыкле.
  6. Апісанне пераменных: x, a, c – int.

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

Этапы выканання задання

I. Вынік праграмы не залежыць ад зыходных даных.

II. Табліца з лікамі.

III. Алгарытм рашэння задачы.

  1. Для вываду такой табліцы можна выкарыстоўваць два ўкладзеныя цыклы. Першы будзе вызначаць колькасць дзясяткаў у ліку, а другі — колькасць адзінак.
  2. Вывад значэнняў ажыццяўляецца ў цыкле.
  3. Пасля завяршэння вываду аднаго радка табліцы неабходна перавесці курсор на новы радок.
  4. Апісанне пераменных: 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)

Калі блок праверкі ўмовы пакінуць пустым, то ўмова заўсёды будзе лічыцца праўдзівай і цыкл будзе выконвацца бясконца. Таму ён павінен будзе быць перапынены якім-небудзь іншым спосабам.

У апошнім прыкладзе ў загалоўку цыкла абвешчаны дзве пераменныя, якія па-рознаму змяняюць свае значэнні на кожнай ітэрацыі цыкла. Апошні раз цыкл выканаецца для значэнняў   i = 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; i <= 11; 
     s += i, i++);

Варыянт 3

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

У першых двух варыянтах, калі пасля цыкла запісаць каманду

   cout << s;  

атрымаем значэнне s = 55

 Паколькі каманды, змешчаныя ў блоку3, выконваюцца пасля выканання цела цыкла, то ў другім варыянце неабходна лішняя ітэрацыя.

У трэцім варыянце вывесці значэнне пераменнай s не атрымаецца, паколькі яе вобласць бачнасці абмежавана цыклам і яе значэнне за межамі цыкла недаступна.

Прыклад 5.5.

I. Праграма:

#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;

}

II. Тэсціраванне.

Прыклад 5.6.

V. Праграма:

#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.  Тэсціраванне.