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

15.4. Пераўтварэнне двухмерных масіваў

Сярод задач пераўтварэння двухмернага масіву можна вылучыць наступныя:

  • пераўтварэнне элементаў масіву ў залежнасці ад умоў;
  • абмен месцамі двух радкоў;
  • выдаленне радка;
  • устаўка радка.

Рашэнне гэтых задач шмат у чым аналагічна рашэнню адпаведных задач для лінейнага масіву.

Прыклад 15.12. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Памяняць радкі ў матрыцы: першы з апошнім, другі з перадапошнім і г. д. Напрыклад:

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

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

II. Вынік: пераўтвораны масіў.

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

1. Увод зыходных даных (з файла). 
2. У цыкле да паловы ад колькасці радкоў мяняем месцамі два элементы лінейнага масіву. 
3. Для абмену месцамі двух радкоў выкарыстоўваем метад swap.
4. Вывад выніку (у файл).

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

Прыклад 15.13. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Выдаліць у ім слупкі з нумарамі ад k1 да k2.

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

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

II.  Вынік: пераўтвораны масіў.

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

1. Увод зыходных даных (з файла).
2. Ствараем масіў b, які будзе захоўваць у транспаніраваным выглядзе наш зыходны масіў. У ім будзем працаваць з радкамі. 
3. Выкарыстоўваючы метад erase, выдалім дыяпазон даных, вызначаны ітэратарамі b.begin() + k1 і b.begin() + k2 + 1 (слупок k2 таксама трэба выдаліць, таму +1). 
4. Вывад выніку (у файл). Для карэктнага вываду трэба памяняць месцамі цыклы, якія вызначаюць радок і слупок.

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

Пры захоўванні двухмернага вектара ў памяці камп’ютара яго радкі запісваюцца паслядоўна, адзін за адным. Такое захоўванне не дазваляе ў яўным выглядзе вылучыць слупок матрыцы. Калі ўзнікае неабходнасць апрацоўкі двухмернага масіву «па слупках», то можна ствараць  і выкарыстоўваць транспаніраваную [1]  матрыцу.

Прыклад 15.12

V. Праграма:

#include <iostream>

#include <fstream>

#include <vector>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  ofstream fout ("output.txt");

  int m, n;

  fin >> m >> n;

  vector <vector <int>> d(mvector <int> (n));

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

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

      fin >> d[i][j];

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

    d[i].swap(d[- i - 1]);

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

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

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

    fout << endl;

  }

  return 0;

}

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

           

Прыклад 15.13.

 V. Праграма:

#include <iostream>

#include <fstream>

#include <vector>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  ofstream fout ("output.txt");

  int m, n;

  fin >> m >> n;

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

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

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

      fin >> d[i][j];

  ///транспонирование

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

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

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

      b[j][i] = d[i][j];

  int k1, k2;

  fin >> k1 >> k2;

  b.erase(b.begin() + k1, 
         b
.begin() + k2 + 1);

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

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

      fout << b[i][j] << " ";

    fout << endl;

  }

  return 0;

}

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

  



[1Транспаніраванне матрыцы — аперацыя над матрыцай, калі яе слупкі становяцца радкамі з тымі ж нумарамі.