§ 17. Масівы і структуры як параметры функцый

17.3. Пошук зададзенага элемента ў шматмерным масіве

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

Прыклад 17.6. Зададзены двухмерны масіў a з m радкоў і n слупкоў. Атрымаць лінейны масіў b, у якім b[i] — сума элементаў i-га радка масіву a, кратных 3.

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

 I. Зыходныя даныя: пераменныя n і m — колькасць радкоў і слупкоў у масіве а, a — двухмерны масіў.

 II. Вынік: лінейны масіў b.

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

  1. Увод зыходных даных. Элементы масіву згенерыраваны выпадковым чынам.
  2. Для апрацоўкі асобнага радка створым функцыю, якая вылічвае суму элементаў лінейнага масіву, кратных тром.
  3. У цыкле выклічам функцыю для кожнага радка.
  4. Вывад выніку. Для вываду лінейнага масіву выкарыстоўваецца функцыя print. Яна ж выкарыстоўваецца для вываду радкоў двухмернага масіву.

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

Прыклад 17.7. Зададзены двухмерны масіў a з m радкоў і n слупкоў. Вывесці нумары радкоў, элементы якіх утвараюць узрастаючую паслядоўнасць. Калі такіх радкоў у масіве няма, то ўвесці адпаведнае паведамленне.

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

I.Зыходныя даныя: пераменныя n і m — колькасць радкоў і слупкоў у масіве а, a — двухмерны масіў.

II. Вынік: нумары радкоў і паведамленне, што радкоў няма.

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

  1. Увод зыходных даных. Элементы масіву згенерыраваны выпадковым чынам.
  2. Для апрацоўкі асобнага радка створым функцыю, якая правярае, ці ўтвараюць яго элементы ўзрастаючую паслядоўнасць.

2.1. Элементы ўтвараюць узрастаючую паслядоўнасць, калі кожны наступны большы за папярэдні. 
2.2. Калі для якой-небудзь пары элементаў умова не выканалася, далейшую праверку спынім.


  1. У цыкле выклічам функцыю для кожнага радка і праверым вынік.
  2. Вывад выніку. Створым пераменную-флаг, якая спачатку будзе мець значэнне true. Калі які-небудзь нумар радка будзе выведзены, то зменім значэнне гэтай пераменнай. Калі пераменная-флаг не памяняла свайго значэння, то радкі не знойдзены.
IV. Апісанне пераменных: n, m – int, a –  vector<vector<int>>, b – vector<int>.

Прыклад 17.6.

V.  Праграма:

#include <iostream>

#include <vector>

#include <cstdlib>

#include <ctime>

 

using namespace std;

 

void print(vector<int> &d)

{

  for (int i = 0; i < d.size(); i++){

    cout.width(5);

    cout << d[i];

  }

  cout<<endl;

}

 

int sum3(vector<int> &d)

{

  int s = 0;

  for (int i = 0; i < d.size(); i++)

    if (d[i] % 3 == 0)

      s += d[i];

  return s;

}

 

int main()

{

  srand(time(NULL));

  int m, n;

  cout << "m, n" << endl;

  cin >> m >> n;

  vector <vector <int>> a(m, vector <int> (n));

  vector <int> b(m);

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

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

      a[i][j] = rand () % 100;

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

    print(a[i]);

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

    b[i] = sum3(a[i]);

  cout << "rez" << endl;

  print(b);

  return 0;

}

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

Прыклад 17.7.

 V. Праграма:

#include <iostream>

#include <vector>

#include <cstdlib>

#include <ctime>

#include <iomanip>

 

using namespace std;

 

bool check(vector<int> &d)

{

  for (int i = 0; i < d.size() - 1; i++)

  if (d[i] >= d[+ 1])

    return false;

  return true;

}

 

int main()

{

  srand(time(NULL));

  int m, n;

  cout << "m, n" << endl;

  cin >> m >> n;

  vector <vector <int>> a(m, vector <int> (n));

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

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

      a[i][j] = rand () % 100;

      cout << setw(5) << a[i][j];

    }

    cout << endl;

  }

  bool f = true;

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

    if (check(a[i])){

      cout << i << " ";

      f = false;

    }

  if (f)

    cout << "net strok" << endl;

  return 0;

}

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