Сярод задач пераўтварэння двухмернага масіву можна вылучыць наступныя:
- пераўтварэнне элементаў масіву ў залежнасці ад умоў;
- абмен месцамі двух радкоў;
- выдаленне радка;
- устаўка радка.
Рашэнне гэтых задач шмат у чым аналагічна рашэнню адпаведных задач для лінейнага масіву.
Прыклад 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(m, vector <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[m - 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] Транспаніраванне матрыцы — аперацыя над матрыцай, калі яе слупкі становяцца радкамі з тымі ж нумарамі.
|