Как найти произведение матриц в паскале

Нахождение
произведения двух матриц.

Program
Pro_39 (Input, Output);    

Объявление
имени программы

Var         

Блок
объявления глобальных переменных

X,
Y, Z   : Array [1..20,
1..20] Of Integer;       

Матрицы
целых чисел максимальной размерности
20×20

N1,
M1, N2, M2  : Integer;

N1,
M1, N2, M2 – число строк и столбцов
перемножаемы матриц

i,
j, k       
: Integer;              

i,
j, k – переменные циклов

S            
: Integer;              

Переменная
S – вспомогательная

Begin    

Начало
тела программы

WriteLn
(‘PASCAL:Нахождение произведения двух
матриц.’);            

Формулировка
цели алгоритма

Write
(‘Введите количество строк первой
матрицы: ‘);               

Запрос
ввода N1 – количества строк первой
матрицы

ReadLn
(N1);       

Ввод
N1

Write
(‘Введите количество столбцов первой
матрицы: ‘);           

Запрос
ввода M1 – количества столбцов первой
матрицы

ReadLn
(M1);      

Ввод
M1

WriteLn
(‘Введите поочередно элементы первой
матрицы:’);         

Запрос
ввода элементов 1-ой матрицы

For
i := 1 To N1 Do            

Цикл
для
i
от 1 до N

For
j := 1 To M1 Do           

Цикл
для j от 1 до N

Begin    

Начало
тела цикла

Write
(‘X[‘, i, ‘,’, j, ‘] = ‘);      

Вывод
удобной подсказки

ReadLn
(X [i, j] );

Ввод
очередного элемента матрицы X

End;      

Конец
тела цикла

WriteLn
(‘Число строк 2-ой матрицы равно числу
столбцов 1-ой матрицы.’);              

Сообщение
пользователю

N2
:= M1;             

Присваиваем
числу строк второй матрицы число
столбцов первой

Write
(‘Введите количество столбцов второй
матрицы: ‘);           

Запрос
ввода M2- количества столбцов первой
матрицы:

ReadLn
(M2);      

Ввод
M2

WriteLn
(‘Введите поочередно элементы второй
матрицы:’);         

Запрос
ввода элементов 2-ой матрицы

For
i := 1 To N2 Do            

Цикл
для
i
от 1 до N

For
j := 1 To M2 Do           

Цикл
для j от 1 до N

Begin    

Начало
тела цикла

Write
(‘Y[‘, i, ‘,’, j, ‘] = ‘);      

Вывод
удобной подсказки

ReadLn
(Y [i, j] );

Ввод
очередного элемента матрицы Y

End;      

Конец
тела цикла

For
i := 1 To N1 Do            

Цикл
для
i
от 1 до N1

For
j := 1 To M2 Do           

Цикл
для j от 1 до M2

Begin    

Начало
тела цикла

S
:= 0;    

Начальное
значение S приравниваем 0

For
k := 1 To N2 Do           

Цикл
для
k
от 1 до N2

S
:= S + X [i, k] * Y [k, j];   

Накапливаем
в S значение очередного элемента
результирующей матрицы

Z
[i, j] := S;           

Заносим
в Z [i, j] значение очередного вычисленного
элемента

End;      

Конец
тела цикла

WriteLn;              

Перевод
строки

WriteLn
(‘Полученная матрица:’);

Сообщение
пользователю о выводе результата

For
i := 1 To N1 Do            

Цикл
для
i
от 1 до N1

Begin    

Начало
тела цикла

For
j := 1 To M2 Do           

Цикл
для j от 1 до M2

Write
(Z [i, j] : 5);

Форматированный
вывод в строку очередного элемента
массива Z

WriteLn;              

Перевод
строки

End;      

Конец
тела цикла

ReadLn;

Ожидание
нажатия клавиши Enter для завершения

End.       

Конец
программы.

Умножение матриц

Пусть
даны матрица

размерности n 
m и матрица

размерности m 
k. Матрица

размерности n 
k равна произведению матриц A и B, если
ее элементы определены по формуле


.

Рассмотрим
пример умножения матрицы A размерности
2 
3 на матрицу B размерности 3 
4. Матрица C, равная произведению матриц
A и B будет иметь размерность 2 
4.

Блок-схема алгоритма
умножения матриц A и B представлена на
рис. 23.

Рис.23.
Блок-схема алгоритма умножения матриц.

Программа.

program Umnozh_matrix;

Const

m=3;

n=2;

k=4;

Var

