§ 15. Двухмерныя масівы

15.3. Апрацоўка двухмерных масіваў

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

Прыклад 15.8. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Палічыць суму тых элементаў масіву, у якіх сума квадратаў нумара радка і нумара слупка роўная зададзенаму ліку x.

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

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

II.  Вынік: пераменная s (сума шуканых элементаў).

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

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

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

Прыклад 15.9. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Вызначыць, ці ёсць у масіве хоць бы адзін элемент, кратны x. Калі так, то вывесці індэксы яго месцазнаходжання.

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

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

II. Вынік: пераменныя r, с (нумары радка і слупка, у якіх знойдзены элемент) або паведамленне «не знойдзены».

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

1. Увод зыходных даных. Масіў запаўняецца выпадковымі лікамі. 
2. Вызначэнне пачатковага значэння для шуканых індэксаў (r = -1, c = -1). 
3. Праверка бягучага элемента. Калі ён задавальняе ўмову, то мяняем значэнні r і c
4. Вывад выніку. Калі пераменныя r і c не змяніліся, то выводзім паведамленне, што элемент не знойдзены, інакш выводзім іх значэнні.

IV. Апісанне пераменных: n, x, r, c – int, d – vector<vector <int>>

Калі ў масіве некалькі элементаў, якія задавальняюць умову задачы, то будзе выведзены апошні знойдзены элемент. Калі патрэбны першы элемент, то можна ўвесці дадатковую пераменную-флаг, якая будзе роўная true, пакуль значэнні r і c не змяніліся. Пасля іх змянення яна стане false і значэнні r і c больш змяняцца не будуць (прыклад 15.10).

Прыклад 15.11. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Знайсці мінімальны і максімальны элементы і вывесці індэксы іх месцазнаходжання.

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

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

II. Вынік: пераменныя r_min, c_min, r_max, c_max — нумары радка і слупка, у якіх знойдзены элемент.

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

1. Увод зыходных даных. Масіў запаўняецца выпадковымі лікамі.
2. Вызначэнне пачатковага значэння для шуканых індэксаў
 (r_min = 0, c_min = 0, r_max = 0, c_max = 0).
3. Правяраем бягучы элемент. Калі ён большы за бягучы максімальны, то змяняем значэнні
 r_max, c_max.
4. Правяраем бягучы элемент. Калі ён меншы за бягучы мінімальны, то змяняем значэнні
 r_min, c_min.
5. Вывад выніку
.

IV. Апісанне пераменных: n, m, n_min, c_min, r_max, c_max – int, d – vector<vector <int>>

Калі ў масіве некалькі элементаў, роўных максімальнаму (мінімальнаму), то будзе выводзіцца месцазнаходжанне першага з такіх элементаў. Калі трэба атрымаць месцазнаходжанне апошняга, то дастаткова замяніць знак «>» («<») на «>=» («<=»).

Прыклад 15.8.

V. Праграма:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int m, n;

  cout << "kol-vo strok m=";

  cin >> m;

  cout << "kol-vo stolbcov n=";

  cin >> n;

  cout << "elementy" << endl;

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

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

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

      cin >> d[i][j];

  int x;

  cout << "x = ";

  cin >> x;

  int s = 0;

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

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

      if (* i + j * j == x)

        s += d[i][j];

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

  return 0;

}

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

VII. Аналіз вынікаў. Будуць падсумаваны элементы, якія маюць нумары [1][2] і [2][1] (яны вылучаны).

У матэматыцы для матрыцы вызначаны паняцці галоўная дыяганаль і пабочная дыяганаль. На галоўнай дыяганалі знаходзяцца элементы матрыцы d[i][j], для якіх правільная ўмова i = j. Для элементаў пабочнай дыяганалі: i + j = n – 1 (n — число столбцов, нумерация с 0).

Прыклад 15.9.

V. Праграма:

#include <iostream>

#include <vector>

#include <ctime>

#include <cstdio>

 

using namespace std;

 

int main()

{

  srand(time(NULL));

  int m, n;

  cout << "kol-vo strok m=";

  cin >> m;

  cout << "kol-vo stolbcov n=";

  cin >> n;

  cout << "elementy" << endl;

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

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

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

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

      cout << d[i][j] << " ";

    }

    cout << endl;

  }

  int x;

  cout << "x = ";

  cin >> x;

  int r = -1, c = -1;

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

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

      if (d[i][j] % x == 0){

        r = i;

        c = j;

      }

  if (== -1 && c == -1)

    cout << "ne naiden";

  else {

    cout << d[r][c];

    cout << " naiden na meste ";

    cout << r << " " << c;

  }

  cout << endl;

  return 0;

}

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

Прыклад 15.10. Фрагмент праграмы:

bool f = true;

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

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

    if (&& d[i][j] % x == 0){

      r = i;

      c = j;

       = false;

    }

Прыклад 15.11.

V. Праграма:

#include <iostream>

#include <vector>

#include <ctime>

#include <cstdio>

 

using namespace std;

 

int main()

{

  srand(time(NULL));

  int m, n;

  cout << "kol-vo strok m=";

  cin >> m;

  cout << "kol-vo stolbcov n=";

  cin >> n;

  cout << "elementy" << endl;

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

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

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

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

      cout << d[i][j] << " ";

    }

    cout << endl;

  }

  int r_min = 0, c_min = 0;

  int r_max = 0, c_max = 0;

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

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

      if (d[i][j] > d[r_max][c_max]){

       r_max = i;

       c_max = j;

     }

     if (d[i][j] < d[r_min][c_min]){

       r_min = i;

       c_min = j;

    }

  }

  cout << "max = " << d[r_max][c_max];

  cout << " naiden na meste ";

  cout << r_max << " " << c_max;

  cout << endl;

  cout << "min = " << d[r_min][c_min];

  cout << " naiden na meste ";

  cout << r_min << " " << c_min;

  cout << endl;

  return 0;

}

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