Code:
var a:array[1..50,1..50] of real;
n,i,j,k,duong,x,y: integer;
s,m:real;
begin
writeln;
write(' nhap do dai 1 chieu cua mang :');
readln(n);
for i:=1 to n do
begin
for j:= 1 to n do
begin
write(' nhap phan tu ');
read( a[i,j]); write(a[i,j],' ');
end;
writeln;
end;
writeln;
write(' tong duong cheo chinh: ');
s:=0;
for i:=1 to n do s:=s+a[i,i];
write(s:5:3);
writeln;
write(' in dong 2: ');
for i:=1 to n do write(a[2,i],' ');
writeln(' in cot 3:');
for i:=1 to n do writeln(a[i,3]);
writeln(' nhap k: '); read(k);
writeln(' in phan tu o dong ',k);
for i:= 1 to n do write(a[k;i],' ');
writeln(' xet so duong'); duong:=0;
for i:= 1to n do
for j:= 1 to n do
begin if a[i,j] > 0 then duong :=duong+1;
write(a[i,j],' ');
end;
writeln(' co ',duong,' so duong');
{tim phan tu dong x cot y}
writeln(' nhap x , y ');
read(x,y); writeln(' phan tu dong ',x,' cot ',y,' la: ',a[x,y]);
writeln('nhap m ');read(m);
for i:= 1 to n do
for j:=1 to n do if m=a[i,j] then
begin
write(m,' o vi tri dong ',i,' cot ',j );
break;
break;
readln;
end.
[=========> Bổ sung bài viết <=========]
Cách để kiểm tra tính đối xúng của ma trận nè bạn :
Code:
Kiemtra := TRUE;
For i:=1 to N do
For j:=1 to N do
if A[i, j]<>A[j, i] then Kiemtra:=FALSE ;
If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘)
else
writeln(‘ Không đối xứng ‘);
Trong đó Kiemtra là một biến kiểu lôgic.
Nhận xét rằng hai lệnh For ở trên quét qua tất cả các phần tử của ma trận nên có hơn nửa số lần lặp là thừa. Thật vậy, đường chéo chính chia ma trận ra làm hai phần: nửa trái và nửa phải. Các phần tử trên đường chéo chính thì đối xứng với chính nó nên không cần phải kiểm tra. Nếu mỗi phần tử ở nửa bên trái đều bằng phần tử đối xứng với nó ở nửa bên phải thì ma trận rõ ràng là đối xứng. Vì vậy chỉ cần duyệt kiểm tra các phần tử ở nửa bên trái đường chéo chính là đủ (vùng tam giác).
Thuật toán tốt hơn được đề nghị là :
Code:
Kiemtra := TRUE;
For i:=2 to N do
For j:=1 to i-1 do
if A[i, j]<>A[j, i] then Kiemtra:=FALSE ;
If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘)
else
writeln(‘ Không đối xứng ‘);
Hai câu lệnh For trên vẫn còn một nhược điểm là: khi xảy ra A[i,j]<>A[j, i] rồi, lẽ ra có thể dừng lại và kết luận không đối xứng ngay thì các vòng For vẫn tiếp tục, i chạy đến N và j đến i-1.
Bạn có thể chỉnh lại bằng cách thêm break vào :
Code:
Kiemtra := TRUE;
For i:=2 to N do
For j:=1 to i-1 do
if A[i, j]<>A[j, i] then
Begin
Kiemtra:=FALSE ;
Break;
Break;
End;
If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘)
else
writeln(‘ Không đối xứng ‘);
Sử dụng câu lệnh While sẽ khắc phục được nhược điểm này. Chỉ cần xảy ra A[i,j]<>A[j,i] một lần là biến Kiemtra được gán ngay gía trị FALSE, khi đó điều kiện Kiemtra=TRUE bị sai và cả hai vòng lặp đều kết thúc .
Code:
Kiemtra:=TRUE;
i:=2;
While (Kiemtra=TRUE) and (i<= N) do
begin
j:=1;
While ( Kiemtra=TRUE) and ( j<=i-1) do
if A[i, j] <> A[j, i] then Kiemtra:=FALSE
else
j:=j+1;
i:=i+1;
end;
If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘)
else
writeln(‘ Không đối xứng ‘);
[/QUOTE]
Bookmarks