A : array[1..n,1..m] of
integer;

B : array[1..m,1..k] of
integer;

C : array[1..n,1..k] of
integer;

i,j,l : Integer;

BEGIN

Writeln(‘Ввод
матрицы
A’);

for i:= 1 to n do

begin

writeln(‘Cтрока’,i:2);

for j := 1 to m do

begin

write(‘Столбец’,j:2,’->’);

readln(A[i,j])

end;

end;

Writeln(‘Ввод
матрицы
B’);

for i:= 1 to m do

begin

writeln(‘Cтрока’,i:2);

for j := 1 to k do

begin

write(‘Столбец’,j:2,’->’);

readln(B[i,j])

end;

end;

writeln(‘Матрица С
– умножение матриц A и B’) ;

for
i:= 1 to n do begin

for j := 1
to k do begin

C[i,j]
:= 0 ;

for l := 1
to m do

C[i,j]
:= C[i,j] +A[i,l] * B[l,j] ;

write(C[i,j]:3)

end
;

writeln
;

end

End.

Символы и строки

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

Символы

Для
хранения и обработки отдельных символов
используются переменные типа CHAR.
Значением переменной типа CHAR может быть
любой символ.

Переменная
символьного типа должна быть объявлена
в разделе описания переменных так:

Имя : CHAR ;

где
Имя

имя переменной символьного типа; CHAR

ключевое слово обозначения символьного
типа.

Примеры: otv : char ;

ch : char ;

Как
и любая переменная программы, переменная
типа CHAR может получить значение в
результате выполнения инструкции
присваивания или ввода (READ, READLN). Если
переменная типа CHAR получает значение
в результате выполнения операции
присваивания, то справа от знака := должно
стоять выражение типа CHAR, например,
переменная типа CHAR или символьная
константа
символ, заключенный в двойные кавычки.

В результате
выполнения программы

Var c1,c2,otvet : char ;

Begin

c1 := ‘*’ ;

c2
:= c1 ;

write(‘Вы хотите
научиться программированию ?’) ;

readln(otvet)
;

writeln(‘Ваш
ответ
:’, otvet)

End.

переменная
c1 получает значение присваиванием
значения константы, c2 
присваиванием значения переменной c1,
а значение переменной otvet вводится с
клавиатуры.

Обратим внимание:
переменная otvet объявлена как CHAR, т. е.
один символ. Поэтому если в ответ на
вопрос программы будет введено, например,
слово “Да”, то переменная otvet получит
значение ’Д’.

Переменную
типа CHAR можно сравнить с другой переменной
типа CHAR или с символьной константой.
Сравнение основано на том, что каждому
символу поставлено в соответствие
число, причем символу ‘0’ соответствует
число меньшее, чем символу ‘9’, символу
‘A’ 
меньшее, чем ‘B’, символу ‘Z’ 
меньшее, чем ‘a’. Таким образом можно
записать

‘0’
< ‘1’ < . . . < ‘9’ < . . . <
‘A’ < ‘B’ < . . . <‘Z’ < ‘a’ < ‘b’
< . . . <‘z’.

Символам
русского алфавита соответствуют числа
большие, чем символам латинского
алфавита, при этом справедливо следующее:

‘А’ < ‘Б’ <
‘В’ < . . . < ‘Ю’ < ‘Я’ < ‘а’ <
‘б’ < ‘в’ < . . . <‘э’ < ‘ ю’ <
‘я’.

Переменные
и константы типа CHAR можно использовать
при конструировании условий. В программе

Var otvet : char ;

begin

. . .

writeln(‘Продолжить
вычисления ? (д
/ н)
‘ ) ;

readln(otvet) ;

if
(otvet=‘Д’)
or (otvet=‘д’)
then begin

.
. .

end ;

end.

переменная otvet
используется для проверки ответа на
запрос программы.

Обратим
внимание: программа сравнивает ответ
с двумя константами ‘д’ и ‘Д’, так как
переменная otvet может получить ‘д’, если
клавиша нажата <д> без <Shift>, или
‘Д’, если с <Shift>.

Каждый
символ кодируется числом. Однако не все
символы есть на клавиатуре. Например,
на клавиатуре нет символов, с помощью
которых рисуются рамки. Если в программе
нужно ввести на экран символ, которого
нет на клавиатуре, то можно воспользоваться
функцией CHR, возвращающей в качестве
значения символ, код которого указывается
при обращении к функции. Например, в
результате выполнения инструкции ch :=
Chr(218) ; значением переменной ch будет
символ ‘‘
(переменная ch, естественно, должна быть
объявлена как CHAR).

