По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Обработка матриц в Паскале
Напомним некоторые сведения из курса математики. Умножать можно только матрицы, у которых количество столбцов в первой матрице совпадает с количеством строк во второй матрице. Матрица-произведение имеет столько строк, сколько было в первой матрице и столько столбцов, сколько было во второй. Таким образом, при умножении матрицы A(N,M) на матрицу B(M,L) получается матрица C(N,L). Каждый элемент матрицы C[i,j] является скалярным произведением i-й строки матрицы A и j-го столбца матрицы B. В общем виде формула для нахождения элемента матрицы имеет вид:
( 6.1) |
где и .
Рассмотрим более подробно формирование матрицы C(3,2) как произведения матриц A(3,3) и B(3,2).
Следует помнить, что .
Блок-схема, реализующая умножение каждого элемента матрицы C по формуле (6.1), приведена на рис. 6.29.
Ниже приведён текст программы умножения двух матриц с комментариями.
type matrica=array [ 1.. 15, 1.. 15 ] of real; var a, b, c : matrica; i, j,M,N, L, k : byte; begin //Ввод размеров матриц. writeln ( ’введите n,m и l ’ ); readln (N, M, L ); //Ввод матрицы A. writeln ( ’Матрица A ’ ); for i :=1 to N do for j :=1 to M do read ( a [ i, j ] ); //Ввод матрицы B. writeln ( ’Матрица B ’ ); for i :=1 to M do for j :=1 to L do read ( b [ i, j ] ); //Формирование матрицы C. for i :=1 to N do for j :=1 to L do begin {В C[i,j] будет храниться результат скалярного} {умножения i-й строки на j-й столбец.} c [ i, j ] : = 0; for k:=1 to M do c [ i, j ] : = c [ i, j ]+a [ i, k ] * b [ k, j ]; end; //Вывод матрицы C=AB. writeln ( ’матрица C=A*B ’ ); for i :=1 to N do begin for j :=1 to L do write ( c [ i, j ] : 7 : 3, ’ ’ ); writeln; end; end.
Результат работы представлен на рис. 6.30.