Основные теоретические сведения.
Основные теоретические сведения о массивах были изложены в лабораторной работе №3. Данная лабораторная работа (№4) является логическим продолжением предыдущей и призвана закрепить навыки работы со статическими массивами на примере решения конкретных задач матричной алгебры.
Напомним основные моменты работы со статическими массивами.
1) Как и переменные, массивы необходимо объявлять. Запись double dArray[13][12] означает объявление двумерного массива dArray типа double размером 13×12 элементов, т.е. 13 строк и 12 столбцов.
2) Размер статических массивов определяется заранее и его нельзя менять. Если в задаче необходимо использовать массив переменного размера, то можно объявить массив заведомо большего размера и использовать в ходе решения только необходимую его часть. Например, в задаче требуется определить матрицу порядка n. Можно принять, что n <= 20 и объявить двумерный массив размером 20×20. Этого хватит для решения задачи для любого n <= 20.
3) Индексация в массивах начинается с нуля. Это означает, что для массива dArray индексы изменяются от 0 до 12 по строкам и от 0 до 11 по столбцам.
4) При работе с массивами широко используются циклы for. Следующий участок кода показывает пример обнуления двумерного массива dArray:
int i, j;
for ( i = 0; i < 13; i++ )
{
for ( j = 0; j < 12; j++ )
{
dArray[i][j] = 0;
}
}
5) Для инициализации больших массивов целесообразно использовать генератор случайных чисел.
Предположим, что по условию задачи массив dArray необходимо заполнить действительными числами, а затем определить количество положительных и отрицательных элементов массива. Примем следующее допущение: элементы массива будут иметь значения от –100 до +200. Тогда инициализацию массива можно провести следующим образом:
srand((unsigned)time(NULL));
int i, j;
for ( i = 0; i < 13; i++ )
{
for ( j = 0; j < 12; j++ )
{
dArray[i][j] = ( 300. * rand() / RAND_MAX ) - 100;
}
}
6) В ряде случаев условие задач может быть неполным и для решения целесообразно принимать дополнительные ограничения, например, задать диапазоны изменения входных данных и т.п.
Теперь вы обладаете достаточными знаниями для самостоятельного решения следующих задач.
Транспонирование матриц
Транспонированной называется матрица (АТ), в которой столбцы исходной матрицы (А) заменяются строками с соответствующими номерами.
Если А = (аij), то АТ = (аji).
Из определения следует, что если исходная матрица А имеет размер m × n, то транспонированная матрица АТ имеет размер n × m.
АЛГОРИТМ 3
Алгоритм операции транспонирования.
Исходные данные:
А[m×n] — исходная матрица.
Выходные данные:
M[n×m] — транспонированная матрица.
Вспомогательные переменные:
i, j — переменные для организации циклов.
Шаг 1. [Цикл по i]. Выполнить шаг 2 при i = 0,…,n – 1 и после этого завершить алгоритм.
Шаг 2. [Цикл по j]. Выполнить шаг 3 при j = 0,…,m – 1.
Шаг 3. [Установить М[i,j]]. М[i,j] = А[j,i]. (Формируем элементы транспонированной матрицы)
Сложение матриц
Складывать (вычитать) можно матрицы одного размера. Суммой матриц А = (аij) и В = (bij) размера m × n называется матрица С = А + В, элементы которой сij = aij + bij для i = 1,2,...,m; j = 1,2,…,n (т.е. матрицы складываются поэлементно).
АЛГОРИТМ 4
Алгоритм сложения двух матриц.
Исходные данные:
А[m×n], В[m×n] — исходные матрицы.
Выходные данные:
С[m×n] — результат суммирования.
Вспомогательные переменные:
i, j — переменные для организации циклов.
Шаг 1. [Цикл по i]. Выполнить шаг 2 при i = 0,…,m – 1 и после этого завершить алгоритм.
Шаг 2. [Цикл по j]. Выполнить шаг 3 при j = 0,…,n – 1.
Шаг 3. [Установить С[i,j]]. С[i,j] = А[i,j] + В[i,j].
Умножение матриц
Произведение матриц определено, если число столбцов первой матрицы равно числу строк второй.
Пусть А = (аij) матрица размера m × n и В = (bij) матрица размера n × p, тогда размерность произведения А × В равна m × p. При этом матрица С (размера m × p) называется произведением матриц А и В, если каждый ее элемент равен сумме произведений элементов i–й строки матрицы А на соответствующие элементы j–го столбца матрицы В:
АЛГОРИТМ 5
Алгоритм умножения двух матриц.
Исходные данные:
А[m×n], В[n×p] — исходные матрицы.
Выходные данные:
С[m×p] — результат умножения.
Вспомогательные переменные:
i, j, k — переменные для организации циклов.
Шаг 1. [Цикл по i]. Выполнить шаг 2 при i = 0,…,m – 1 и после этого завершить алгоритм.
Шаг 2. [Цикл по j]. Выполнить шаги от 3 до 4 при j = 0,…,p – 1.
Шаг 3. [Установить С[i,j]]. С[i,j] = 0.
Шаг 4. [Цикл по k]. Выполнить шаг 5 при k = 0,…,n – 1.
Шаг 5. [Установить С[i,j]]. С[i,j] = С[i,j] + А[i,k] * В[k,j].
Задание на лабораторную работу №4
Задача 1. Разработать алгоритм и написать по нему программу транспонирования матрицы А размера m × n. Значение величин m и n выбрать из табл. 4.1 в соответствии с вариантом задания.
Задача 2. Разработать алгоритм и написать по нему программу сложения матриц А и В размера m × n. Значение величин m и n выбрать из табл. 4.1 в соответствии с вариантом задания.
Задача 3. Разработать алгоритм и написать по нему программу умножения матрицы А размера m × n на матрицу В размера n × p. Значение величин m, n, р выбрать из табл. 4.2 в соответствии с вариантом задания.
Оформить протокол лабораторной работы.
Примечание! Алгоритмы решения задач должны содержать не только расчетную часть, но и блоки формирования входных и выходных данных.
Варианты заданий
Таблица 4.1. Варианты заданий к задачам 1 и 2
№ | m, n | № | m, n | № | m, n |
m = 2; n = 3 | m = 3; n = 5 | m = 5; n = 2 | |||
m = 2; n = 4 | m = 3; n = 6 | m = 5; n = 3 | |||
m = 2; n = 5 | m = 4; n = 2 | m = 5; n = 4 | |||
m = 2; n = 6 | m = 4; n = 3 | m = 5; n = 5 | |||
m = 3; n = 2 | m = 4; n = 4 | m = 5; n = 6 | |||
m = 3; n = 3 | m = 4; n = 5 | m = 6; n = 2 | |||
m = 3; n = 4 | m = 4; n = 6 |
Таблица 4.2. Варианты заданий к задаче 3
№ | m, n, p | m, n, p | |
m = 2; n = 2; р = 2 | m = 4; n = 4; р = 4 | ||
m = 3; n = 2; р = 2 | m = 5; n = 4; р = 4 | ||
m = 4; n = 2; р = 2 | m = 2; n = 4; р = 5 | ||
m = 5; n = 2; р = 2 | m = 3; n = 4; р = 5 | ||
m = 2; n = 3; р = 3 | m = 4; n = 4; р = 5 | ||
m = 3; n = 3; р = 3 | m = 5; n = 4; р = 5 | ||
m = 4; n = 3; р = 3 | m = 2; n = 4; р = 6 | ||
m = 5; n = 3; р = 3 | m = 3; n = 4; р = 6 | ||
m = 2; n = 4; р = 4 | m = 4; n = 4; р = 6 | ||
m = 3; n = 4; р = 4 | m = 5; n = 4; р = 6 |
Контрольные вопросы
Приведите алгоритм решения следующей задачи:
А = В * С + D
где A, B, C, D матрицы.
Какие следует принять дополнительные условия и ограничения для решения данной задачи?
Лабораторная работа №5
Цель: усовершенствовать навыки программирования на примере решения задач матричной алгебры с использованием динамических массивов.
Задачи:
1) Повторить теоретические сведения о создании и использовании диннамических массивов в языке Си++.
2) Разработать программу решающую одну из задач матричной алгебры.