Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_15_Массивы_алгоритмы.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
205 Кб
Скачать
☆

Обработка всей матрицы

К такому типу отнесем задачи, в которых выполняется анализ всей матрицы в целом. В таких алгоритмах можно обрабатывать ее как по строкам, так и по столбцам. Но более правильно организовать внешний цикл по номеру строки, а внутренний – по номеру столбца (т.к. элементы матрицы располагаются по строкам).

В качестве примера найдем в матрице наибольший элемент и номера строки и столбца, на пересечении которых он находится:

const int n=10, m=5;

int A[n][m];

int MyMax, Imax, Jmax;

//……

MyMax=A[0][0];

Imax = Jmax = 0;

for (int i=0; i< n; i++)

for(int j=0; j< m; j++)

if (A[i][j] > MyMax)

{MyMax=A[i][j];

Imax=i;

Jmax=j;

}

cout << MyMax << " " << Imax <<" "<< Jmax;

Проанализируйте, если наибольший элемент повторяется несколько раз, индексы какого из них мы найдем? Что надо изменить, чтобы наибольший элемент и его номер находились для каждой строки и выводились по мере получения?

Обход по «спирали» квадратной матрицы порядка n

Выполнить обход по «спирали» квадратной матрицы порядка n, элементами которой являются целые числа:

#include <iomanip>

#include <conio.h>

int main()

{ int p,j, i;

const int N = 6;

static int arr[N][N] = { { 1, 2, 3, 4, 5, 6},

{20, 21, 22, 23, 24, 7},

{19, 32, 33, 34, 25, 8},

{18, 31, 36, 35, 26, 9},

{17, 30, 29, 28, 27, 10},

{16, 15, 14, 13, 12, 11} };

for (p=0; p<N/2; p++) //количество витков спирали

{for (j=p; j<=N-p-1; j++) //верхняя строка витка p

cout << setw(4) << arr[p][j];

for (i=p+1; i<N-p; i++) //правый столбец витка p

cout << setw (4)<< arr[i][N-p-1];

for (j=N-p-2; j>=p; j--) //нижняя строка витка p

cout << setw (4)<< arr[N-p-1][j];

for (i=N-p-2; i>=p+1; i--) //левый столбец витка p

cout << setw (4)<< arr[i][p];

}

_getch();

return 0;

}

Обработка части матрицы Обработка элементов главной или побочной диагоналей квадратной матрицы

К такому типу отнесем задачи, в которых выполняется обработка элементов главной или побочной диагонали квадратной матрицы, объявленной, например, так: const n=10; int A[n][n];

Структура циклов останется такой же, как при решении аналогичной задачи для одномерного массива. Например, для нахождения среднего значения главной диагонали необязательно писать два вложенных цикла:

const int n=10;

double Sum=0, A[n][n];

for (int i=0; i<n; i++)

for(int j=0; j<n; j++)

if (i==j) Sum +=A[i][j];

Sum /=n;

Так как для элементов главной диагонали оба индекса одинаковы, то это можно выполнить компактнее с помощью одного цикла:

const int n=10;

double Sum=0, A[n][n];

for (int i=0; i<n; i++)

Sum +=A[i][i];

Sum /=n;

Для обработки побочной диагонали необходимо найти зависимость второго индекса от первого. Легко видеть, что сумма индексов равна n-1. Поэтому второй индекс равен n-1-i, и соответствующая часть программы будет такой:

const int n=10;

double Sum=0, A[n][n];

for (int i=0; i<n; i++)

Sum +=A[i][n-1-i];

Sum /=n;