Tải bản đầy đủ (.doc) (5 trang)

Biểu diễn ma trận

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (66.14 KB, 5 trang )

Biểu diễn ma trận trên máy tính
Phan Thanh Â'n
Các bạn lập trình trên Turbo Pascal không xa lạ gì với dữ liệu kiểu mảng Arraỵ Đây là kiểu
dữ liệu quan trọng thường được ứng dụng để giải các bài toán trên máy tính, tìm kiếm và
sắp xếp... Tuy nhiên, có một nhược điểm là khi nhập và xuất dữ liệu ta phải nhập và xuất
từng phần tử một của mảng và các phần tử của mảng hiện ra lần lượt trên màn hình thông
qua chỉ số của phần tử. Điều này có thể làm cho các bạn cảm thấy chẳng hấp dẫn lắm khi
làm việc với mảng và đôi khi khó định hình được mảng khi mảng hơi lớn một chút. Sau
đây là thủ thuật để làm cho mảng của bạn trông giống như ma trận khi biểu diễn trên màn
hình và đồng thời khi nhập giá trị cho các phần tử của mảng cũng trực quan và linh động
hơn là cách thông thường bạn vẫn làm. Đối với viẹc nhập dữ liệu có tính chất thử khi lập
trình ta chỉ việc dùng vòng lặp chạy từ phần tử đầu đến phần tử cuối của mảng và gán cho
mỗi phần tử của mảng một giá trị ngẫu nhiên là xong. Trường hợp các giá trị hoặc số liệu
có tính chất thực tế hoặc bắt buộc phải nhập vào thì ta phải nhập từng giá trị cho đúng mà
thôị Tuy nhiên với cách biểu diễn mảng sau đây thì việc nhập cũng dễ dàng hơn. Đối với
các hàng của mảng ta không cần căn lề ở giữa màn hình mà chỉ cần cho chạy từ dòng đầu
tiên trên màn hình đến khi nào hết mảng thì thôi, tất nhiên đối với những bài chúng ta
thường làm thì rất ít mảng có số dòng vượt quá số dòng màn hình. Đối với các cột ta căn lề
tuỳ theo số cột của mảng sao cho mảng nằm cân đối giữa màn hình với khoảng cách nhất
định. Thường khi biểu diễn mảng ta thường dùng hai vòng lặp For lồng nhau, đoạn lệnh
sau mô tả cách căn lề cho các cột của mảng:
d := 1;
for i:= 1 to m do
begin
k:= (42- n*7 div 2);
for j:= 1 to n do
begin
randomize;
A[ i, j] := random (10);
gotoxy ( k, d);
if (A[ i, j] = trunc ( A[ i, j] ) ) then write( A[ i, j]: 0: 0)


else write ( A[ i, j] : 0: 1);
{ readln( A[ i, j] ); }
inc( k, 7);
end;
inc( d, 2);
end;
Trong đoạn lệnh trên biến d dùng để biểu diễn vị trí của hàng, ở đây d = 1 tức là hàng thứ
nhất bắt đầu từ dòng thứ nhất của màn hình, sau mỗi vòng lặp for lớn ở ngoài thì giá trị của
d tăng thêm 2 đơn vị tức là cứ hai dòng của màn hình thì ta biểu diễn một dòng của mảng.
Biến k dùng để căn lề cho các cột của mảng. Bản chất của việc căn lề như sau: Chia đôi
màn hình hiển thị (ở đây lấy giá trị 42) sau đó đem trừ đi số cột của mảng nhân với khoảng
cách các cột (ở đây lấy giá trị 7) chia cho 2. Trong vòng lặp for thứ hai, sau mỗi giá trị tăng
của biến j thì giá trị của k tăng thêm 7 tức là các cột của mảng cách đều nhau 7 đơn vị.
Lệnh nhảy gotoxy( k, d) dùng để đưa con trỏ màn hình tới vị trí mong muốn có toạ độ ( k,
d) để viết ra các giá trị của mảng. Câu lệnh if chỉ có tác dụng trong nhập liệu tự động và
khi in kết quả ra màn hình, nó bỏ dấu chấm và số không ở sau các số nguyên nhưng các số
thực thì vẫn giữ lại và lấy một số thập phân sau dấu phảỵ Bạn có thể bỏ câu lệnh if này
cùng lệnh gán A[i, j] := random(10; trong vòng for thứ hai khi bạn muốn nhập liệu bằng
taỵ
Trên đây tôi vừa trình bày cách để trình bày mảng trên máy tính trông giống như ma trận
toán học để bạn dễ hình dung mảng, dễ nhập liệu cũng như không cảm thấy nhàm chán khi
làm viêc với mảng. Bạn có thể cải tiến thêm như căn lề cho các hàng để mảng luôn nằm
giữa màn hình trên dưới đều bằng nhaụ Sau đây là chương trình mẫu tôi viết minh hoạ,
mong nhận được ý kiến đóng góp của các bạn.
Chương trình nhân hai mảng thực:
Program bdmtbtmt;
uses crt;
var
A, B, C: array[ 1..50, 1..50] of real;
tg: real;

m, n, h, i, j, k, d: longint;
congviec : byte;
begin
repeat
textattr := red*16 + lightcyan;
clrscr;
gotoxy(80, 25);
delay(500);
gotoxy(25, 9);
write('BAN CHON CAC VIEC SAU' );
gotoxy(80, 25);
delay(100);
textcolor(yellow);
gotoxy(25, 10);
write(' 0. THOAT CHUONG TRINH ' );
gotoxy(80, 25);
delay(100);
textcolor(lightgreen);
gotoxy(25, 11);
write('1. NHAN HAI MANG THUC ' );
gotoxy(80, 25);
textcolor(lightcyan);
gotoxy(25, 12);
write(' CONG VIEC BAN CHON LA: ' );
textcolor(lightgreen);
readln(congviec);
case congviec of
1:begin
textattr:= magenta*16 + white;
clrscr;

gotoxy(20, 9);
write(' So hang cuc dai cua ma tran A la:' );
textcolor(lightgreen);
readln(m);
textcolor(white);
gotoxy(20, 11);
write(' So cot & hang cua ma tran A & B la: ' );
textcolor(lightgreen);
readln(n);
textcolor(white);
gotoxy( 20, 23);
write(' So cot cuc dai cua ma tran B la :' );
textcolor( lightgreen);
readln( h);
if ( m<= 0) or ( n<= 0) or ( h<= 0) then
begin
textattr := red*16 + white;
clrscr;
gotoxy( 20, 10);
write(' Ma trn khong ton tai voi so hang va cot dó );
gotoxy( 80, 25);
readln;
end;
if ( m > 12) or ( n > 10) or ( h >10) then
begin
textattr:=red*16 + white;
clrscr;
gotoxy(22,10);
write('Ma tran hien thi khong dep mat');
gotoxy(80,25);

readln;
end;
if not ((m<=0) or (n <=0) or (h <= 0)) and
not ((m>12) or (n >10) or (h >10)) then
begin
textattr:= magenta*16 + lightgreen;
clrscr;
gotoxy(22,10);
write('Bat dau nhap du lieu cho ma tran A');
gotoxy(80,25);
delay(3000);
clrscr;
d:=1;
for i:=1 to m do
begin
k:= (42 - n*7 div 2);
for j:=1 to n do
begin
A[ i, j] := random (10);
gotoxy ( k, d);
if (A[ i, j] = trunc ( A[ i, j] ) ) then write( A[ i, j]: 0: 0)
else write ( A[ i, j] : 0: 1);
{ readln( A[ i, j] ); }
inc( k, 7);
end;
inc( d, 2);
end;
gotoxy(80,25);
delay(3000);
clrscr;

gotoxy(22,10);
write('Bat dau nhap du lieu cho ma tran B');
gotoxy(80,25);
delay(3000);
clrscr;
d:=1;
for i:=1 to n do
begin
k:= (42 - n*7 div 2);
for j:=1 to h do
begin
B[ i, j] := random (10);
gotoxy ( k, d);
if (B[ i, j] = trunc ( B[ i, j] ) ) then write( B[ i, j]: 0: 0)
else write ( B[ i, j] : 0: 1);
{ readln( B[ i, j] ); }
inc( k, 7);
end;
inc( d, 2);
end;
gotoxy(80,25);
delay(3000);
{Thuc hien nhan hai ma tran}
for i:=1 to m do
for j:=1 to n do
begin
c[i,j] := 0;
for k:=1 to n do
c[i,j] := c[i,j] + a[i,k]*b[k,j];
end;

textattr := magenta*16 + lightgreen;
clrscr;
gotoxy(80,25);
delay(1000);
gotoxy(20,10);
write('Ma tran tich cua hai ma tran A va B nhu saú);
gotoxy(80,25);
delay(3000);
clrscr;
d:=1;
for i:=1 to m do
begin
k:= (42 - n*7 div 2);
for j:=1 to h do
begin
gotoxy ( k, d);
if (C[ i, j] = trunc (C[ i, j] ) ) then write(C[ i, j]: 0: 0)
else write (C[ i, j] : 0: 1);
{ readln(C[ i, j] ); }
inc( k, 7);
end;
inc( d, 2);
end;
gotoxy(80,25);
readln;
end;
end;
end;
until congviec = 0;
end.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×