Глава 6
Статические и динамические матрицы
Данная глава посвящена обработке матриц в С++. На большом количестве
примеров будут рассмотрены возможности языка для обработки статических и
динамических матриц. В завершающем параграфе будет рассмотрено исполь-
зование двойных указателей и функций на примере решения задач линейной
алгебры.
6.1
Статические матрицы С(С++)
Матрица — это двумерный массив, каждый элемент которого имеет два ин-
декса: номер строки — i, номер столбца — j.
Статический двумерный массив (матрицу) можно объявить так:
тип имя_переменной [n][m];
где тип определяет тип элементов массива, имя_переменной — имя матрицы,
n — количество строк, m — количество столбцов в матрице. Строки нумеруются
от 0 до n − 1, столбцы — от 0 до m − 1.
Например,
double x[20][35];
Описана матрица вещественных чисел x, состоящая из 20 строк и 35 столбцов
(строки нумеруются от 0 до 19, столбцы от 0 до 34).
Как и любой другой переменной, матрице можно присвоить начальное зна-
чение, например int A[2][3]={{1,2,3}, {4,5,6}};
Для обращения к элементу матрицы необходимо указать её имя, и в квад-
ратных скобках номер строки, а затем в квадратных скобках — номер столбца.
Например, x[2][4] — элемент матрицы x, находящийся в третьей строке и пятом
столбце
1
.
Для работы с элементами матрицы необходимо использовать два цикла. Для
построчной обработки матрицы значениями параметра первого (внешнего) цик-
ла будут номера строк матрицы, значениями параметра второго (внутреннего)
1
Напоминаем, что нумерация строк и столбцов идёт с 0.
186
Глава 6. Статические и динамические матрицы
цикла — номера столбцов (см. рис. 6.1). При построчной обработке матрицы
вначале поочерёдно рассматриваются элементы первой строки (столбца), затем
второй и т.д. до последней. Если необходимо обрабатывать матрицу по столб-
цам, то необходимо организовать внешний цикл по столбцам, а внутренний по
строкам (см. рис. 6.2).
6.2
Динамические матрицы
В предыдущем параграфе мы рассмотрели описание статических матриц, в
этом случае память для хранения матрицы выделяется в момент описания. Од-
нако в С++ существует возможность создавать динамические матрицы. Дина-
мические матрицы можно создавать с использованием обычных указателей и с
помощью двойных указателей. Рассмотрим оба способа работы с динамическими
матрицами последовательно.
Рис. 6.1: Блок-схема построчной об-
работки матрицы
Рис. 6.2: Блок-схема обработки мат-
рицы по столбцам
6.2.1
Использование указателей для работы с динамическими
матрицами
При работе с динамическими матрицами можно использовать обычные ука-
затели. После описания указателя необходимо будет выделить память для хра-
нения N × M элементов (N — число строк, M — число столбцов). Рассмотрим
в качестве примера выделение памяти для хранения целочисленной матрицы
размером N × M.
i n t ∗A, N, M;
A=( i n t ∗ ) c a l l o c (N∗M, s i z e o f ( i n t ) ) ;
Для выделения памяти можно использовать также и функцию malloc
A=( i n t ∗ ) m a l l o c (N∗M∗ s i z e o f ( i n t ) ) ;
или операцию new
A=new i n t [N∗M] ;
Программирование на языке С++ в среде Qt Creator
6.3. Обработка матриц в С(С++)
187
Память мы выделили, осталось найти способ обратиться к элементу матри-
цы. Все элементы матрицы хранятся в одномерном массиве размером N × M
элементов. Сначала в этом массиве расположена 0-я строка матрицы, затем 1-я
и т.д. Поэтому для обращения к элементу A[i][j] необходимо по номеру строки
i и номеру столбца j вычислить номер этого элемента k в динамическом массиве.
Учитывая, что в массиве элементы нумеруются с нуля, k = iM + j. Обращение
к элементу A[i][j] будет таким: *(A+i*M+j) или A[i*M+j].
6.2.2
Использование двойных указателей для работы с
динамическими матрицами
Основной способ работы с динамическими матрицами базируется на исполь-
зовании двойных указателей. Рассмотрим следующий фрагмент программы.
i n t main ( )
{
i n t N,M;
f l o a t ∗∗ a ;
a=new f l o a t ∗ [N ] ;
}
С помощью оператора new создан массив из n элементов
2
, в котором каждый
элемент является адресом, где хранится указатель (фактически каждый указа-
тель — адрес строки матрицы). Осталось определить значение элементов масси-
ва. Для этого организуем цикл (переменная цикла i изменяется от 0 до N − 1),
в котором будет выделяться память для хранения очередной строки матрицы.
Адрес этой строки будет записываться в a[i].
f o r ( i =0; i a [ i ]=new f l o a t [M] ;
После этого определён массив N указателей, каждый из которых адресует
массив из M чисел (в данном случае вещественных типа float). Фактически
создана динамическая матрица размера N × M. Обращение к элементу динами-
ческой матрицы идёт так же, как и к элементу статической матрицы. Для того,
чтобы обратиться к элементу a
i,j
в программе на C++, необходимо указать его
имя, и в квадратных скобках номер строки и столбца (a[i][j]).
6.3
Обработка матриц в С(С++)
Рассмотрим основные операции, выполняемые над матрицами (статическими
и динамическими) при решении задач.
Матрицы, как и массивы, нужно вводить (выводить) поэлементно. Блок-
схема ввода элементов матрицы x[n][m] изображена на рис. 6.3.
2
В данном случае массив указателей на float.
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
188
Do'stlaringiz bilan baham: |