Оглавление Пример программы. Умножение матриц (Турбо Паскаль).


Задание.

Написать программу для умножения матрицы на матрицу. Максимальное число строк и столбцов каждой матрицы: 50.

Обсуждение программы.

Элемент матрицы-результата, расположенный на I-й строке и J-м столбце, вычисляется так:

  1. Берем I-ю строку 1-й матрицы и J-й столбец 2-й матрицы (считая слева-направо и сверху-вниз). И вычисляем их скалярное произведение. То есть произведение 1-го элемента строки на 1-й элемент столбца плюс произведение 2-го элемента строки на 2-й элемент столбца и т.д. То есть результат есть сумма произведений элементов строки и элементов столбца с одинаковыми номерами.
  2. Количество элементов строки и столбца должно быть одинаково, иначе умножение этих матриц невозможно. То есть число строк 2-й матрицы должно равняться числу столбцов 1-й (K).
  3. Обозначим число строк 1-й матрицы: N, число столбцов 2-й: M. Матрица-результат будет иметь N строк и M столбцов. Чтобы вычислить все элементы матрицы-результата, нужно пробежать все значения I (от 1 до N) и J (от 1 до M).
  4. При вычислении суммы произведений нужна вспомогательная переменная. Назовем её Summa.

Текст программы

Program Umnoj2;
Const Max=50;
Var AA,BB,CC: array [1..Max,1..Max] of Double;
 {то есть место для матриц выделяем с запасом}
  ii,jj,kk,nn,mm,ll : integer; Summa: double;
begin
  writeln ('Программа умножает матрицу A на матрицу B');
  write('Введите число строк 1-й матрицы - A (<=50)--> ');readln(NN);
  write('Введите число столбцов 1-й матрицы - A (<=50)--> ');readln(KK);
  write('Введите число столбцов 2-й матрицы - B (<=50)--> ');readln(MM);
  writeln('Введите 1-ю матрицу (A):');
  for ii:=1 to nn do
  for jj:=1 to kk do
    begin
      write('Введите A[',ii,',',jj,'] --> ');
      readln(AA[ii,jj]);
    end;

  writeln('Введите 2-ю матрицу (B):');
  for ii:=1 to kk do
  for jj:=1 to mm do
   begin write('Введите B[',ii,',',jj,'] --> '); readln(BB[ii,jj]);
   end;

  {Вычисляем элементы матрицы-результата}

    for ii:=1 to nn do
    for jj:=1 to mm do
      begin
        Summa:= 0;
        for ll:= 1 to kk do
          Summa:= Summa + AA[ii,ll]*BB[ll,jj];
          CC[ii,jj] := Summa;
      end;
{Выводим матрицу-результат:}
  writeln('---- Результат: -----');
  for ii:=1 to nn do
    begin
      for jj:=1 to mm do
        write(CC[ii,jj]:8:2);
      writeln;
    end;
readln;
end.
---- Результат: ----
7 3 2 2    3 2     29 50
2 4 6 1 *  2 6  =  20 57
1 1 4 5    1 4     9  49
           0 5
----------

После изучения подпрограмм и указателей можно будет сделать эту программу более универсальной и увеличить максимальный размер матриц.

Rambler's Top100
Hosted by uCoz