Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 50 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
50
Dung lượng
397 KB
Nội dung
1 Chương 2: Cấutrúcliệumảng Định nghĩa khái niệm cấutrúcliệumảngMảng loại cấutrúcliệu thường gặp toán thực tế Chẳng hạn biểu ta có số liệu tình hình sử dụng nguyên vật liệu doanh nghiệp Biểu 1: Thống kê mức sử dụng nguyên vật liệu Thép Dầu Tôn PX 50 30 20 PX 50 25 50 PX 20 50 40 Điện Than 2,5 15 2,5 20 2,5 15 (Đơn vị tính: Sắt, thép, tơn: Đi ện : nghìn kw/h Dầu : kg) Biểu có năm dòng cột chứa 15 số liệu khác mức độ sử dụng nguyên vật liệu phân xưởng Ta nói mảng gồm dòng cột Định nghĩa Mảng ( Array ) tập hợp có thứ tự bao gồm số lượng cố định phần tử,được truy cập với tên Trong ví dụ đây, biểu thống kê sử dụng nguyên vật liệumảng hai chiều Chúng ta xét thêm ví dụ sau Cho số liệu suất lao động 10 doanh nghiệp (Đơn v ị tính: Triệu đồng) 149 NS [1] 234 NS [2] 423 NS [3] 207 NS [4] 201 NS [5] 2 203 NS [6] 205 NS [7] 210 NS [8] 215 NS [9] 245 NS [10] Ta có suất lao động NS [1 10] m ột m ảng chiều gồm 10 thành phần Mảng chiều gọi véc tơ M ỗi m ảng đ ược xác đ ịnh b ởi tên số lượng thành phần Chẳng h ạn , mảng suất lao động có mô tả NS [1 10] Chúng ta dễ dàng truy nhập thành phần mảng cách dùng tên mảng số kèm với tức dùng biến mang số Ví dụ biến mang số NS [2] xác định suất doanh nghiệp thứ 2.2 Cấutrúcliệumảng chiều Trước hết xem xét cấutrúcliệumảng chiều Cấutrúcliệu loại thường gặp nhiều hoạt động kinh tế Chẳng hạn suất lao động 10 doanh nghiệp mảng chiều , dãy số thống kê gồm 20 giá trị doanh số bán lẻ 20 trung tâm thương mại năm 1998, số tiền đ ầu tư vào cơng trình xây dựng 15 nhà đầu t n ước mảng chiều.Trong ví dụ ta có mảng chiều Mảng NS[1 10] biểu 3 diễn suất lao động doanh nghiệp Mảng DOANHSO [1 20] biểu diễn mức doanh số bán lẻ 20 trung tâm thương mại Mảng DAUTU[1 15] bi ểu diễn mức đầu tư 15 nhà đầu tư vào cơng trình xây dựng 2.2.1 Phương pháp lưu trữ mảng chiều Chúng ta xem xét vấn đề cấutrúc lưu tr ữ (Storage Structure ) mảng chiều 4 Địa Vùng nhớ Phần tử mảng Base (A)+0 ← A[1] Base (A)+1 ← A[2] Base (A)+2 ← A[3] Base (A)+3 ← A[4] Base (A)+4 ← A[5] Giả sử ta có mơ tả : Var A : array[1 20] of real; Khai báo thị cho chương trình dịch để vùng nhớ liên tục đủ lớn để chứa phần tử mảng Địa ô nhớ dùng để chứa phần tử gọi địa sở ( Base address) mảng, ký hiệu Base(A).Địa phần tử tính dựa vào địa sở 5 Chúng ta xét ví dụ khác Cho mảng B v ới mô tả: Var B: array[-3 3] of real; giả sử phần tử lưu trữ hai từ máy Địa Vựng nhớ Phần tử mảng Base (B)+0 ← B[-3] Base (B)+1 Base (B)+2 ← B[-2] Base (B)+3 Base (B)+4 Base (B)+5 Base (B)+6 Base(B)+7 Base(B)+8 11001010111001 Base (B)+9 Trong trường hợp tổng quát, mảng chiều (véc tơ C) có n phần tử C 1, C2, Cn Giả sử phần tử chiếm L từ máy mảng lưu trữ L *N từ máy liên mụ hỡnh sau õy: 6 Đ ịa chØ Base (C)+0 Base (C)+1 Base (C)+2 Base (C)+3 Base (C)+4 Base(C)+7 Base(C)+8 Base (C)+9 Base (C)+10 Base (C)+11 Base (C)+( N-1) Vï ng nhí PhÇn tư m¶ng ← C[1] 11001010111001 1010111010101 ← C[N] Địa Ci tính sau: ĐC (Ci) = Base(C) + L * (i-1) Trong Base(C) địa sở; F (i) = L * (i-1) gọi hàm địa Ví dụ Xét cấutrúc lưu trữ mảng suất lao động 15 doanh nghiệp; Giả sử suất lao động doanh nghiệp chứa trong1 từ máy.Ta có hình ảnh cấutrúc lưu trữ nhớ sau: 7 § Þa chØ Base (NS)+0 Base (NS)+1 Base (NS)+2 Base (NS)+3 Base (NS)+4 Base (NS)+5 Base (NS)+6 Base(NS)+7 Base(NS)+8 Base (NS)+9 Base (NS)+10 Base (NS)+11 Base(NS)+12 Base (NS)+13 Base (NS)+14 Vï ng nhí m¶ng NSLD ← NS[1] 11001010111001 11100111010100 ← NS[15] Trong cấutrúc lưu trữ ln ln xác định cách nhanh chóng địa thành phần mảng chiều 2.2.2 phép tốn với mảng chiều Các phép tốn thơng dụng mảng chiều gồm : CREATE Tạo lập mảng chiều 8 SORTING Sắp xếp mảng chiều SEACHING Tìm kiếm mảng chiều CALCULATE Tính tốn với mảng chiều Trong giải thuật với mảng chiều đây, biến Vector có mô tả sau: Var Vector : array [ n] of real; 2.2 Giải thuật tạo lập mảng chiều Cho mảng chiều A=(a i ) i=1,2 n Giải thuật tạo lập mảng.như sau: Procedure CreateVector ( a: Vector ; var n : interger ); Var i: integer; begin For i: = to n Begin write(' a[' ,i,'] =' ); readln(a[i]); end; end; Giải thuật nạp thành phần mảng chiều ta gõ từ bàn phím lưư trữ 9 10 nhớ dạng véc tơ lưu trữ gồm n phần tử 2.2.4 Giải thuật xếp mảng chiều Trong thực tế thường xuất nhu cầu xếp thành phần mảng chiều theo trình t ự xác định tiện lợi cho việc nghiên cứu đánh giá tượng , trình kinh tế - kỹ thuật Chẳng hạn, cần xếp mảng suất lao động 10 doanh nghiệp theo trình tự giảm dần để có nhìn tổng quát kết hoạt động doanh nghiệp.Hoặc sếp vốn đầu tư 15 nhà đầu tư theo chiều tăng dần giúp ta đánh giá dễ dàng qui mô đầu t v v Bây ta xét giải thuật xếp Cho mảng chiều a(n) gồm n phần tử Giải thuật xếp mảng chiều theo chiều tăng dần biểu diễn sau Procedure SortVector (a : Vector; Var n : integer); Var J, I: integer; tg: real; begin For i : = to n-1 For j:= I+1 to n 10 10 36 write(' Cho biet so cot: ');readln(n); for i:=1 to m for j:=1 to n begin write('a[',i,',',j,']= ');readln(a[i,j]); end; max:=a[1,1]; for i:=1 to m for j:=1 to n begin if a[i,j]>=max then begin max:=a[i,j]; k:=i;s:=j; end; end; write(' Gia tri max la: ',max,' dg= ',k,' ct= ',s); min:=a[1,1]; for i:=1 to m for j:=1 to n begin if a[i,j]a[i,k] then begin tg:=a[i,j]; a[i,j]:=a[i,k]; a[i,k]:=tg; end; {Hien ket qua tu day} for i:=1 to m begin writeln; for j:=1 to n begin write(a[i,j]:3); end; end; readln end Bài toán Cho mảng hai chiều A= (Aij) i=1,2,3, n;j=1,2, m Lập giải thuật: 38 38 39 - Xác định số lượng thành phần khác khơng c dòng? - Xác định số lượng thành phần khác không c cột? - Xác định tỷ lệ thành phần khác khơng mảng so với tồn thành phần nó? Program Nhap_va _xac_ dinh_ #0 _cua_ mang ; Type mt=array[1 20,1 20] of integer; vt=array[1 20] of integer; Var a:mt; h,c:vt; l,m,n,i,j:integer; tl:real; Begin write(' Cho biet so dong: ');readln(m); write(' Cho biet so cot: ');readln(n); for i:=1 to m for j:=1 to n begin write('a[',i,',',j,']= ');readln(a[i,j]); end; for i:=1 to m begin 39 39 40 for j:=1 to n if a[i,j]0 then h[i]:=h[i]+1; end; for i:=1 to m for j:=1 to n begin for i:=1 to m if a[i,j]0 then c[j]:=c[j]+1; end; l:=0; for i:=1 to m for j:=1 to n if a[i,j]0 then l:=l+1; tl:=m*n/l; {Hien ket qua tu day} for i:=1 to m begin write(' h[',i,']=',h[i]) end; writeln; for j:=1 to n begin write(' c[',j,']=',c[j]) end; writeln; write(' Ty le phan #0 so voi toan bo la: ',tl:6:2); 40 40 41 readln end Bài toán Cho mảng hai chièu A = ( A i j ) i = 1,2, n j = 1,2 ,.n Lập giải thuật: - Sắp sếp dòng lẻ mảng theo th ứ tự giảm dần; - Sắp sếp dòng chẵn mảng theo th ứ tự tăng dần? Program Sap _ dong_cot; Uses Crt; Type mt=array[1 20,1 20] of integer; Var a:mt; tg,min,k,s,max,m,n,i,j:integer; Begin ClrScr; write(' Cho biet so dong: ');readln(m); write(' Cho biet so cot: ');readln(n); for i:=1 to m for j:=1 to n begin write('a[',i,',',j,']= ');readln(a[i,j]); 41 41 42 end; for i:=1 to m if (i mod 2)=0 then begin for j:=1 to n-1 for k:=j+1 to n if a[i,j]>a[i,k] then begin tg:=a[i,j]; a[i,j]:=a[i,k]; a[i,k]:=tg; end; end else begin for j:=1 to n-1 for k:=j+1 to n if a[i,j]=maxc then begin maxc:=a[i,j]; g[j]:=i; end; end; if g[j]=1 then f[j]:='Ha noi' else if g[j]=2 then f[j]:='Sai gon' else if g[j]=3 then f[j]:='Hai phong' else f[j]:='Da nang'; writeln(' Muc thu nhap ', e[j], ' co so nguoi nhieu nhat o ',f[j]); end; writeln; for i:=1 to m begin maxh:=a[i,1]; for j:=1 to n 46 46 47 begin if a[i,j]>=maxh then begin maxh:=a[i,j]; d[i]:=j; end; end; if d[i]=1 then f[i]:='1 trieu' else if d[i]=2 then f[i]:='2 trieu' else f[i]:='10 trieu'; writeln(' Muc thu nhap co so nguoi dong nhat cua ',b[i],' la ',f[i]); end; writeln; ts:=0;tsn:=0; for i:=1 to m tsn:=tsn+a[i,n]; for j:=1 to n ts:=ts+a[i,j]; tl:=tsn/ts; writeln('Ty cua nhung nguoi co thu nhap 10 trieu so voi tong so: ',tl:5:3); readln End 47 47 48 48 48 49 Câu hỏi chương - Định nghĩa cấutrúcliệumảng Cho ví dụ m ảng chiều mảng hai chiều? Phương pháp truy nhập mảng? - Khái niệm mảng chiều, phương pháp lưu trữ mảng chiều, cho ví dụ? - Trình bày giải thuật tạo lập mảng chiều? Phương pháp tổ chức in mảng chiều thành dòng cột? - Trình bày giải thuật sếp mảng chiều? Minh hoạ giải thuật ví dụ số cụ thể? - Trình bày giải thuật tìm kiếm mảng chiều? - Trình bày giải thuật tính tốn mảng chiều? Minh hoạ giải thuật ví dụ số cụ thể? - Khái niệm mảng hai chiều? Phương pháp lưu trữ mảng hai chiều? Tính tốn địa thành phần A[2,4] mảng hai chiều A gồm dòng cột , biết phần tử mảng lưu trữ từ máy? - Trình bày giải thuật tạo lập mảng hai chiều? - Trình bày giải thuật tìm kiếm phần tử mảng hai chiều? 10 - Trình bày giải thuật cộng mảng hai chiều? Cho ví dụ cụ thể cộng mảng hai chiều ứng dụng kinh tế? 49 49 50 11 - Trình bày giải thuật nhân mảng hai chiều v ới véc tơ? Cho ví dụ ứng dụng giải thuật kinh tế? 12 - Trình bày giải thuật nhân mảng hai chiều với Cho ví dụ ứng dụng giải thuật kinh tế 50 50 ... nghiệp thứ 2.2 Cấu trúc liệu mảng chiều Trước hết xem xét cấu trúc liệu mảng chiều Cấu trúc liệu loại thường gặp nhiều hoạt động kinh tế Chẳng hạn suất lao động 10 doanh nghiệp mảng chiều , dãy... n khách hàng mảng hai chiều Bảng thống kê định mức tiêu thụ n loại nguyên vật liệu để chế tạo m loại sản phẩm phân xưởng loại cấu trúc liệu mảng hai chiều 2.3.1 Cấu trúc lưu trữ mảng hai chiều... ',b[i],' nha dau tu'); end; Readln end 2.3 Cấu trúc liệu mảng hai chiều ( Ma trận) Xét mảng hai chiều trường hợp tổng quát có n dòng m cột.Loại cấu trúc liệu th ường gặp kinh tế Chẳng hạn bảng tổng