Обработка матриц

Лекция №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]);}