Задача : Заданы две матрицы А и Б порядка 3*3. Проверить будет ли произведение этих матриц коммутативным т.э. АБ=БА. Если Да - напечатать "АБ=БА", нет - "Произведение некоммутативное". Программу решить с помощью подпрограммы процедуры. Вот мой скрипт
program lab5_2;
uses crt;
type mass=array[1..50,1..50] of integer;
var i,j:integer; a:mass; b:mass;flag:boolean;
procedure matr(a,b:mass; i,j:integer;flag:boolean; var ab,ba:mass);
begin
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
ab[i,j]:=(a[i,j])*(b[j,i]); {matrica A*b}
write (ab[i,j]:6);
end;
writeln;
end;
writeln;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin {martica B*A}
ba[i,j]:=(b[i,j])*(a[j,i]);
write (ba[i,j]:6);
end;
writeln;
end;
writeln;
flag:=true;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
if ab[i,j]<>ba[i,j] then
begin {sravnenie AB i BA}
flag:=false;
break;
end;
end;
if ab[i,j]<>ba[i,j] then break;
end;
end;
begin
clrscr;
randomize;
for i:=1 to 3 do
begin
for j:=1 to 3 do {Vvod elementov v matricy A}
begin
a[i,j]:=random(1);
write (a[i,j]:6);
end;
writeln;
end;
writeln;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
b[i,j]:=random(1);
write (b[i,j]:6); {Vvod elementov v matricy B}
end;
writeln;
end;
writeln ;
matr (a,b,0,0,true,a,a); {Vb)zov podprogramb)}
if flag=true then write ('AB=BA')
else write ('Proizvedenie nekomutativnoe');
readkey;
end.
Умножает матрицы правильно, (выводит на экран 2 исходные и 2 перемноженые) Но не работает сравнение АБ=БА Подскажите в чём дело ...
ПОМОГИТЕ НАЙТИ ОШИБКУ
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Главная ошибка - произведение матриц считается не так:
ab[i,j]:=(a[i,j])*(b[j,i]); {matrica A*b}
А как-то совершенно по-другому. Как конкретно - вспомнить сложно, я в свое время на экзамене по линейке завалился именно на этом некоммутативном произведении.
Во-вторых, простите меня, Trill, но ваш стиль программирования приводит меня в ужас.
А вообще, если пытаться привести вашу программу к рабочему виду с минимальными изменениями - это делается так:
1. Заменить
procedure matr(a,b:mass; i,j:integer;flag:boolean; var ab,ba:mass);
на
procedure matr(a,b:mass; i,j:integer;var flag:boolean; var ab,ba:mass);
2. Заменить
matr (a,b,0,0,true,a,a); {Vb)zov podprogramb)}
на
matr (a,b,0,0,flag,a,a); {Vb)zov podprogramb)}
ab[i,j]:=(a[i,j])*(b[j,i]); {matrica A*b}
А как-то совершенно по-другому. Как конкретно - вспомнить сложно, я в свое время на экзамене по линейке завалился именно на этом некоммутативном произведении.
Во-вторых, простите меня, Trill, но ваш стиль программирования приводит меня в ужас.
А вообще, если пытаться привести вашу программу к рабочему виду с минимальными изменениями - это делается так:
1. Заменить
procedure matr(a,b:mass; i,j:integer;flag:boolean; var ab,ba:mass);
на
procedure matr(a,b:mass; i,j:integer;var flag:boolean; var ab,ba:mass);
2. Заменить
matr (a,b,0,0,true,a,a); {Vb)zov podprogramb)}
на
matr (a,b,0,0,flag,a,a); {Vb)zov podprogramb)}
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Большое спасибо за помощь!!! Но не судите строго, я учу паскаль 3 месяца =) А на счёт умножения матриц программа работает правильно. Запустите её и убедитесь =)