Десятое занятие по C++: многомерные массивы

Что же такое матрица?

Ты уже знаешь что можно создавать массивы любого типа. Мы работали с массивами типа int, строками, т.е. массивами char. А нельзя ли создать массив массивов? С первого взгляда это звучит достаточно странно. Но на самом деле все просто: у нас будет массив указателей, каждый из которых будет указывать на массив типа int. Указатель на указатель. Такое бывает 🙂

Массив состоящий из массивов называется двумерным массивом или матрицей.

Если речь идет о статической матрице (матрице в стеке или статической памяти), то все достаточно просто:

int matr[100][100];

for (int i=0; i<100; i++)
{
   for (int j=0; j<100; j++) 
   {
        cin>>matr[i][j];
   }
}

Этот код заполняет матрицу размером 100 на 100. Так же как и обычный массив она начинает с элемента matr[0][0] и заканчивается matr[99][99].

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

Динамическое выделение памяти под матрицу

По скольку матрица это не совсем обычный массив, а массив массивов, то с выделением памяти будет не все так просто. Давай разбираться:

int ** matr; //создаем указатель на указатель на int
int n,m;

cin>>n>>m; //вводим размер с клавиатуры

matr = new int* [n]; //выделяем n элементов типа указатель на int (а не просто int, как с обычным массивом)

for (int i=0; i<n; i++)
{
   matr[i] = new int[m]; в каждый элемент выделяем m элементов типа int (то есть выделяем обычный массив из m элементов)
} 

//Наша матрица n на m готова! :)

Передача матрицы в функцию

Для статических:

#include <iostream>

void func(int matr[100][100], int i, int j)
{

}

int main()
{
   int matr[100][100];
   func(matr,100,100);
}

Для динамических:

#include <iostream>

void func(int ** matr, int i, int j) // int** - указатель на указатель
{

}

int main()
{
   int ** matr;
   //инициализируем как в предыдущем пункте
   func(matr,100,100);
}

Многомерные массивы.

Если мы можем создать массив массивов, т.е. таблицу, можем ли мы создать, скажем, куб данных? А почему нет? Трехмерный массив:

int elem[100][100][100];

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

Задачи для самостоятельного решения.

7.1. Сделать функции ввода, вывода числовой матрицы, поиска максимального элемента в ней. (5 баллов)

7.2. Сделать сортировку матрицы по строкам. Меняем две строки местами, если сумма в одной больше суммы элементов в другой. (5 баллов)

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *