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

Тема 12_1 Базові алгоритми роботи з масивами

План:

  1. Обробока матриць

  1. Порядкова обробка

  2. Обробка по стовпцях

  3. Обробка всієї матриці

  4. Обхід по «спіралі» квадратної матриці порядку n

  1. Обробка частини матриці

  1. Обробка елементів головної або побічної діагоналей квадратної матриці

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

  1. Перетворення матриць

  1. Перестановка рядків

  2. Перестановка стовпців

  3. Видалення рядка

  1. Множення матриць

Обробка матриць

Обробка матриць включає наступні типи алгоритмів:

  • Порядкова обробка

  • Обробка матриці по стовпцях

  • Обробка всієї матриці

  • Обробка частини матриці

  • Перетворення матриці:

    • перестановка двох рядків

    • перестановка двох стовпців

    • видалення рядка

    • вставка рядка

    • побудова матриць:

      • з елементами, залежними від своїх же індексів

      • з використанням одного числа

      • з використанням одновимірних масивів

      • з використанням однієї або декількох визначених раніше матриць

Порядкова обробка

Порядкова обробка передбачає, що для кожного рядка матриці потрібно знайти деякий параметр (суму, кількість елементів рядка з деякою умовою, найбільший (найменший) елементи, певний елемент (наприклад, 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;

}

Зауваження:

  1. Масив S і змінна Sum повинні оголошуватися з типом double або:

double S[n]; int Sum;. S[i]= double (Sum) /m; або S[i]= (Sum+0.0)/m;

  1. Масив S має розмірність n (кількість рядків матриці) і індекс його елементу збігається з номером рядка (i), а не стовпця (j).

  2. Оператор Sum = 0; повинен розташовуватися між операторами for, оскільки для кожного рядка підсумовування необхідно починати з першого стовпця.

  3. Оператор 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; і оператора виведення результату.

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