§ 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] Транспонирование матрицы — операция над матрицей, когда ее столбцы становятся строками с теми же номерами.