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

Лекция 15 Базовые алгоритмы работы с массивами

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

Построчная обработка 1

Обработка по столбцам 2

Обработка всей матрицы 2

Обход по «спирали» квадратной матрицы порядка n 3

Обработка части матрицы 4

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

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

Преобразование матриц 5

Перестановка строк 5

Перестановка столбцов 5

Удаление строки 5

Вставка строки 6

Построение матриц 6

Примеры 8

«Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину 8

Нахождение минимального элемента матрицы и вычеркивание строки и столбца, на пересечении которых он находится 8

Нахождение сумм элементов квадратной матрицы на главной диагонали и на диагоналях, параллельных главной 9

Умножение матриц 10

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

Обработка матриц включает следующие типы алгоритмов:

  • Построчная обработка

  • Обработка матрицы по столбцам

  • Обработка всей матрицы

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

  • Преобразование матрицы:

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

    • перестановка двух столбцов

    • удаление строки

    • вставка строки

    • построение матриц:

      • с элементами, зависящими от своих же индексов

      • с использованием одного числа

      • с использованием одномерных массивов

      • с использованием одной или нескольких определенных ранее матриц

Построчная обработка

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

Обработка по столбцам

Аналогичные вычисления можно выполнять не для каждой строки, а для столбцов. Так как матрицы располагаются в памяти по строкам, то элементы столбца располагаются не рядом, а на определенном удалении друг от друга. Для больших матриц и «слабых» компьютеров обработка по столбцам малоэффективна с точки зрения времени выполнения программы. Поэтому такую обработку желательно избегать (например, транспонируя матрицу). В качестве примера такой обработки продолжим рассмотрение задачи предыдущего пункта: найдем сразу и выведем, не формируя массив, количество плохих оценок k по каждому предмету, т.е. проанализируем элементы каждого столбца:

int k, 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 << " " << k << endl;

}

Особенность: внешний цикл строим по номеру столбца. Во внутреннем цикле, изменяя первый «левый» индекс, обрабатываем столбец как одномерный массив. Обращаем внимание, что как и в предыдущем случае, важно место оператора обнуления счетчика k=0; и оператора вывода результата.