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