Следующая программа
использует функцию CHR для оформления
выводимого текста.

Program Example ;

VAR

tl,tr,bl,br,g,v : Char ;

i : Integer ;

BEGIN

tl :=chr(218) ;

tr := chr(191) ;

bl := chr(192) ;

br := chr(217) ;

g := chr(196) ;

v := chr(179) ;

write(tl) ;

for i := 1 to 34 do
write(g) ;

writeln(tr)
;

writeln(v,’ Пример
использования функции CHR ‘,v) ;

writeln(v,’
для рисования рамки.
‘,v)
;

write(bl) ;

for i := 1 to 34 do
write(g) ;

writeln(br)

END.

Вот результат
работы программы:

Пример
использования функции CHR

для
рисования рамки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
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.

ЗАДАЧА 6.10. Написать программу умножения двух матриц: A(N, M ) и B(M, L).

Напомним некоторые сведения из курса математики. Умножать можно только матрицы, у которых количество столбцов в первой матрице совпадает с количеством строк во второй матрице. Матрицапроизведение имеет столько строк, сколько было в первой матрице и столько столбцов, сколько было во второй. Таким образом, при умножении матрицы A(N,M) на матрицу B(M,L) получается матрица C(N,L). Каждый элемент матрицы C[i,j] является скалярным произведением i-й строки матрицы A и j-го столбца матрицы B. В общем виде формула для нахождения элемента c_{i,j} матрицы имеет вид:

Блок-схема умножения двух матриц

Рис.
6.29.
Блок-схема умножения двух матриц

c_{i,j}=sumlimits_{k=1}^{M}a_{ik}b_{kj}, (
6.1)

где i = 1,..., N и j = 1,..., L.

Рассмотрим более подробно формирование матрицы C(3,2) как произведения матриц A(3,3) и B(3,2).

left(begin{matrix} 
c_{11}&c_{12}\
c_{21}&c_{22}\
c_{31}&c_{32}end{matrix}right)=
left(begin{matrix}
a_{11}b_{11}+a_{12}b_{21}+a_{13}b_{31}&
a_{11}b_{12}+a_{12}b_{22}+a_{13}
b_{32}\
a_{21}b_{11}+a_{22}b_{21}+a_{23}b_{31}&
a_{21}b_{12}+a_{22}b_{22}+a_{23}b_{32}\
a_{31}b_{11}+a_{32}b_{21}+a_{33}b_{31}&
a_{31}b_{12}+a_{32}b_{22}+a_{33}b_{32}
end{matrix}right).

Следует помнить, что A cdot B not = B cdot A.

Блок-схема, реализующая умножение каждого элемента матрицы 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.

Результаты работы программы умножения двух матриц

Рис.
6.30.
Результаты работы программы умножения двух матриц

Program Pro_39 (Input, Output);
Var 
X, Y, Z : Array [1..20, 1..20] Of Integer; 
N1, M1, N2, M2: Integer;
i, j, k: Integer;
S : Integer;
Begin
 
WriteLn ('PASCAL:Нахождение произведения двух матриц.');
 
Write ('Введите количество строк первой матрицы: '); 
ReadLn (N1); 
Write ('Введите количество столбцов первой матрицы: '); 
ReadLn (M1);
WriteLn ('Введите поочередно элементы первой матрицы:'); 
For i := 1 To N1 Do
For j := 1 To M1 Do 
Begin
Write ('X[', i, ',', j, '] = ');
ReadLn (X [i, j] );
End;
 
WriteLn ('Число строк 2-ой матрицы равно числу столбцов 1-ой матрицы.');
N2 := M1; 
Write ('Введите количество столбцов второй матрицы: '); 
ReadLn (M2);
WriteLn ('Введите поочередно элементы второй матрицы:'); 
For i := 1 To N2 Do
For j := 1 To M2 Do 
Begin
Write ('Y[', i, ',', j, '] = ');
ReadLn (Y [i, j] );
End;
 
For i := 1 To N1 Do
For j := 1 To M2 Do 
Begin
S := 0;
For k := 1 To N2 Do 
S := S + X [i, k] * Y [k, j]; 
Z [i, j] := S; 
End;
 
WriteLn;
WriteLn ('Полученная матрица:');
For i := 1 To N1 Do
Begin
For j := 1 To M2 Do 
Write (Z [i, j] : 5);
WriteLn;
End;
 
ReadLn;
End.

Добавить комментарий