- •Лекция 15 Базовые алгоритмы работы с массивами
- •Обработка матриц
- •Построчная обработка
- •Обработка по столбцам
- •Обработка всей матрицы
- •Обход по «спирали» квадратной матрицы порядка n
- •Обработка части матрицы Обработка элементов главной или побочной диагоналей квадратной матрицы
- •Обработка элементов над(под) главной или побочной диагоналями квадратной матрицы
- •Вставка строки
- •Построение матриц
- •Примеры «Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину
- •Нахождение минимального элемента матрицы и вычеркивание строки и столбца, на пересечении которых он находится
- •Нахождение сумм элементов квадратной матрицы на главной диагонали и на диагоналях, параллельных главной
- •Умножение матриц
Обработка всей матрицы
К такому типу отнесем задачи, в которых выполняется анализ всей матрицы в целом. В таких алгоритмах можно обрабатывать ее как по строкам, так и по столбцам. Но более правильно организовать внешний цикл по номеру строки, а внутренний – по номеру столбца (т.к. элементы матрицы располагаются по строкам).
В качестве примера найдем в матрице наибольший элемент и номера строки и столбца, на пересечении которых он находится:
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;
