- •Тема 9. Матрицы Понятие матрицы
- •Матрицы в программировании
- •Инициализация матрицы
- •Вывод матрицы на экран
- •Вывод ровных столбцов матрицы
- •Заполнение матрицы
- •Работа с матрицей заранее не известного размера
- •Немного о генерации псевдослучайных чисел
- •Заполнение матрицы случайными числами
- •Обработка матрицы
- •Заполнение матрицы с условием
- •Обработка строк и столбцов по отдельности
- •Комбинированная обработка матрицы
Тема 9. Матрицы Понятие матрицы
Матрицы активно используются в математике, программировании, экономике и многих других науках и сферах человеческой деятельности. Работа с матрицами обычно реализуется при помощи вложенных циклов в явном виде: внутренний цикл не выносится в отдельную функцию, поскольку сама структура матрицы, можно сказать, требует использования вложенных циклов.
Понятие матрицы можно давать по-разному в зависимости от того, где эта матрица используется. Наиболее просто матрицу M на N можно определить как таблицу, состоящую из M строк и N столбцов, причём все элементы матрицы имеют один и тот же тип. Для обращения к определённому элементу матрицы указывается название матрицы, а также номера строки и столбца. Например, запись Aij означает элемент матрицы A, расположенный в i-ой строке и j-ом столбце.
Матрицы в программировании
С точки зрения программирования матрица представляет собой двумерный массив M на N. Для объявления матрицы используется следующая запись:
int matrix[100][200];
float coefficients[10][100];
char strings[100][20];
bool flags[50][50];
Числа указывают на то, сколько строки и столбцов будет содержать матрица. В качестве размера матрицы, как и в случае с одномерным массивом, следует указывать константы, а не переменные, поэтому следующий фрагмент код является ошибочным:
int m=10, n=20;
//Ошибка!
int matrix[m][n];
В то же время следующий фрагмент верен:
const int m=10, n=20;
int matrix[m][n];
Теперь рассмотрим, как работать с матрицами: заполнять матрицу, выводить её на экран, обращаться к её элементам.
Инициализация матрицы
Во-первых, присвоить значение матрицы можно в момент объявления, другими словами, произвести её инициализацию:
const int m = 4, n = 5;
int matrix[m][n] = {
{1, 2, 5, 4, 3},
{5, 6, 7, 4, 6},
{1, 2, 5, 4, 3},
{9, 8, 7, 6, 0},
};
Обратите внимание на то, что строки заключаются в фигурные скобки и разделяются запятыми. Запятыми также разделяются элементы каждой строки, а в конце ставится точка с запятой.
Вывод матрицы на экран
Для вывода матрицы на экран нужно вывести элементы каждой строки и каждого столбца, причём элементы разных строк матрицы должны быть расположены на разных строках и на экране. Таким образом, необходимо сделать следующее:
<Вывести первую строку>
cout << endl;
<Вывести вторую строку>
cout << endl;
<Вывести третью строку>
cout << endl;
<Вывести четвёртую строку>
cout << endl;
Вспомним, что индексы массива нумеруются с нуля, поэтому строки и столбцы матрицы также нумеруются с нуля. Значит, вывод матрицы можно произвести так:
for (int j=0; j<n; j++) {
cout << matrix[0][j] << " ";
}
cout << endl;
for (int j=0; j<n; j++) {
cout << matrix[1][j] << " ";
}
cout << endl;
for (int j=0; j<n; j++) {
cout << matrix[2][j] << " ";
}
cout << endl;
for (int j=0; j<n; j++) {
cout << matrix[3][j] << " ";
}
cout << endl;
Здесь элементы одной строки при выводе на экран разделены пробелами. Наконец, заметим, что данные четыре цикла различаются только номером строки, поэтому их можно поместить во внешний цикл, в котором переменная-счётчик будет означать номер строки (за номер столбца отвечает переменная-счётчик внутреннего цикла):
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
Результат работы этой программы выглядит так:
Обратите особое внимание на то, что пробел выводится во внутреннем цикле, а перенос на новую строку – во внешнем. Для лучшего понимания данного вопроса поэкспериментируйте с этими разделителями.