1. Trang chủ
  2. » Luận Văn - Báo Cáo

MA TRAN THUA

14 35 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Cấu trúc

  • INFO

  • R

  • C

    • LINK

Nội dung

Đề tài thực tập sở Mà đề 043 Phần II: Ma trËn tha(sparse matrices) I Ma trËn tha lµ ? 1.1 định nghĩa Ma trận tha ma trận có kích thớc lớn v đại đa số phần tử 0, số phần tử khác 1.2 Ví dụ ma trận tha 1.2.1 Ma trận có cấu trúc băng - Ma trËn ®êng chÐo - Ma trËn dêng chéo 1.2.2 Ma trận tam giác Ma trận A ma trận tam giác : +) Dới : Nếu aịj=0 ij Tam giác Tam giác dới GV hớng dẫn: TH.S Đặng Hång LÜnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 26 Đề tài thực tập sở Mà đề 043 1.2.3 Ma trận có phần tử khác bất kú VÝ dô: B= 0 0 1 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 C= 0 II Xây dựng cấu trúc liệu 2.1 cấu trúc mảng biểu diễn ma trận tha Cấu trúc liệu đơn giản để thực lu trữ ma trận tha mảng Thông thờng ma trận đợc lu trữ mét m¶ng chiỊu, gi¶ sư kÝch thíc cđa ma trận (n x m) ta khai báo mảng: array [1 n , m] of mảng; kiểu-phần-tử- Nh vËy ta cã m¶ng hai chiỊu víi (n x m) phần tử, việc lu trữ thực phép toán cách dễ dàng, nhng cách lu trữ chiếm nhiều nhớ Trên máy sử dụng biểu diễn 64 bit, để lu trữ mảng số thực kích thớc 500x500 cần GV hớng dẫn: TH.S Đặng Hồng Lĩnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 27 §Ị tài thực tập sở Mà đề 043 Megabytes, ma trận tha ma trận đặc biệt, số phần tử cần quan tâm (khác không) Ýt Ta sÏ xem xÐt c¸ch biƠu diƠn ma trËn tha cách kinh tế 2.2 cấu trúc danh sách để biểu diễn ma trận tha 2.2.1 Danh sách liên kết đơn Mỗi phần tử danh sách đợc lu trữ phần tử nhớ mà ta gọi nút (node) Các nút nằm chỗ nhớ Đối với nút phần chứa thông tin, chứa vị trí trỏ tới phần tử khác dòng danh sách Minh họa qui cách nút: INFO R C LINK Trong : ã Trờng INFO chứa giá trị khác phần tử ã Trờng R ghi số hàng phần tư • Trêng C ghi chØ sè cét cđa phần tử Riêng nút cuối không chứa địa nút ngời ta gán cho "địa đặc biệt" để đánh dấu nút cuối danh sách, gọi "mối nối không" ký hiệu NULL Để truy nhập đến phần tử danh sách cần thiết phải sử dụng biến trỏ trỏ đến phần tử đầu tiên, giả sử L, ta qui ớc danh sách rỗng L=NULL L Để tổ chức danh sách móc nối khả sau cần thiết phải có: GV hớng dẫn: TH.S Đặng Hång LÜnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 28 Đề tài thực tập sở Mà đề 043 ã Tồn phơng tiện để chia nhớ thành nút nút truy nhập đến trờng ã Tồn chế để xác định đợc nút sử dụng (gọi nút bận) không sử dụng (gọi nút trống) ã Tồn cấu nh "kho chứa chỗ trống" để cung cấp nút trống cần sử dụng thu hồi nút không sử dụng 2.2.2 Đa danh sách Để thực cài đặt phép toán dễ dàng, thực tính toán truy xuất phần tử ma trận tha hiệu nhanh chóng ta sử dụng cấu trúc Đa danh sách để biểu diễn Một cách tổng quát Đa danh sách cấu trúc bao gồm nhiều nút mà nút có nhiều mối nối phần tử đồng thời nhiều danh sách a Nguyên tắc tổ chức: Ta cần quan tâm đến giá trị khác ma trận tha, nút cấu trúc, ứng với phần tử khác ma trận có quy cách: LEFT UP V R C ã Trờng LEET: chøa trá, trá tíi nót tiÕp theo danh sách nối vòng ứng với hàng (mà ngời ta gọi danh sách hàng) nút nút có số cột nhỏ ã Trờng UP: Chøa trá, trá tíi nót tiÕp theo danh sách nối vòng ứng với cột (mà ngời ta gọi danh sách cột) nút nút có số hàng nhỏ ã Trờng V: ghi giá trị khác phần tử R: ghi số hàng phần tử C: ghi số cột phần tử GV hớng dẫn: TH.S Đặng Hồng LÜnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 29 Đề tài thực tập sở Mà đề 043 Với ma trËn: C= 0 0 0 0 0 Mỗi phần tử chung danh sách hàng danh sách cột Mỗi danh sách có nút đầu danh sách Nút đầu danh sách hàng i có giá trị trờng C đợc trỏ ROW[i], nút đầu danh sách cột j có giá trị trờng R đợc trỏ COL[j], ROW COL véc tơ mà phần tử trỏ Các danh sách hàng danh sách cột đợc tổ chức theo kiểu danh sách nối vòng Với quy định trỏ LEFT UP đà nêu ta thấy danh sách hàng nút đợc móc nối theo chiều giảm cột số, danh sách cột lại theo chiều giảm số hàng III Cài đặt phép toán 3.1 Các thủ tục (Bằng ngôn ngữ Pascal:) GV hớng dẫn: TH.S §Ỉng Hång LÜnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 30 Đề tài thực tập sở Mà đề 043 Procedure Khoitao(var a:ds;m,n:integer); Là thủ tục khởi tạo thành phần đa danh sách a Procedure Dinhvi(var a:ds;p:tropt); Là thủ tục bổ sung phần tử đợc trỏ trỏ P vào đa danh sách a Procedure Nhap(var a:ds;m,n:integer); Lµ thđ tơc cho phÐp nhập phần tử khác Ma trận tha m dòng, n cột vào đa danh sách a Procedure Xuat(a:ds;m,n:integer); Lµ thđ tơc in mét ma trËn tha gồm m dòng, n cột, có phần tử khác đợc lu đa danh sách a Procedure Add(a,b:ds;var c:ds;m,n:integer); Lµ thđ tơc céng hai ma trËn tha mà phần tử khác đợc lu đa danh sách a, b Kết đa danh sách c gồm phần tử khác ma trËn tha tỉng Procedure Sub(a,b:ds;var c:ds;m,n:integer); Lµ thđ tục trừ hai ma trận tha mà phần tử khác đợc lu đa danh sách a, b Kết đa danh sách c gồm phần tử khác ma trận tha hiệu Procedure Mul( a, b:ds; var c:ds; m, t, n:integer); Lµ thủ tục nhân hai ma trận tha mà phần tử khác đợc lu đa danh sách a, b Kết đa danh sách c gồm phần tử khác ma trận tha tích 3.2 Chơng trình (LT ngôn ngữ Pascal.) {==========================Ma Tran Thua==============================} GV hớng dẫn: TH.S Đặng Hồng Lĩnh Nhóm thực hiện: Nhóm Lớp 44E2 CNTT 31 Đề tài thực tập sở Mà đề 043 program matran; uses crt; type tropt=^pt; pt= record left,up:tropt; v,r,c:integer; end; ar=array[1 100]of tropt; ds=record row:ar; col:ar; end; var a,b,c,d,e:ds; i,j,m,n,k,l: integer; { THU TUC } procedure khoitao(var a:ds;m,n:integer); begin for i:=1 to m begin new(a.row[i]); (a.row[i])^.c:=0; (a.row[i])^.left:=a.row[i]; end; for j:=1 to n begin new(a.col[j]); (a.col[j])^.r:=0; (a.col[j])^.up:=a.col[j]; end; end; procedure dinhvi(var a:ds;p:tropt); var q:tropt; begin q:=a.row[p^.r]; while p^.cp^.c Then Begin val:=q^.v; j:=q^.c; q:=q^.left; End Else Begin val:=p^.v+q^.v; j:=p^.c; p:=p^.left; q:=q^.left; End; New(t); t^.v:=val; t^.r:=i; t^.c:=j; dinhvi(c,t); End; End; End; procedure sub(a,b:ds;var c:ds;m,n:integer); var p,q,t:tropt; val:Integer; begin khoitao(c,m,n); For i:=1 to m Begin p:=a.row[i]^.left; q:=b.row[i]^.left; While(p^.c0) or (q^.c0) Begin val:=0; If p^.c>q^.c Then Begin val:=p^.v; j:=p^.c; p:=p^.left; End Else If q^.c>p^.c Then Begin val:=-q^.v; j:=q^.c; q:=q^.left; End GV hớng dẫn: TH.S Đặng Hồng Lĩnh Nhóm thực hiện: Nhóm Lớp 44E2 CNTT 34 Đề tài thực tập së M· ®Ị 043 Else Begin val:=p^.v-q^.v; j:=p^.c; p:=p^.left; q:=q^.left; End; if val0 then begin New(t); t^.v:=val; t^.r:=i; t^.c:=j; dinhvi(c,t); end; End; End; end; Procedure mul(a,b:ds;var c:ds; m,t,n:integer); Var p,arow,bcol:tropt; val:integer; Begin {Khoi tao Ma tran C} KhoiTao(c,m,n); For i:=1 to m For j:=1 to n Begin {Duyet vao hang cua Ma tran A va cot cua Ma tran B} arow:=a.row[i]^.left; bcol:=b.col[j]^.up; val:=0; {Tim cac phan tu tuong ung va thuc hien phep nhan} While(arow^.c0) and (bcol^.r0) If arow^.c>bcol^.r then arow:=arow^.left Else If bcol^.r>arow^.c then bcol:=bcol^.up Else Begin val:=val+arow^.v*bcol^.v; arow:=arow^.left; bcol:=bcol^.up; End; {Neu ket qua khac thi bo sung vao ma tran C} If val0 Then Begin New(P); P^.v:=val; P^.r:=i; P^.c:=j; dinhvi(c,p); End; End; GV híng dẫn: TH.S Đặng Hồng Lĩnh Nhóm thực hiện: Nhóm Lớp 44E2 CNTT 35 Đề tài thực tập sở M· ®Ị 043 End; { CTC } begin clrscr; write('Nhap so hang ma tran a: ');readln(m); write('Nhap so cot ma tran a: ');readln(n); nhap(a,m,n); xuat(a,m,n); write('Nhap so hang ma tran b: ');readln(k); write('Nhap so cot ma tran b: ');readln(l); nhap(b,k,l); xuat(b,k,l); if(mk)or(nl) then begin writeln('Khong thuc hien dc phep cong ma tran khong cung kick co'); if (ml) then writeln('Khong thuc hien dc phep nhan 2') else begin write('TICH C= A x B ');writeln; mul(a,b,c,m,n,l); xuat(c,m,l); end; end else begin writeln; writeln('MA TRAN TONG C');writeln; add(a,b,c,m,n); xuat(c,m,n); writeln('MA TRAN HIEU D');writeln; sub(a,b,c,m,n); xuat(c,m,n); write('TICH C= A x B ');writeln; mul(a,b,c,m,n,l); xuat(c,m,l); end; readln; end 3.3 C¸c Modul toán (bằng ngôn ngữ Bằng C:) a Phần khai b¸o typedef struct danhsach { danhsach *next; int dong; int cot; int info;}; b Thđ tơc nhËp ma trËn void nhap_mt(char name, danhsach *ds, int m, int n) { Nhap du gia tri cho ma tran } c.Thđ tơc in ma trận GV hớng dẫn: TH.S Đặng Hồng Lĩnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 36 §Ị tài thực tập sở Mà đề 043 void in_mt(danhsach *ds, int m,int n) { In ma tran vua nhap man hinh } d Hàm tìm vị trí trả giá trị chúng int locate(danhsach *ds, int i, int j) { } e.Thđ tơc tÝnh tỉng cđa ma trËn void tong_mt(danhsach *ds1, danhsach *ds2, danhsach *ds, int m, int n) { TÝnh tæng hai ma trËn ®· nhËp } f Thđ tơc tÝnh tÝch Ma trËn void tich_mt(danhsach *ds1, danhsach *ds2, int m1, int n1, int n2, danhsach *ds) { TÝnh tÝch hai ma trËn đà nhập } h.Chơng trình void main() { Thực chơng trình đà đợc nhập } 3.4 Chơng trình: (bằng ngôn ngữ C) #include"conio.h" #include"stdio.h" #include"alloc.h" typedef struct danhsach { danhsach *next; int dong; int cot; int info; }; void nhap_mt(char name, danhsach *ds, int m, int n) { danhsach *p, *tam; int i, j, tg; printf("\nNhap ma tran %c:\n",name); p = NULL; tam = ds; ds->next = NULL; for (i=1; idong = i; p->cot = j; p->info = tg; tam = (danhsach*)malloc(sizeof(danhsach)); tam->next = NULL; } } free(tam); } void in_mt(danhsach *ds, int m,int n) { GV hớng dẫn: TH.S Đặng Hång LÜnh Nhãm thùc hiƯn: Nhãm Líp 44E2 CNTT 37 Đề tài thực tập sở Mà đề 043 danhsach *p=ds; int i, j; for (i=1; icot == j) { printf("%5d",p->info); p = p->next; } else printf(" 0"); } } int locate(danhsach *ds, int i, int j) { danhsach *p=ds; while (p != NULL && p->dong < i) p = p->next; if (p != NULL && p->dong == i) { while (p != NULL && p->cot < j) p = p->next; if (p != NULL && p->dong == i && p->cot == j) return p>info; } return 0; } void tong_mt(danhsach *ds1, danhsach *ds2, danhsach *ds, int m, int n) { danhsach *p, *tam; int i, j; p = NULL; tam = ds; ds->next = NULL; for (i=1; idong = i; p->cot = j; p->info = locate(ds1,i,j) + locate(ds2,i,j); tam = (danhsach*)malloc(sizeof(danhsach)); } free(tam); } void tich_mt(danhsach *ds1, danhsach *ds2, int m1, int n1, int n2, danhsach *ds) { int i, j, k, tg; danhsach *p, *tam; p = NULL; tam = ds; ds->next = NULL; for (i=1; icot = j; p->info = tg; tam = (danhsach*)malloc(sizeof(danhsach)); tam->next = NULL; } GV hớng dẫn: TH.S Đặng Hồng Lĩnh Nhóm thực hiện: Nhóm Lớp 44E2 CNTT 38 Đề tài thực tập sở Mà đề 043 } free(tam); } void main() { clrscr(); danhsach *a, *b, *c, *d; int mA, nA, mB, nB; printf("Nhap dong ma tran A: "); scanf("%d",&mA); printf("Nhap cot ma tran A: "); scanf("%d",&nA); nhap_mt('A',a,mA,nA); in_mt(a,mA,nA); printf("\nNhap dong ma tran B: "); scanf("%d",&mB); printf("Nhap cot ma tran B: "); scanf("%d",&nB); nhap_mt('B',b,mB,nB); in_mt(b,mB,nB); if (mA != mB || nA != nB) printf("\nHai ma tran khong cung kich thuoc"); else { printf("\n\nMa tran tong C:\n"); tong_mt(a,b,c,mA,nA); in_mt(c,mA, nA); } if (nA != mB) printf("\nHai ma tran khong nhan duoc"); else { printf("\n\nMa tran tich D:\n"); tich_mt(a,b,mA,nA,nB,d); in_mt(d,mA,nB); } getch(); } GV hớng dẫn: TH.S Đặng Hồng Lĩnh Nhóm thực hiƯn: Nhãm Líp 44E2 CNTT 39 ... *d; int mA, nA, mB, nB; printf("Nhap dong ma tran A: "); scanf("%d", &mA) ; printf("Nhap cot ma tran A: "); scanf("%d",&nA); nhap_mt('A',a ,mA, nA); in_mt(a ,mA, nA); printf(" Nhap dong ma tran B:... write('Nhap so hang ma tran a: ');readln(m); write('Nhap so cot ma tran a: ');readln(n); nhap(a,m,n); xuat(a,m,n); write('Nhap so hang ma tran b: ');readln(k); write('Nhap so cot ma tran b: ');readln(l);... C: "); tong_mt(a,b,c ,mA, nA); in_mt(c ,mA, nA); } if (nA != mB) printf(" Hai ma tran khong nhan duoc"); else { printf(" Ma tran tich D: "); tich_mt(a,b ,mA, nA,nB,d); in_mt(d ,mA, nB); } getch();

Ngày đăng: 29/08/2021, 15:59

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w