§ 11. Структураваны тып даных масіў

11.5. Рашэнне задач з выкарыстаннем масіваў

Аперацыі, якія выконваюцца з элементамі масіву, адпавядаюць аперацыям, якія выконваюцца над базавым тыпам элементаў масіву (прыклад 11.23).

Прыклад 11.24. Зададзены аднамерны масіў з цэлых лікаў. Знайсці суму і здабытак элементаў гэтага масіву.

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

I. Зыходныя даныя: масіў a і колькасць элементаў n.

II. Вынік: сума элементаў і— здабытак элементаў масіву.

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

1. Увод зыходных даных. Масіў уводзіцца паэлементна з клавіятуры. 
2. Вызначэнне пачатковага значэння для сумы (s = 0) і для здабытку (p = 1).
3. У цыкле дабаўляем чарговы элемент масіву да сумы і да здабытку.
4. Вывад выніку.

IV. Апісанне пераменных: n, s, p — int, a – vector <int>.

Прыклад 11.25. Адзнакі па інфарматыцы за першую чвэрць для ўсіх навучэнцаў 10 «Б» класа запісаны ў тэкставым файле (першы лік у файле паказвае колькасць навучэнцаў). Паспяховасць у класе будзем лічыць добрай, калі сярэдні бал большы за 7, дрэннай — калі сярэдні бал ніжэйшы за 4, у астатніх выпадках паспяховасць сярэдняя. Вызначыць паспяховасць класа па зададзеных адзнаках.

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

I. Зыходныя даныя: масіў a для захоўвання адзнак і колькасць навучэнцаў n

II. Вынік — адно са слоў: «добрая», «сярэдняя», «дрэнная» ў залежнасці ад значэння сярэдняга бала.

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

1. Увод зыходных даных. Спачатку ўводзім колькасць навучэнцаў у класе, затым масіў адзнак.
2. Для вызначэння паспяховасці трэба вылічыць сярэдні бал (пераменная sr). Сярэдні бал вызначаецца як сума (пераменная s) усіх адзнак, падзеленая на колькасць навучэнцаў у класе. Пачатковае значэнне для сумы — s = 0.
3. У цыкле дабаўляем чарговы элемент масіву да сумы.
4. Дзелім атрыманую суму на колькасць навучэнцаў у класе.
5. Правяраем значэнне сярэдняга бала і выводзім вынік.

IV. Апісанне пераменных: n, s, p – int, sr – double, a – vector <int>.

Прыклад 11.26. Зададзены натуральны лік n (1 < n < 5000)Вызначыць, ці з’яўляецца гэты лік простым.

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

I. Зыходныя даныя: n — натуральны лік.

II. Вынік: вывад паведамлення «просты» ці «састаўны».

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

1. Увод зыходных даных. 
2. Вядома, што лік n з’яўляецца простым, калі ён не падзяляецца ні на адзін просты лік, не большы за begin mathsize 16px style square root of straight n end style. Максімальны лік па ўмове — 5000, begin mathsize 16px style square root of 5000 space almost equal to space 70 comma 7107 end style. Створым масіў канстант s_n простых лікаў, не большых 71. 
3. У цыкле будзем дзяліць лік n на кожны з лікаў, не большых за  begin mathsize 16px style square root of straight n end style, якія захоўваюцца ў масіве канстант. Калі лік n не падзяліўся ні на адзін з іх, то лік n — просты, інакш — састаўны. 
4. Правяраем, з якой умовай скончыў работу цыкл: лік з’яўляецца простым, калі апошні прагледжаны элемент масіву большы за  begin mathsize 16px style square root of straight n end style (лік ні на што не падзяліўся).
5. Вывад выніку.

IV. Апісанне пераменных: n, — int, s_n – vector <int>.

Прыклад 11.23. Аперацыі над базавым тыпам.

  • Калі базавым тыпам элементаў масіву з’яўляецца тып int, то для элементаў дапушчальныя наступныя аперацыі: +, –, *, /, %.
  • Калі ў масіве захоўваюцца лікі тыпу double, то дапушчальнымі будуць аперацыі +, –, *, /. 
  • Калі ў масіве захоўваюцца радкі, то для кожнага яго элемента даступныя радковыя функцыі.

Прыклад 11.24.

V. Праграма:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int n;

  cout << "vvedi n=";

  cin >> n;

  vector <int> a(n);

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

    cin >> a[i];

  int s = 0;

  int p = 1;

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

    s += a[i];

    p *= a[i];

  }

  cout << "proizvedenie=" << p;

  cout << " summa=" << s << endl;

  return 0;

}

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

Прыклад 11.25.

V. Праграма:

#include <iostream>

#include <fstream>

#include <vector>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  setlocale(0, "");

  int n;

  fin >> n;

  vector <int> a(n);

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

    fin >> a[i];

  int s = 0;

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

    s += a[i];

  double sr = 1. * s / n;

  cout << "sr = " << sr << endl;

  if (sr > 7)

    cout << "хорошая" << endl;

  else

    if (sr < 4)

      cout << "плохая" << endl;

    else

      cout << "средняя" << endl;

  return 0;

}

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

Прыклад 11.26.

Умова s_n[i] <= sqrt(n) правяраецца доўга за кошт выкліку функцыі sqrt(n) і пераходу да вылічэнняў с рэчыўным тыпам даных. Гэту ўмову звычайна замяняюць эквівалентным: s_n[i]*s_n[i] <= n.

V. Праграма:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  vector <int> s_n = {2, 3, 5, 7, 11, 
  13, 17, 19, 23, 29, 31, 37, 41, 43, 
  47, 53, 59, 61, 67, 71};

  int n;

  cout << "n = ";

  cin >> n;

  int i = 0;

  while (s_n[i] * s_n[i] <= n

         && n % s_n[i])

    i++;

  if (s_n[i] * s_n[i] > n)

    cout << "prostoe" << endl;

  else

    cout << "sostavnoe" << endl;

  return 0;

}

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

Аналіз вынікаў. Праверыць правільнасць вылічэнняў можна на калькулятары або паглядзець у табліцы простых лікаў [1].


[1] Тэхнічныя табліцы — http://tehtab.ru/guide/guidemathematics/guidemathematicsfigurestables/simplefigures/
(дата доступу: 28.07.2020)