§ 7. Паняцце дапаможнага алгарытму

7.4. Функции, возвращающие логический результат

Дастаткова часта пры рашэнні задач узнікае неабходнасць у праверцы розных умоў. Калі ўмова не складаная, то можна выкарыстоўваць каманду галінавання. Аднак на практыцы ўмовы могуць быць дастаткова складанымі. У гэтым выпадку можна апісаць дапаможны алгарытм, які выканае праверку ўмовы і верне значэнне true ці false у залежнасці ад таго, выканана ўмова ці не.

Прыклад 7.12. Дадзены два натуральныя лікі n і m (n < m). Вывесці ўсе лікі, якія належаць адрэзку [n; m] і задавальняюць наступную ўмову: у ліку няцотная колькасць лічбаў і сума лічбаў ліку кратная 5. Прадугледзець выпадак, калі такіх лікаў няма. Праверку аднаго ліку аформіць у выглядзе падпраграмы.

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

I. Зыходныя даныя: пераменныя n і m.

II. Вынік: лікі з прамежку ад n да m, якія задавальняюць умову задачы.

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

1. Увод зыходных даных.
2. Для вызначэння наяўнасці шуканых лікаў будзем выкарыстоўваць лагічную пераменную p, папярэдне надаўшы ёй значэнне p = false.
3. У цыкле  ад n да m.

3.1. Для праверкі апішам функцыю  check, якая будзе правяраць лік. Вынікам функцыі будзе true або false
3.2. Калі лік задавльняе ўмову, то выведзем яго. 
3.3. Калі вывелі лік, то зменім значэнне пераменнай  p на true.
4. Калі пасля заканчэння цыкла значэнне пераменнай 
p засталося false, то выведзем паведамленне, што шуканых лікаў на адрэзку няма.

IV. Апісанне пераменных: n и m — int, p —  bool.

Прыклад 7.12.

V. Праграма:

#include <iostream>

using namespace std;

 

bool check(int x)

{

  int k = 0, s = 0;

  while (> 0){

    //сума лічбаў ліку

    s += x % 10;

    //колькасць лічбаў ліку

    k++;

    x /= 10;

  }

  if (% 2 !=0 && s % 5 == 0)

    return true;

  else

    return false;

}

int main()

{

  int m, n, i;

  cout << "n=";

  cin >> n;

  cout << "m=";

  cin >> m;

  bool p = false;

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

    if (check(i)){

      cout << i << " ";

      p = true;

    }

  if (!p)

    cout << "net chisel" << endl;

  return 0;

}

 

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

Паколькі функцыя для праверкі выніку мае тып bool і ўмова   bool і ўмова   (% 2 != 0 && s % 5 == 0) у камандзе галінавання з’яўляецца выразам тыпу bool, то функцыя можа быць запісана наступным чынам:

bool prov(int x)

{

  int k = 0, s = 0;

  while (> 0){

    //сума лічбаў ліку

    s += x % 10;

    //колькасць лічбаў ліку

    k++;

    x /= 10;

  }

  return (% 2 != 0 && s % 5 == 0);

}