Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / 3_кол / Лекції / лекция_С++(12_1)_у.doc
Скачиваний:
10
Добавлен:
30.05.2020
Размер:
202.75 Кб
Скачать

Обробка елементів над (під) головною або побічною діагоналями квадратної матриці

Верхній трикутник квадратної матриці відносно головної діагоналі – це елементи, в яких 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 до;

cin >> до;

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. оголосити масив 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]. В цьому випадку резервується максимальний об'єм пам'яті в припущенні, що після кожного рядка треба буде вставляти нову. Вочевидь, що пам'ять в даному випадку використовується неефективно. Це характерно і для випадку видалення рядків. На практиці таке перетворення ефективніше виконувати за допомогою динамічних матриць або списків.

Соседние файлы в папке Лекції