Нахождение
произведения двух матриц.
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) получается матрица C(N,L). Каждый элемент матрицы C[i,j] является скалярным произведением i-й строки матрицы A и j-го столбца матрицы B. В общем виде формула для нахождения элемента матрицы имеет вид:
Рис.
6.29.
Блок-схема умножения двух матриц
( 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.
Рис.
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.