Bài 1: Phần tử aij của ma trận nguyên dương A cấp mxn được gọi là H2-chính phương nếu nó là số chính phương, đồng thời là phần tử lớn nhất của hàng i, cột j. Hãy tìm các số H2-chính phương của một ma trận nguyên dương A cấp mxn cho trước.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var i,n,j,h,max,m:integer;
a:matran;
{-------------}
procedure nhap(var a:matran;n,m:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to m do
begin
write('Nhap a[',i,',',j,']:');
readln(a[i,j]);
end;
end;
procedure xuat(var a:matran;n,m:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to m do write(a[i,j]:5);
writeln;
writeln;
end;
end;
{-----------------}
function hang(i,m:integer):integer;
var h:integer;
begin
h:=a[i,1];
for j:=2 to m do
if h<a[i,j] then h:=a[i,j];
hang:=h;
end;
{-----------------}
function cot(h,j,n:integer):boolean;
var i:integer;
begin
cot:=false;
for i:=1 to n do
if h<a[i,j] then exit;
cot:=true;
end;
{-----------------}
begin
clrscr;
write('Nhap so dong:');readln(n);
write('Nhap so cot:');readln(m);
nhap(a,n,m);
writeln('Ma tran:');
xuat(a,n,m);
writeln('Cac so H2-chinh phuong :');
for i:=1 to n do
begin
h:=hang(i,m);
for j:=1 to m do
if (a[i,j]=h) and (cot(h,j,n)) and (round(sqrt(a[i,j]))=sqrt(a[i,j])) then
writeln(a[i,j] ,' o hang ',i,' cot ',j);
end;
readln;
end.
Bài 2: Nhập ma trạn vuông cấp n. In ra ma trận B là hiệu của ma trận A và ma trận chuyển vị của nó.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var i,n,j:integer;
a,b:matran;
{-------------}
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
write('Nhap a[',i,',',j,']:');
readln(a[i,j]);
end;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:5);
writeln;
writeln;
end;
end;
{-----------------}
begin
clrscr;
write('Ma tran A co cap do:');readln(n);
nhap(a,n);
writeln('Ma tran A:');
xuat(a,n);
for i:=1 to n do
for j:=1 to n do
b[i,j]:=a[i,j]-a[j,i];
writeln('Ma tran la hieu cua ma tran A va chuyen vi cua ma tran A:');
xuat(b,n);
readln;
end.
Bài 3: Một phần tử được coi là điểm yên ngựa của ma trận, nếu nó là phần tử bé nhất của hàng chứa nó, đồng thời là phần tử lớn nhất của cột chứa nó. Nhập ma trận vuông A và tìm các diểm yên ngựa của ma trận.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var a,b:matran;
i,j,n,vt,h,dem:integer;
(*****)
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
write('Nhap a[',i,',',j,']:');
readln(a[i,j]);
end;
end;
(*****)
procedure xuatmatran(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:5);
writeln;
writeln;
end;
end;
(*****)
function hang(i:integer):integer;
var j:integer;
h:integer;
begin
h:=a[i,1];
for j:=2 to n do
if h>a[i,j] then h:=a[i,j];
hang:=h;
end;
(*****)
function cot(h:integer;j:integer):boolean;
var i:integer;
begin
cot:=false;
for i:=1 to n do
if h<a[i,j] then exit;
cot:=true;
end;
(*****)
begin
clrscr;
write('Nhap cap do ma tran:');readln(n);
nhap(a,n);
writeln('Ma tran ban dau:');
xuatmatran(a,n);
for i:=1 to n do
begin
h:=hang(i);
for j:=1 to n do
if (a[i,j]=h) and cot(h,j) then
writeln('Diem yen ngua la :',a[i,j],'.Hang ',i,' ','cot',' ',j)
end;
readln;
end.
Bài 4: Ma trận vuông A cấp n gọi là ma trận La tinh nếu mỗi hàng, mỗi cột đều là hoán vị của các số trong khoản [1..n]. Nhập vào một ma trận kiểm tra tính chất trên.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
type mang=array[1..100] of integer;
var i,n,j,dem,k,l:integer;
a:matran;
b,x,y:mang;
{-------------}
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
write('Nhap a[',i,',',j,']:');
readln(a[i,j]);
end;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:5);
writeln;
writeln;
end;
end;
{-----------------}
begin
clrscr;
write('Ma tran co cap do:');readln(n);
nhap(a,n);
writeln('Ma tran:');
xuat(a,n);
dem:=0;
for i:=1 to n do
begin
x[i]:=0;y[i]:=0;b[i]:=i;
end;
for i:=1 to n do
begin
for j:=1 to n do
for k:=1 to n do
begin
if (x[k]=0) and (b[k]=a[i,j]) then
begin
inc(dem);
x[k]:=1;
end;
if (y[k]=0) and (b[k]=a[j,i]) then
begin
inc(dem);
y[k]:=1;
end;
end;
for l:=1 to n do
begin
x[l]:=0;y[l]:=0;
end;
end;
if dem=n*n+n*n then writeln('Ma tran nay la ma tran La tinh')
else writeln('Ma tran nay khong phai la ma tran La tinh');
readln;
end.
Bài 5: Ma trận được gọi là ma phương nếu tổng mỗi hàng, tổng mỗi cột, tổng mỗi đường chéo bằng nhau. Nhập ma trận vuông A cấp n, kiểm tra tính ma phương.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var i,n,j,sh,sc,sdcc,sdcp,dem,s:integer;
a:matran;
{-------------}
procedure nhap(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
write('Nhap a[',i,',',j,']:');
readln(a[i,j]);
end;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:5);
writeln;
writeln;
end;
end;
{-----------------}
begin
clrscr;
write('Ma tran co cap do:');readln(n);
nhap(a,n);
writeln('Ma tran:');
xuat(a,n);
s:=0;dem:=0;
sdcc:=0;sdcp:=0;
for i:=1 to n do s:=s+a[1,i];
for i:=1 to n do
begin
sh:=0;sc:=0;
for j:=1 to n do
begin
sh:=sh+a[i,j];
sc:=sc+a[j,i];
end;
sdcc:=sdcc+a[i,i];
sdcp:=sdcp+a[i,n-i+1];
if sh=s then inc(dem);
if sc=s then inc(dem);
end;
if sdcc=s then inc(dem);
if sdcp=s then inc(dem);
if dem=2*n+2 then writeln('Ma tran tren la ma phuong')
else writeln('Ma tran tren khong phai la ma phuong');
readln;
end.
Bài 6: Viết chương trình tạo 2 ma trận vuông A và B cùng cấp n, với n là số tự nhiên nhập tự bàn phím (n<20), các phần tử của mảng là các số tự nhiên được sinh ngẫu nhiên có giá trị từ 0 đến 99. Hãy thực hiện các yêu cầu sau:
a) Tìm ma trận C là ma trận có các phần tử là tổng các phần tử tương ứng của 2 ma trận A và B.
b) Sắp xếp ma trận C tăng dần theo hình xoắn ốc cùng chiều kim đồng hồ.
Bài giải:
uses crt;
type matran=array[1..100,1..100] of integer;
var d:array[1..100] of integer;
i,n,j,k,m,t:integer;
a,b,c:matran;
{------------------}
procedure sx(var a,b:integer);
var tam:integer;
begin
tam:=a;
a:=b;
b:=tam;
end;
procedure xuat(var a:matran;n:integer);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j]:5);
writeln;
writeln;
end;
end;
procedure mttong(var a,b,c:matran;n:integer);
begin
for i:=1 to n do
for j:=1 to n do c[i,j]:=a[i,j]+b[i,j];
end;
{------------------}
begin
clrscr;
write('Hai ma tran co cap:');readln(n);
randomize;
for i:=1 to n do
for j:=1 to n do
begin
a[i,j]:=random(99);
end;
for i:=1 to n do
for j:=1 to n do
begin
b[i,j]:=random(98)+1;
end;
writeln('Ma tran A:');xuat(a,n);
writeln('Ma tran B:');xuat(b,n);
mttong(a,b,c,n);
writeln('Ma tran C co cac phan tu la tong ma tran A va B:');
xuat(c,n);
k:=0;
for i:=1 to n do
for j:=1 to n do
begin
inc(k);
d[k]:=c[i,j];
end;
for i:=1 to k-1 do
for j:=i+1 to k do
if d[i]>d[j] then sx(d[i],d[j]);
t:=0;m:=0;i:=0;j:=0;
repeat
inc(i);
inc(j);
while (j<=(n-m)) and (t<k) do
begin
inc(t);
c[i,j]:=d[t];
inc(j);
end;
dec(j);
inc(i);
while (i<=(n-m)) and (t<k) do
begin
inc(t);
c[i,j]:=d[t];
inc(i);
end;
dec(i);
dec(j);
while (j>=(m+1)) and (t<k) do
begin
inc(t);
c[i,j]:=d[t];
dec(j);
end;
inc(j);
dec(i);
while (i>=(m+2)) and (t<k) do
begin
inc(t);
c[i,j]:=d[t];
dec(i);
end;
inc(m);
until t=k;
writeln('Ma tran C theo hinh xoan oc tang dan cung chieu kim dong ho:');
xuat(c,n);
readln;
end.