- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
3.3. Обработка всей матрицы
К такому типу отнесём задачи, в которых выполняется анализ всей матрицы, а не отдельно каждой строки или столбца. В таких алгоритмах можно обрабатывать её как по строкам, так и по столбцам. Но так как элементы матрицы располагаются в памяти по строкам, то лучше внешний цикл по номеру строки, а внутренний — по номеру столбца.
Пример 9. Найдём наибольший элемент во всей матрице и номер строки и столбца, на пересечении которых он находится.
int MyMax= A[0][0], Imax=0, Jmax=0;
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
if ( A[i][j]>MyMax) { MyMax= A[i][j]; Imax=i; Jmax=j; }
textcolor(10); cprintf (" \n\r Max = %d in %d row, %d column", MyMax, Imax, Jmax );
Обратим внимание, что операторы MyMax=A[0][0]; Imax=Jmax=0; располагаются вне всех циклов, так как мы находим общий наибольший элемент, т. е. одно число, а не для каждой строки или столбца отдельно. По этой же причине сprintf выполняется тоже один раз. Поэтому фигурные скобки расставлены по–другому, не так, как в задачах первых двух типов.
Упражнения.
Если наибольший элемент повторяется несколько раз, индексы какого из них мы найдём? Как найти индексы каждого наибольшего элемента?
Как наибольший элемент и его номер найти для каждой строки и выводить по мере получения без формирования массивов?
Что надо изменить, чтобы наибольший элемент и его номер находились для каждого столбца?
3.4. Обработка части матрицы
Рассмотрим алгоритм обработки элементов главной или побочной диагонали квадратной матрицы const n=5; int A[n][n]; которая одним из ранее рассмотренных способов определена. Структуру циклов можно оставить такой же, как при решении аналогичной задачи для одномерного массива.
Пример 10. Найдём среднее значение главной диагонали квадратной матрицы .
Для этого необязательно писать два вложенных цикла:
float Sum=0; for (int i=0; i<n; i++)
for (int j=0; j< n; j++) if ( i==j)Sum+=A[i][j];
Sum/=n;
Так как для элементов главной диагонали оба индекса одинаковы, и диагональ матрицы можно рассматривать как одномерный массив, то это можно выполнить компактнее с помощью одного цикла:
float Sum=0; for (int i=0; i<n; i++) Sum+=A[i][i];
Sum/=n;
Сравните с задачей нахождения этого же параметра в одномерном массиве.
Пример 11. Найдём среднее значение побочной диагонали.
Для обработки побочной диагонали, как и при решении некоторых других типов задач, необходимо найти зависимость второго индекса от первого. Так как сумма индексов равна n-1, то второй индекс будет равен n-1-i, где i— номер строки. float Sum=0;
for (int i=0; i<n; i++) Sum+=A[i][ n-1-i];
Sum/=n;
Верхний треугольник квадратной матрицы относительно главной диагонали — это те элементы, у которых i<j, если главная диагональ не включается, или i<=j, если включается. Аналогично определяется нижний треугольник относительно главной диагонали и треугольники относительно побочной диагонали. Для обработки таких треугольников необходимо определить, как изменяются индексы.
Пример 12. Найти количество нулевых элементов верхнего треугольника относительно главной диагонали, включая и её.
В нулевой строке j изменяется от 0 до n-1, в первой строке — от 1 до n-1, во второй строке — от 2 до n-1 и так далее. Значит, в произвольной i-й строке индекс j изменяется от i до n-1. Получим
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++)…
Упражнения. Эту же задачу решить для
a) нижнего треугольника относительно главной диагонали;
b) нижнего треугольника относительно побочной диагонали;
c) верхнего треугольника относительно побочной диагонали;
