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

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

Верхний треугольник квадратной матрицы относительно главной диагонали – это элементы, у которых 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]. В этом случае резервируется максимальный объем памяти в предположении, что после каждой строки надо будет вставлять новую. Очевидно, что память в данном случае используется неэффективно. Это характерно и для случая удаления строк. На практике такое преобразование эффективнее выполнять с помощью динамических матриц или списков.