
- •Лекция 15 Базовые алгоритмы работы с массивами
- •Обработка матриц
- •Построчная обработка
- •Обработка по столбцам
- •Обработка всей матрицы
- •Обход по «спирали» квадратной матрицы порядка n
- •Обработка части матрицы Обработка элементов главной или побочной диагоналей квадратной матрицы
- •Обработка элементов над(под) главной или побочной диагоналями квадратной матрицы
- •Вставка строки
- •Построение матриц
- •Примеры «Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину
- •Нахождение минимального элемента матрицы и вычеркивание строки и столбца, на пересечении которых он находится
- •Нахождение сумм элементов квадратной матрицы на главной диагонали и на диагоналях, параллельных главной
- •Умножение матриц
Обработка элементов над(под) главной или побочной диагоналями квадратной матрицы
Верхний треугольник квадратной матрицы относительно главной диагонали – это элементы, у которых i<j, если главная диагональ не включается, или i <= j, если включается. Аналогично определяется нижний треугольник, относительно главной диагонали и треугольники относительно побочной диагонали.
Для обработки таких треугольников необходимо определить, как изменяются индексы. В произвольной i-ой строке индекс j изменяется от i до n-1. Поэтому, например, подсчет количества нулевых элементов верхнего треугольника, включая и главную диагональ, будет выглядеть следующим образом:
const int n=10;
double A[n][n];
int K0=0;
for (int i=0; i<n; i++)
for (int j=i; j<n; j++)
if (A[i][j] ==0) K0++;
Если саму главную диагональ анализировать не надо, то заголовок внутреннего цикла будет выглядеть так:
for (int j=i+1; j<n; j++)
Подсчет количества нулевых элементов нижнего треугольника относительно побочной диагонали выглядит так:
const int n=10;
double A[n][n];
int K0=0;
for (int i=0; i<n; i++)
for (int j=n-i-1; j<n; j++)
if (!A[i][j]) K0++; //или (A[i][j] ==0)
Преобразование матриц
Перестановка строк
Перестановка двух строк, номера которых n1 и n2 заданы, выполняется следующим образом:
const int n=10;
const int m=5;
double A[n][m];
int n1, n2;
cin >> n1>> n2;
int R;
for (int j=0; j<m; j++) //цикл по столбцам
{R=A[n1][j];
A[n1][j]= A[n2][j];
A[n2][j]=R;
}
Перестановка столбцов
Перестановка двух столбцов, номера которых m1 и m2 заданы, выполняется следующим образом:
const int n=10;
const int m=5;
double A[n][m];
int m1, m2;
cin >> m1>> m2;
int R;
for (int i=0; i<n; i++) //цикл по строкам
{R=A[i][m1];
A[i][m1]= A[i][m2];
A[i][m2]=R;}
Удаление строки
Удаление k-ой строки выполняется так:
const int n=10;
const int m=5;
double A[n][m];
int k;
cin >> k;
for (int i=k; i<n-1; i++)
for (int j=0; j<m; j++)
A[i][j] =A[i+1][j];
Здесь на место k-ой строки помещаем каждый элемент (k+1)-ой строки, на место (k+1)-й – (k+2)-ю и т.д. Таким образом, все строки, начиная с (k+1)-ой, «поднимаем на одну вверх». При этом объем зарезервированной для матрицы памяти не изменяется. Физически мы ни одну строку из памяти не удалили. Но после удаления одной строки, количество обрабатываемых строк на одну уменьшается. Последняя строка в обработке уже не должна участвовать.
Вставка строки
Для вставки после k-й строки матрицы новой строки необходимо:
1. объявить массив int A[n][m] с увеличенным на 1 количеством строк;
2. все строки от предпоследней до k-й переместить вниз:
for (int i=n-1; i>k+1; i--)
for (int j=0; j<m; j++)
A[i][j] =A[i-1][j];
3. на место (k+1)-й строки поместить вставляемую строку, например, одномерный массив В такой же размерности m, что и строка матрицы:
for ( int j=0; j<m; j++)
A[k+1][j] =B[j];
Если новую строку надо вставлять в соответствии с некоторым условием (например, в строке больше половины нулей) после каждой строки, то матрицу надо объявить так: int A[2*n][m]. В этом случае резервируется максимальный объем памяти в предположении, что после каждой строки надо будет вставлять новую. Очевидно, что память в данном случае используется неэффективно. Это характерно и для случая удаления строк. На практике такое преобразование эффективнее выполнять с помощью динамических матриц или списков.