Разработка алгоритма решения.
Практическая работа №5
Тема: «Решение задач обработки двумерных массивов»
Цель задания:
1. Получение практических навыков при работе с массивами, их ввода, вывода.
2. Закрепление навыков по организации программ циклической структуры.
3. Овладение навыками по организации программ вложенной циклической структуры.
Содержание отчета:
1. Постановка задачи для конкретного варианта.
2. Текст программы.
3. Блок-схема алгоритма решения задачи.
4. Результаты тестов.
5. Распечатка результатов работы программы.
Варианты заданий
Задание №1
1. Составить программу для подсчёта суммы чётных элементов двумерной таблицы А размером m×n.
2. Составить программу для подсчёта произведения элементов, удовлетворяющих условию , в двумерной целочисленной таблице А размерности m×n.
3. Составить программу для подсчёта произведения нечётных элементов двумерной матрицы В размерности m×n.
4. Составить программу для подсчёта суммы элементов, удовлетворяющих условию , в прямоугольной таблице С, состоящей из m×n целых чисел,
5. Составить программу для подсчёта среднего арифметического положительных элементов прямоугольной таблицы В, состоящей из M×N целых чисел.
6. Составить программу для подсчёта среднего арифметического ненулевых элементов, лежащих в диапазоне [-4;4], в прямоугольной таблице Х, состоящей из M×N целых чисел.
7. Составить программу для подсчёта количества положительных элементов квадратной таблицы В, состоящей из N×N целых чисел, расположенных выше главной диагонали.
8. Составить программу для подсчёта суммы отрицательных элементов квадратного массива Х, состоящего из N×N целых чисел, расположенных ниже главной диагонали.
9. Составить программу для подсчёта произведения элементов двумерной целочисленной таблицы В, состоящей из 5 строк и 4 столбцов, имеющих значения, кратные 3.
10. Составить программу для подсчёта произведения элементов целочисленной прямоугольной таблицы Y, состоящей из M строк и N столбцов, сумма двух индексов которых есть число чётное.
11. Составить программу для подсчёта суммы элементов прямоугольной целочисленной таблицы X, состоящей из M строк и N столбцов, сумма двух индексов которых есть число нечётное.
12. Составить программу для подсчёта суммы положительных элементов квадратной таблицы В, состоящей из N×N целых чисел, расположенных на побочной диагонали.
13. Составить программу для подсчёта среднего арифметического элементов, расположенных на главной и побочной диагоналях в квадратной целочисленной матрице X размером N×N.
Задание №2
- Дана квадратная матрица порядка N. Составить программу, транспонирующую эту матрицу. (Транспонированной называется матрица, в которой, в отличие от исходной матрицы, столбцы и строки поменяны местами).
- Составить программу, которая находит максимальные элементы каждой строки двумерной матрицы А, состоящей из m строк и n столбцов.
- Дан двумерный массив А, состоящий из m строк и n столбцов Составить программу, которая вычисляет произведение элементов каждой строки и находит среди них наименьшее.
- Дана прямоугольная матрица размера m×n. Составить программу, которая находит строки с наибольшей и наименьшей суммой элементов. Вывести найденные строки и суммы их элементов.
- Составить программу, которая в двумерной В, состоящей из m строк и n столбцов, подсчитывает суммы столбцов и столбец с наименьшей суммой элементов обнуляет.
- Дана квадратная матрица А порядка n. Составить программу, которая находит максимальный элемент и все элементы, расположенные в одной строке и в одном столбце с максимальным заменяет на нули. Учесть, что значения в массиве не повторяются.
- Дана квадратная матрица А порядка n. Составить программу, которая находит минимальный элемент и все элементы, расположенные в одной строке и в одном столбце с минимальным заменяет на минимальное значение. Учесть, что значения в массиве не повторяются.
- Дана квадратная матрица А порядка n. Составить программу, которая находит минимальный элемент каждого столбца.
- Дана прямоугольная матрица размером N×M. Составить программу, которая преобразует матрицу следующим образом: поэлементно вычитает последнюю строку из всех строк, кроме последней.
- Дана прямоугольная матрица В размером N×M. Составить программу, которая преобразует матрицу следующим образом: поэлементно вычитает первый столбец из всех столбцов, кроме первого.
- Дана прямоугольная матрица размера m×n. Составить программу, которая находит столбцы с наибольшей и наименьшей суммой элементов. Вывести найденные столбцы и суммы их элементов.
- Дана целочисленная прямоугольная матрица размера m×n. Составить программу, которая находит номер столбца, в котором находится самая длинная серия одинаковых элементов.
- Дана прямоугольная матрица размера m×n. Составить программу, которая находит количество строк, среднее арифметическое элементов которых меньше заданной величины.
Задание №3
1. Дана вещественная матрица размером n×m. Переставляя её строки и столбцы, добиться того, чтобы наибольший элемент (или один из них) оказался в верхнем левом углу.
2. Задана матрица размером m×n. Найти максимальный по модулю элемент матрицы. Переставить строки и столбцы матрицы таким образом, чтобы максимальный по модулю элемент был расположен на пересечении k-ой строки и k-го столбца.
3. Задана квадратная матрица. Переставить строку с максимальным элементом со строкой с заданным номером m.
4. Дана целочисленная матрица размером n×m. Переставляя её строки и столбцы, добиться того, чтобы наименьший элемент (или один из них) оказался в верхнем правом углу.
5. Дана квадратная матрица размером n×n. Переставляя её строки и столбцы, добиться того, чтобы наименьший элемент (или один из них) оказался на главной диагонали.
6. Дана вещественная матрица размером n×m. Переставляя её строки и столбцы, добиться того, чтобы наибольший элемент (или один из них) оказался в нижнем левом углу.
7. Дана целочисленная квадратная матрица порядка N, определить максимум среди сумм элементов диагоналей, параллельных главной диагонали.матрицы.
8. В данной целочисленной квадратной матрице порядка n содержится один нулевой элемент. Получить квадратную матрицу порядка n-1 путём отбрасывания из исходной матрицы строки и столбца, на пересечении которых расположен этот элемент.
9. Дана действительная квадратная матрица порядка n. Преобразовать матрицу по правилу: строку с номером n сделать столбцом с номером n, а столбец с номером n- строкой с номером n.
10. Дана целочисленная квадратная матрица порядка N, определить минимум среди сумм элементов диагоналей, параллельных главной диагонали.матрицы.
11. Дана квадратная матрица размером n×n. Переставляя её строки и столбцы, добиться того, чтобы наибольший элемент (или один из них) оказался на главной диагонали.
12. Уплотнить заданную матрицу, удаляя из неё строки и столбцы, заполненные нулями.
13. Задана квадратная матрица. Переставить столбец с минимальным элементом со столбцом с заданным номером m.
Задание №4
Создать квадратную матрицу целых чисел размером 9х9. В индивидуальных заданиях указано, какую обработку матрицы требуется выполнить.
Если по условию задания матрицу следует заполнить случайными числами, рекомендуем выбирать эти числа из диапазона 0 - 99. Если по условию задания в матрицу следует записать ЛП - линейную последовательность чисел, имеется в виду последовательность: 1, 2, 3, ...
Варианты индивидуальных заданий
№ варианта | Содержание задания | Иллюстрация | ||
Заполнить матрицу ЛП, от левого верхнего угла по диагонали: влево - вниз. | ||||
Заполнить секторы матрицы, которые лежат влево и вправо от главной и побочной диагоналей, ЛП, от левого верхнего угла вниз - вправо. Остаток матрицы заполнить нулями. | ||||
Заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно побочной диагонали | ||||
Заполнить матрицу случайными числами. Отобразить симметрично относительно вертикальной оси секторы матрицы, которые лежат влево и вправо от главной и побочной диагоналей. | ||||
Заполнить матрицу случайными числами. Отобразить верхнюю половину матрицы на нижнюю зеркально симметрично относительно горизонтальной оси. | ||||
Заполнить секторы матрицы, которые лежат выше и ниже главной и побочной диагоналей, ЛП, от левого верхнего угла вниз - вправо. Остаток матрицы заполнить нулями. | ||||
Заполнить матрицу случайными числами. Отобразить главную и побочную диагонали симметрично относительно вертикальной оси. | ||||
Заполнить матрицу случайными числами. Разместить на главной диагонали суммы элементов, которые лежат на диагоналях, перпендикулярных к главной. | ||||
Заполнить секторы матрицы, которые лежат выше и ниже главной и побочной диагоналей ЛП, от левого верхнего угла вправо - вниз. Остаток матрицы заполнить нулями. | ||||
Заполнить матрицу случайными числами. Отобразить симметрично относительно горизонтальной оси секторы матрицы, которые лежат выше и ниже главной и побочной диагоналей. | ||||
Заполнить матрицу случайными числами. Развернуть матрицу на 180o. | ||||
Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх. | ||||
Заполнить секторы матрицы, которые лежат влево и вправо от главной и побочной диагоналей ЛП, от левого верхнего угла вправо - вниз. Остаток матрицы заполнить нулями. | ||||
Заполнить матрицу ЛП, от левого верхнего угла по диагонали: вправо - вверх. | ||||
Заполнить матрицу случайными числами. Отобразить главную и побочную диагонали симметрично относительно горизонтальной оси. | ||||
Заполнить матрицу ЛП, от правого верхнего угла по диагонали: влево - вниз. | ||||
Заполнить матрицу случайными числами. Развернуть матрицу на 90o против часовой стрелки. | ||||
Заполнить матрицу случайными числами. На побочной диагонали разместить суммы элементов, которые лежат на той же строке и столбце. | ||||
Заполнить матрицу случайными числами. На главной диагонали разместить суммы элементов, которые лежат на той же строке и том же столбце. | ||||
Заполнить матрицу случайными числами. Отобразить правую половину матрицы на левую зеркально симметрично относительно вертикальной оси. | ||||
Заполнить матрицу ЛП, от левого верхнего угла по спирали: вниз - вправо - вверх - влево. | ||||
Заполнить матрицу случайными числами. Отобразить левую половину матрицы на правую зеркально симметрично относительно вертикальной оси. | ||||
Заполнить матрицу ЛП, от центра по спирали: вниз - влево - вверх - вправо. | ||||
Заполнить матрицу случайными числами. Развернуть матрицу на 90o по часовой стрелке. | ||||
Заполнить матрицу ЛП, от центра по спирали: влево - вниз - вправо - вверх. | ||||
Заполнить матрицу случайными числами. Разбить матрицу на квадраты размером 3х3. В центре каждого квадрата поместить сумму остальных элементов квадрата. | ||||
Заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно главной диагонали | ||||
Заполнить матрицу ЛП, от левого верхнего угла по спирали: вправо - вниз - влево - вверх. | ||||
Заполнить матрицу случайными числами. Отобразить нижнюю половину матрицы на верхнюю зеркально симметрично относительно горизонтальной оси. | ||||
Заполнить матрицу случайными числами. Разместить на побочной диагонали суммы элементов, которые лежат на диагоналях, перпендикулярных к побочной. | ||||
Пример решения задачи
Заполнить секторы матрицы, которые лежат выше и ниже главной и побочной диагоналей, ЛП, от левого верхнего угла вниз - вправо. Остаток матрицы заполнить нулями. |
Разработка алгоритма решения.
Если обозначим размерность матрицы как S, номер строки как L, а номер столбца как R, и (имея в виду, что реализация алгоритма будет выполнена на языке С) договоримся, что нумерация строк и столбцов будет начинаться с 0, то можно определить, что в строке с номером L ненулевые элементы в верхней части матрицы лежат на столбцах с номерами R1=L < R < R2=S-L, а в нижней - R1=S-L-1 < R < R2=L. Следовательно, алгоритм может состоять из перебора матрицы строка за строкой с определением для каждого элемента, удовлетворяют ли его индексы вышеприведенным условиям. Если да - элементу присваивается следующее значение из ЛП, если нет - 0.
Но можно несколько упростить алгоритм, обойдя вычисления граничных значений для каждого элемента и необходимости определения, в верхнюю или нижнюю часть матрицы ми попадаем. Обратим внимание на то, что для первой строки (L=0) R1=1, R2=S-2. Для каждой следующей строки R1 увеличивается на 1, а R2 уменьшается на 1. Когда пересекаем середину матрицы, то направление модификации изменяется на противоположное: теперь для каждой следующей строки R1 уменьшается на 1, а R2 увеличивается на 1. Признаком пересечения середины может быть условие R1 > R2, оно выполняется в момент пересечения. Схема алгоритма показана на рисунке.
Вместе с описанными выше переменными R1 и R2, которые получают начальные значения для первой строки матрицы, ми вводим переменную dd с начальным значением 1 - это то значение, которое будет модифицировать R1 и R2 для каждой следующей строки, и переменную k - в которой будет значение текущего члена ЛП, начальное значение - 1 (блок 2). Далее организуются вложенные циклы. Во внешнем цикле перебираются строки (блок 3), а во внутреннем - столбцы матрицы (блок 4). В каждой итерации внутреннего цикла номер столбца R сравнивается с граничными значениями R1, R2 (блоки 5,6). Если он лежит в пределах от R1 до R2, то текущему члену матрицы присваивается значение k - текущего члена ЛП, а затем k увеличивается на 1 (блок 7). Если нет, текущему члену присваивается значение 0 (блок 8). После выхода из внутреннего цикла модифицируются граничные значения: R1 увеличивается на dd, а R2 уменьшается на dd (блок 9). Напомним, что начальное значение dd=1. Когда выполняется условие R1 > R2 (блок 10) присваиваем dd значение -1, далее модификация границ будет соответствовать правилам для нижней части матрицы.
После выхода из внешнего цикла, который начался в блоке 3, вновь организуются вложенные циклы перебора строк (блок 12) и столбцов (блок 13). В каждой итерации внутреннего цикла выводится значение одного элемента матрицы (блок 14), после выхода из внутреннего цикла начинается новая строка вывода (блок 15).