Các phép toán thực hiện trên ma trận thực - Pdf 32

Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------

CHƯƠNG I : ĐẶT VẤN ĐỀ
I MỤC ĐÍCH CỦA ĐỢT THỰC TẬP
Qua đợt thực tập này sẽ tạo điều kiện để sinh viên nghiên cứu sâu hơn
về một số vấn đề được giới thiệu trên lớp học.Qua đó nâng cao khả năng sử
dụng ngôn ngữ lập trình,làm quen dần với việc giải quyết các bài toán ứng
dụng .
II ĐỀ TÀI THỰC TẬP
1 . Tên đề tài : Các phép toán thực hiện trên ma trận thực
2 . Nội dung và yêu cầu của đề tài :
Nội dung :
Xây dựng chương trình thực hiện các phép toán trên ma trận thực:
cộng ,trừ,nhân hai ma trận : tính định thức ma trận vuông bằng cách dùng
công thức hoán vị,từ đó tìm hạng của ma trận vuông C.

det C =


p
p)(
)1(
σ
c
1
1 j
c
2
2 j
…..c

• Khi tìm hạng của ma trận A ,hiển thị được ma trận con cấp cao
nhất có định thức khác 0 bằng mầu khác với phần còn lại của A.
• Tính toán được trên ma trận kích thước lớn với thời gian chấp
nhận được(200*200).
• Hiển thị được các kết quả trung gian khi có yêu cầu (ma trận
,biểu thức tính toán…)
III . CÁC NHIỆM VỤ CỤ THỂ ĐẶT RA TRONG ĐỀ TÀI
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
1
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------
Ngoài các nội dung chính thực hiện trên ma trận thực :cộng ,trừ ,nhân
hai ma trận,tính định thức ma trận vuông dùng công thức hoán vị và tìm hạng
của ma trận vuông ,để giải quyết đề tài một cách trọn vẹn ta còn phải tạo dữ
liệu vào cho chương trình thông qua file văn bản và tạo giao diện(menu) cho
chương trình .Như vậy với đề tài này thì các nhiệm vụ đặt ra là :
1. Tạo dữ liệu đầu vào ( Tạo file lưu trữ các thông tin về ma trận)
2. Thực hiện các phép toán trên ma trận thực :
• Cộng hai ma trận.
• Trừ hai ma trận .
• Tích hai ma trận .
• Tính định thức của ma trận vuông.
• Tính hạng của ma trận vuông.
3. Tạo giao diện cho chương trình
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
2
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------

A. CÁC HÀM VÀ THỦ TỤC TRONG CHƯƠNG TRÌNH
Chương trình bao gồm các hàm sau :
void nhapmatran ( ) ;
void matranngaunhien ( ) ;
void matrannhaptufile ( ) ;
void tong ( ) ;
void hieu ( ) ;
void tich ( ) ;
void dinhthuc ( int n1 ) ;
void hang ( );
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
3
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------
void tongmatran ( ) ;
void hieumatran ( ) ;
void tichmatran ( );
void dinhthucvahangmatran ( ) ;
void hienthifile ( ) ;

Trong đó các hàm được xây dựng theo cấu trúc sau :
Chương trình chính sẽ gọi là main ( )
Từ hàm main se gọi đến 1 trong 7 hàm : nhapmatran ,
matranngaunhien , tongmatran , hieumatran , tichmatran ,
dinhthucvahangmatran , hienthifile .
1 . Nhapmatran :
Hàm này làm việc theo một trong hai cách :
+ Nhập ma trận từ file : Gọi hàm tạo file mình đã tạo sẵn:
“Input.txt” ;

này thì nó phải gọi hàm tich ( ); Hàm tich ( );sẽ đưa ra một thủ tục để tính
tích của hai ma trận ( trong chương trình thì đó là ma trận D).Nhưng trong
hàm tichmatran ( ); thi ta phải kiểm tra điều kiện để tồn tại tích của hai ma
trận A và B .
6 . Dinhthucvahangmatran :
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
4
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------
Hàm dinhthucvahangmatran ( ); sẽ đưa ra định thức và hạng của ma
trận vuông C . Trong hàm này thì nó gọi hàm dinhthuc ( ); và hàm hang ( );
Hàm dinhthuc ( ); sẽ đưa ra thủ tục để tính định thức và hàm hang ( ); sẽ
đưa ra thủ tục để tính hạng nhưng sau khi đã xây dựng được hàm
dinhthuc(); của ma trận vuông C.
7 . Hienthifile :
Hàm hienthifile ( ); dùng để hiện thị tất cả các file đã tạo và sử dụng
trong suốt quá trình làm việc :
+ Hiển thị file chứa toàn bộ các ma trận đã được nhập vào (đó là
ma trận A,B,C) .
+Hiển thị file chứa toàn bộ quá trình thiết lập để tính và hiện thị ra
được kết quả của tích ma trận (ma trận D), tổng ma trận(ma trận E), hiệu ma
trận(ma trận F), định thức ma trận và hạng của ma trận.
*******************************************************

B . SƠ ĐỒ THUẬT TOÁN
Trong đề tài này để xây dựng và hoàn thiện chương trình thì ta phải xây
dựng sơ đồ thuật toán với mục đích :
• Tránh những lỗi logic khi thực hiện chương trình.
• Giúp cho người đọc dễ dàng hiểu được code của chương

ra màn hinh : Ta cũng sử dụng hai vòng lặp for :
Ví dụ với ma trận A :
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
5
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------
printf ( “Ma tran A \ n “ ) ;
printf ( “ %d %d “ , m , n ) ;
for ( i=1 ; i<=m ; i++ )
{
printf ( “ \n “ ) ;
for ( j=1 ; j<=n ; j++ )
printf ( “ % 10.2 f “ , A[ i ][ j ] ) ;
}
1.3 Ma trận đọc từ file
Đầu tiên ta phải tạo được dữ liệu đầu vào tức là ta xây dựng file
“Input.txt”, khai báo sâu kiểu chr msg [25] .
Ta sử dụng hàm fgets để đọc dữ liệu và sử dụng hàm atoi ( hàm chuyển ký
tự thành số ) ví dụ như m = atoi(msg) .Sau đó ta hiển thị ra bằng cách sử
dụng hai vòng lặp for :
Với ma trận A :
for ( i = 1 ; i <=m ; i++ )
{
for ( j = 1 ; j<=n ; j++ )
{
fgets ( msg , 25 , stream );
aij=atoi ( msg );
printf ( "A[%d][%d]=%d " , i , j , aij );
}

-------------------------------------------------------------------------------------------------------

2.2 Hiệu ma trận ( hieumatran )
Với hai ma trận bất kỳ đã được nhập A[m][n] và B[p][q] thì ta xây
dựng công thức tổng quát tính hiệu của hai ma trận này. Tuy nhiên trước đó
ta phải kiểm tra xem có tồn tại hiệu của hai ma trận này không:
if ( ( m==p )&&( n==q ) )
+ Nếu điều kiện này được thỏa mãn thì ta tiến hành tính hiệu của hai
ma trận này ( giả sử ma trận hiệu là F[m][n] ).
Ta dùng hai biến chạy i (1<=i<=m )và j (1<=j<=n ) , ma trận hiệu
F[ i ][ j ] = A[ i ][ j ] - B[ i ][ j ]
Ta minh họa bằng thuật toán:
for ( i=1 ; i<=m ; i++)
for ( j=1 ; f<=n ; j++ )
{
F[ i ][ j ] = A[ i ][ j ] - B[ i ][ j ]
}
Sau đó ta hiển thị ma trận hiệu lên màn hình
for ( i=1 ; i<=m ; i++)
{
for ( j=1 ; f<=n ; j++ )
printf ( “%10.2f “ , F[ i ][ j ] ) ;
}
+ Nếu điều kiện này không thỏa mãn thì không tồn tại hiệu.
Ta minh họa thuật toán tính hiệu bằng sơ đồ giải thuật :
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
BEGIN
NHẬP MA TRẬN
TỔNG MA TRẬN

Sau đó ta hiển thị ma trận tích lên màn hình
for ( i=1 ; i<=m ; i++)
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
BEGIN
NHẬP MA TRẬN
HIỆU MA TRẬN
END
m=p&n=
q
8
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------
{
for ( j=1 ; f<=q ; j++ )
printf ( “%10.2f “ , D[ i ][ j ] ) ;
}
+ Nếu điều kiện này không thỏa mãn thì không tồn tại tích .
Ta minh họa thuật toán tính tích bằng sơ đồ giải thuật :

2.4 Hạng và định thức của ma trận vuông ( dinhthucvahangmatran )
Theo yêu cầu của đề tài thì ta phải tìm được định thức của ma trận
vuông C[n1][n1] trước sau đó mới suy ra hạng .
Trước hết ta tìm định thức của ma trận :
Ta dùng kiểu boolean : đặt done=0 ( FALSE )
Nếu như đúng while ( ! done ) thì thuật toán sẽ như sau:
+ Nếu có phần tử trên đường chéo chính bằng không ( C[ i][j ]==0 )
ta đặt giá trị đó là max=0 và m1=i ( gán hàng i là hàng m1)
Dùng một biền phụ k cho biến này chạy (k=i+1 ; k<n1 ; k++ )
Nếu max < trị tuyệt đối của phần tử C[ k ][ i ] thì hàng m1 trở

{
c = C[ i ][ j ];
C[ i ][ j ] = C[m1][ j ];
C[m1][ j ] = c; /* doi hang i va hang m1 */
}
}
if ( m1==i )
{
done = 1;
printf("\n Ma tran la suy bien!\n");
d= 0 ;
}
}
+ Nếu phần tử trên đường chéo chính khác không thì ta tiến hành làm
như sau :
+1 Chia tất cả các phần tử ở hàng thứ i cho C[ i ][ i ] . Để đơn
giản ta đặt c = C[ i ][ i ] sau đó nhân các phần tử còn lại ở hàng thứ i với c.
Cho (i+1<j<n1) thì C[ i ][ j ] = C[ i ][ j ]*c;
+2 Tiến hành khử hàng :Ta dùng biến trung gian k ( k chạy từ
i+1 tới n1 ) sau đó tiến hành khử hàng thứ k theo quy tắc hình chữ nhật
C[ k ][ j ] = C[ k ][ j ] - C[ i ][ j ] * C[ k ][ i ]
Và cho tất cả các phần tử ở cột thứ i bằng 0 tức là : C[ k ][ i ] = 0
Minh họa như sau
If ( C[ i ][ i ] != 0)
{
c=1/C[ i ][ i ];
for( j = i+1 ; j<n1 ; j++ )
C[ i ] [j ] = C[ i ][ j ] * c;
for( k = i+1 ; k<n1 ; k++)
{

xuống và cứ như thế kiểm tra đến khi nào t1=true.và hạng ma trận là : i+2
( do ban đầu ta gán i = n1-1 va sau đó lại giảm i nên hạng ma trận là i+2 )
Ta minh họa như sau :
t1 = true;
i = n1-1;
do
{
for(j=i;j<n1;j++)
{
tg=C[i][j];
if(tg)
t1=false;
}
i--;
}
while(t1);
printf("\n Hang ma tran=%d",i+2);

Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
11
Báo cáo thực tập cơ sở Các phép toán thực hiện trên ma trận thực
-------------------------------------------------------------------------------------------------------
CHƯƠNG III : MÃ NGUỒN
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<values.h>
#define UP 72
#define DOWN 80

printf("\n vao so hang m, so cot n cua ma tran A\n");
fprintf(stream,"\n vao so hang m, so cot n cua ma tran A\n");
printf("m=");
fprintf(stream,"m=");
scanf("%d",&m);
fprintf(stream,"%d",m);
printf("n=");
fprintf(stream," n=");
scanf("%d",&n);
fprintf(stream,"%d",n);
for(i=1;i<=m;i++)
Sinh viên thực hiện : Bùi Văn Bằng
Lớp : Toán Tin_2 – K48
12


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status