Обработка матриц
Лекция №8. Двумерные массивы
Двумерные массивы - матрицы - представляют собой массивы векторов и задаются двумя числами в квадратных скобках:
тип_элементов имя_массива [размер1] [размер2];
где размер1 - количество строк; размер2 - количество столбцов.
Например: double matr[100][10]; int i_matrix[10][20]; char cube[10][20][3];
В памяти ЭВМ матрицы занимают последовательно расположенные ячейки в следующем порядке: располагается первая строка, за ней - вторая, третья и т. д.
Заполнение и обработку многомерных массивов обычно производят, пользуясь вложенными циклами. При этом массивы оказываются расположенными в памяти ЭВМ таким образом, что медленнее всего изменяется крайний левый индекс, а быстрее всего - крайний правый. Другими словами, при использовании вложенных циклов для обработки многомерных массивов самый внутренний цикл соответствует крайнему правому индексу, а самый внешний - крайнему левому индексу.
Пример. Формирование матрицы с помощью генератора случайных чисел,
const int MAX_ROW = 5;
const int MAX_COL = 4;
randomize();
for (i=0; i<MAX_ROW; i++)
{ for (j=0; j<MAX_COL; j++)
{x[i][j]=random(10)-5;}}
Вывод матриц также происходит с помощью вложенных циклов.
Инициализация многомерных массивов осуществляется аналогично инициализации одномерных массивов. При этом инициализирующие значения должны совпадать с последовательностью хранения элементов массива в памяти. Типичной ошибкой, не вызывающей сообщения компилятора, является объявление вида int arr[i, j];или использование arr[i, j] в выражениях. Компилятор воспринимает запятую между индексами как операцию "запятая" и игнорирует индекс i.
Пример. Инициализация двумерного массива.
const int MAX_ROW = 5; // количество строк - 5
const int MAX_COL = 3; // количество столбцов - 3
void main ()
{int x[MAX_ROW][MAX_COL]= {{l,2,3}, //строка1
{ 4,5,6}, //строка2
{ 7,8,9}, //строкаЗ
{10,11,12}, //строка4
{13,14,15}}; //строка5
При работе с матрицами часто приходится решать задачи одного из классов: работа с матрицей в целом, работа со строками (столбцами) матрицы, работа с диагональными элементами матрицы.
Работа с матрицей в целом
При работе с матрицей в целом вся подготовительная и инициализирующая часть выполняется один раз перед внешним циклом.
Пример 8.5. Поиск максимального элемента матрицы.
int arr[n][k], max=arr[0][0];
for (i=0; i<n; i++)
for(j=0;j<k; j++)
{ if(max<arr[i][j]) max=arr[i][j];}
Работа со строками/столбцами матрицы
При работе со строками инициализирующие действия производятся внутри внешнего цикла и до начала внутреннего цикла.
Пример. Поиск максимальных элементов каждой строки матрицы.
int arr[n][k]; int max[n];
for (i=0; i<n; i++)
{ max[i]=arr[i][0];
for(j=0;j<k; j++)
{ if(max[i]<arr[i][j]) max[i] = arr[i][j];}}
В результате этих действий формируется вектор-столбец, размерность которого равна числу строк в обрабатываемой матрице.
Работа со столбцами матрицы отличается от работы со строками только тем, что цикл обработки столбцов становится внешним и результирующий вектор (вектор-строка) имеет размерность, равную количеству столбцов.
Диагональные элементы матриц
При работе с диагональными элементами матрицы предполагают, что матрица - квадратная. Диагональ, соединяющая левый верхний угол матрицы с ее правым нижним углом, называется главной, а соединяющая правый верхний угол с левым нижним - побочной. Для элементов, стоящих на главной диагонали выполняется равенство i=j. Если выполняется условие i>j, то элемент находится под главной диагональю. Если i < j - над главной диагональю.
Элемент находится на побочной диагонали, если выполняется условие i=n - j - 1 , где n - порядок матрицы, i > (n - j - 1) - условие нахождения элемента под побочной диагональю, i<(n - j - 1) - над побочной диагональю.
Пример. Дан 30-элементный целочисленный массив. Создать другой массив, расположив в нем сначала четные элементы исходного массива, затем - нечетные.
#define M 30
#include <stdio.h>
#include <stdlib.h>
void main()
{ int i,j; int mas1[M]; int mas2[M];
randomize();
for(i=0; i<M; i++)
{ mas1[i]=random(10); printf("%d", mas1[i]);}
j=0;
for(i=0; i<M; i++)
{ if(mas1[i]%2==0) {mas2[j]=mas1[i];j++;}}
for(i=0; i<M; i++)
{ if(mas1[i]%2!=0 { mas2[j]=mas1[i];j++;}}
for(i=0; i<M; i++)
printf("%03d", mas2[i]);}