
- •Лекция 15 Базовые алгоритмы работы с массивами
- •Обработка матриц
- •Построчная обработка
- •Обработка по столбцам
- •Обработка всей матрицы
- •Обход по «спирали» квадратной матрицы порядка n
- •Обработка части матрицы Обработка элементов главной или побочной диагоналей квадратной матрицы
- •Обработка элементов над(под) главной или побочной диагоналями квадратной матрицы
- •Вставка строки
- •Построение матриц
- •Примеры «Зеркальное отображение» матрицы относительно вертикальной оси, проходящей через ее середину
- •Нахождение минимального элемента матрицы и вычеркивание строки и столбца, на пересечении которых он находится
- •Нахождение сумм элементов квадратной матрицы на главной диагонали и на диагоналях, параллельных главной
- •Умножение матриц
Лекция 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;
}
Замечания:
Массив 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; должен располагаться внутри внешнего, но вне внутреннего цикла.
Обработка по столбцам
Аналогичные вычисления можно выполнять не для каждой строки, а для столбцов. Так как матрицы располагаются в памяти по строкам, то элементы столбца располагаются не рядом, а на определенном удалении друг от друга. Для больших матриц и «слабых» компьютеров обработка по столбцам малоэффективна с точки зрения времени выполнения программы. Поэтому такую обработку желательно избегать (например, транспонируя матрицу). В качестве примера такой обработки продолжим рассмотрение задачи предыдущего пункта: найдем сразу и выведем, не формируя массив, количество плохих оценок 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; и оператора вывода результата.