Модуль: Практикум по изучению С++


8. Конспект 8. Двумерные массивы.


Оглавление

Часть 1 Часть 2 Задачи  
       
       

С++. Двумерные массивы. Часть 1

Рассмотрим работу с таблицами в языке C++. Под таблицей подразумевается набор из n×mn×m элементов, причём они структурированы в n строк, в каждой из которых по m элементов. К каждому элементу таблицы можно обратиться по номеру его строки и столбца.

Например, рассмотрим таблицу из 5 строк и 6 столбцов, заполненную числами от 0 до 29 по порядку:

0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
 

Тогда значение элемента таблицы, расположенного на второй строке в третьем столбце, — 15 (строки и столбцы таблицы нумеруются с нуля).

Для работы с таблицами в языке C++ используют двумерные массивы. Мы будем их реализовывать через уже знакомый контейнер vector. Создадим таблицу как «вектор векторов»:

vector<vector<int> > t(n, vector<int> (m, 0)); 

В результате появится таблица tt из nn строк и mm столбцов, заполненная нулями.

Заполним таблицу числами по порядку:

    int c = 0;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            t[i][j] = c;
            ++c;
        }
    }

Заметим, что можно заполнить таблицу, не используя переменную cc, с помощью формулы:

t[i][j] = i * m + j;

Выведем полученную таблицу на экран:

    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            cout << t[i][j] << " ";
        }
        cout << endl;
    }

Задача о заполнении таблицы змейкой

Необходимо заполнить таблицу змейкой: строки с чётными номерами заполняем слева направо, а строки с нечётными — справа налево. Например, для таблицы размером 5×6 заполнение змейкой выглядит так:

0 1 2 3 4 5
11 10 9 8 7 6
12 13 14 15 16 17
23 22 21 20 19 18
24 25 26 27 28 29
 

Решение

#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int> > t(n, vector<int> (m));
    int now = 0;
    for (int i = 0; i < t.size(); ++i){ // количество строк таблицы — t.size()
       if (i % 2 == 0){
          for (int j = 0;j < t[i].size(); ++j){ //количество элементов на i-й строке — t[i].size()
              t[i][j] = now;
              ++now;
          }
       }
       else{
          for (int j = t[i].size() - 1;j >= 0; --j){
              t[i][j] = now;
              ++now;
          }
       }
    }
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cout << t[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

С++. Двумерные массивы. Часть 2

Задача об обмене столбцов таблицы

Дана таблица размером n×mn×m. Необходимо поменять местами столбцы с номерами p и q.

Решение

#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    int n, m, p, q;
    cin >> n >> m >> p >> q;
    vector<vector<int> > t(n, vector<int> (m));
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cin >> t[i][j];
        }
    }
    for (int i = 0; i < n; ++i){
        swap(t[i][p], t[i][q]);
    }
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cout << t[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
 

Задача о симметричной таблице

Необходимо проверить, симметрична ли квадратная таблица относительно главной диагонали. Пример симметричной таблицы:

1 2 3 4
2 3 1 2
3 1 5 9
4 2 9 0
 

Решение

#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    vector<vector<int> > t(n, vector<int> (n));
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cin >> t[i][j];
        }
    }
    bool issym = true;
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < i; ++j){
             if (t[i][j] != t[j][i]){
                issym = false;
             }
        }
    }
    if (issym){
        cout << "YES" << endl;
    }
    else{
        cout << "NO" << endl;
    }
    return 0;
}

Задачи для тренировки

1) Сверху вниз, слева направо

 
2) Шахматная доска  
3) Максимум  
4) Транспонировать квадратную матрицу  
5) Поменять местами две диагонали  
6) Кинотеатр  
7) Золото  

time 1000 ms
memory 256 Mb

Комментарий учителя