- •Тема 12_1 Базові алгоритми роботи з масивами
- •Порядкова обробка
- •Обробка по стовпцях
- •Обробка всієї матриці
- •Обхід по «спіралі» квадратної матриці порядку n
- •Обробка частини матриці Обробка елементів головної або побічної діагоналей квадратної матриці
- •Обробка елементів над (під) головною або побічною діагоналями квадратної матриці
- •Вставка рядка
- •Побудова матриць
- •Приклади «Дзеркальне відображення» матриці відносно вертикальної осі, що проходить через її середину
- •Знаходження мінімального елементу матриці і викреслювання рядка і стовпця, на пересіченні яких він знаходиться
- •Void vyvod_ar(int arra[nrow][ncol], int m, int n) //функция виведення масиву
- •Void vvod_ar(int arra [nrow][ncol], int m, int n) //функция введення масиву
- •Знаходження сум елементів квадратної матриці на головній діагоналі і на діагоналях, паралельних головною
- •Void vyvod_ar(int arra[n][n], int n) //функция виведення масиву
- •Void vvod_ar(int arra [n][n], int n) //функция введення масиву
- •Void sum_diag(int а, int n) //функция знаходження сум елементів
- •Множення матриць
- •Література:
Тема 12_1 Базові алгоритми роботи з масивами
План:
-
Обробока матриць
-
Порядкова обробка
-
Обробка по стовпцях
-
Обробка всієї матриці
-
Обхід по «спіралі» квадратної матриці порядку n
-
Обробка частини матриці
-
Обробка елементів головної або побічної діагоналей квадратної матриці
-
Обробка елементів над (під) головною або побічною діагоналями квадратної матриці
-
Перетворення матриць
-
Перестановка рядків
-
Перестановка стовпців
-
Видалення рядка
-
Множення матриць
Обробка матриць
Обробка матриць включає наступні типи алгоритмів:
-
Порядкова обробка
-
Обробка матриці по стовпцях
-
Обробка всієї матриці
-
Обробка частини матриці
-
Перетворення матриці:
-
перестановка двох рядків
-
перестановка двох стовпців
-
видалення рядка
-
вставка рядка
-
побудова матриць:
-
з елементами, залежними від своїх же індексів
-
з використанням одного числа
-
з використанням одновимірних масивів
-
з використанням однієї або декількох визначених раніше матриць
-
-
Порядкова обробка
Порядкова обробка передбачає, що для кожного рядка матриці потрібно знайти деякий параметр (суму, кількість елементів рядка з деякою умовою, найбільший (найменший) елементи, певний елемент (наприклад, 0) і так далі
Особливість: не обов'язково треба аналізувати всі елементи рядка.
Рішення: зовнішній цикл будується по номеру рядка, а в одному або декількох внутрішніх циклах обробляється рядок як одновимірний масив. При цьому отримані характеристики рядків можна запам'ятовувати в одновимірному масиві розмірності n або виводити відразу у міру здобуття.
Приклад: задана матриця A[n][m], в якій Аij – оцінка i-го студента на j-м іспиті. Завдання знайти середній бал кожного студента S[n] відноситься до даного типа.
Розглянемо варіант частини програми:
const int n=10;
const int m=5;
int A[n][m], Sum;
double S[n];
for (int i=0; i<n; i++)
{ Sum =0;
for (int j=0; j<m;)
Sum += A[i][j++];
S[i]= Sum/m;
}
Зауваження:
-
Масив S і змінна Sum повинні оголошуватися з типом double або:
double S[n]; int Sum;. S[i]= double (Sum) /m; або S[i]= (Sum+0.0)/m;
-
Масив S має розмірність n (кількість рядків матриці) і індекс його елементу збігається з номером рядка (i), а не стовпця (j).
-
Оператор Sum = 0; повинен розташовуватися між операторами for, оскільки для кожного рядка підсумовування необхідно починати з першого стовпця.
-
Оператор S[i]= Sum/m; повинен розташовуватися усередині зовнішнього, але поза внутрішнім циклом.
Обробка по стовпцях
Аналогічні обчислення можна виконувати не для кожного рядка, а для стовпців. Оскільки матриці розташовуються в пам'яті по рядках, то елементи стовпця розташовуються не поруч, а на певному видаленні один від одного. Для великих матриць і «слабких» комп'ютерів обробка по стовпцях малоефективна з точки зору часу виконання програми. Тому таку обробку бажано уникати (наприклад, транспонуючи матрицю). Як приклад такої обробки продовжимо розгляд завдання попереднього пункту: знайдемо відразу і виведемо, не формуючи масив, кількість поганих оцінок до по кожному предмету, тобто проаналізуємо елементи кожного стовпця:
int до, i;
for (int j=0; j<m; j++) //цикл по стовпцях-предметах j
{for (k=0, i=0; i<n; i++) //цикл по рядках-студентах i
if (A[i][j] <=3) k++;
cout << j << " " << до << endl;
}
Особливість: зовнішній цикл будуємо по номеру стовпця. У внутрішньому циклі, змінюючи перший «лівий» індекс, обробляємо стовпець як одновимірний масив. Звертаємо увагу, що як і у попередньому випадку, важливе місце оператора обнулення лічильника k=0; і оператора виведення результату.