Chẳng hạn , mảng năng suất lao động có mô tả NS [1..10].Chúng ta dễ dàng truy nhập các thành phần của mảng bằng cáchdùng tên mảng và chỉ số đi kèm với nó tức là dùng biến mangchỉ số .Ví
Trang 1Biểu 1: Thống kê mức sử dụng nguyên vật liệu
Biểu này có năm dòng và 4 cột chứa 15 số liệu khác nhau
về mức độ sử dụng nguyên vật liệu của mỗi phân xưởng Ta nóirằng đây là một mảng gồm 5 dòng và 4 cột
Định nghĩa
Trang 2Mảng ( Array ) là một tập hợp có thứ tự bao gồm một
số lượng cố định các phần tử,được truy cập với cùng một tên.
Trong ví dụ trên đây, biểu thống kê sử dụng nguyên vậtliệu là một mảng hai chiều
Chúng ta xét thêm ví dụ sau đây Cho số liệu về năng suấtlao động của 10 doanh nghiệp (Đơn vị tính: Triệu đồng)
nó Chẳng hạn , mảng năng suất lao động có mô tả NS [1 10].Chúng ta dễ dàng truy nhập các thành phần của mảng bằng cáchdùng tên mảng và chỉ số đi kèm với nó tức là dùng biến mangchỉ số Ví dụ biến mang chỉ số NS [2] xác định năng suất củadoanh nghiệp thứ 2
2.2 Cấu trúc dữ liệu mảng một chiều
Trang 3Trước hết chúng ta xem xét cấu trúc dữ liệu mảng mộtchiều Cấu trúc dữ liệu loại này thường gặp rất nhiều trong hoạtđộng kinh tế Chẳng hạn năng suất lao động của 10 doanh nghiệp
là một mảng một chiều , một dãy số thống kê gồm 20 giá trị vềdoanh số bán lẻ của 20 trung tâm thương mại trong năm 1998, sốtiền đầu tư vào một công trình xây dựng của 15 nhà đầu tư nướcngoài cũng đều là các mảng một chiều.Trong các ví dụ trên đây ta
có các mảng một chiều Mảng NS[1 10] biểu diễn năng suất laođộng của các doanh nghiệp Mảng DOANHSO [1 20] biểudiễn mức doanh số bán lẻ của 20 trung tâm thương mại MảngDAUTU[1 15] biểu diễn mức đầu tư của 15 nhà đầu tư vào mộtcông trình xây dựng
Trang 4Khai báo này chỉ thị cho chương trình dịch để ra một vùng
bộ nhớ liên tục đủ lớn để chứa các phần tử của mảng Địa chỉ của
ô nhớ đầu tiên dùng để chứa các phần tử đó được gọi là địa chỉ cơ
sở ( Base address) của mảng, ký hiệu là Base(A).Địa chỉ của bất
cứ phần tử nào cũng được tính dựa vào địa chỉ cơ sở này
Chúng ta xét một ví dụ khác Cho mảng B với mô tả: Var
B: array[-3 3] of real; giả sử mỗi phần tử được lưu trữ trong hai
từ máy
Trang 5Trong trường hợp tổng quát, mảng một chiều (véc tơ C)
có n phần tử là C1, C2, Cn Giả sử mỗi phần tử chiếm L từ
máy thì mảng này được lưu trữ trong L *N từ máy liên tiếp nhau
theo mô hình sau đây:
Trang 6F (i) = L * (i-1) gọi là hàm địa chỉ.
Ví dụ Xét cấu trúc lưu trữ của mảng năng suất lao độngcủa 15 doanh nghiệp; Giả sử năng suất lao động của mỗi doanhnghiệp chứa trong1 từ máy.Ta có hình ảnh của cấu trúc lưu trữtrong bộ nhớ như sau:
Trang 72.2.2 phép toán với mảng một chiều
Các phép toán thông dụng đối với mảng một chiều gồm : CREATE Tạo lập mảng một chiều
SORTING Sắp xếp mảng một chiều
SEACHING Tìm kiếm trong mảng một chiều
CALCULATE Tính toán với mảng một chiều
Trang 8Trong các giải thuật với mảng một chiều dưới đây, biếnVector có mô tả như sau:
Var
Vector : array [ 1 n] of real;
2.2 3 Giải thuật tạo lập mảng một chiều.
Cho mảng một 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 );
2.2.4 Giải thuật sắp xếp mảng một chiều
Trong thực tế thường xuất hiện nhu cầu sắp xếp các thànhphần của mảng một chiều theo một trình tự xác định tiện lợi choviệc nghiên cứu đánh giá một hiện tượng , một quá trình kinh tế -
Trang 9kỹ thuật nào đó Chẳng hạn, chúng ta cần sắp xếp mảng năng suấtlao động của 10 doanh nghiệp theo trình tự giảm dần để có mộtcái nhìn tổng quát về kết quả hoạt động của các doanhnghiệp.Hoặc sắp sếp vốn đầu tư của 15 nhà đầu tư theo chiềutăng dần giúp ta đánh giá dễ dàng qui mô đầu tư v v
Bây giờ ta xét giải thuật sắp xếp Cho mảng một chiều a(n)gồm n phần tử Giải thuật sắp xếp mảng một chiều này theo chiềutăng dần biểu diễn như sau
Procedure SortVector (a : Vector; Var n : integer);
Trang 10Trong trường hợp sắp xếp giảm dần ta chỉ cần có một thayđổi nhỏ trong giải thuật bằng cách thay điều kiện kiểm tra a[i]>a[jbằng điều kiện a[i]<a[j].Tổng quan về sắp xếp và các giải thuậtsắp xếp khác nhau sẽ được nghiên cứu kỹ hơn trong chương 6
2.2.5 Giải thuật tìm kiếm trong mảng một chiều
Vấn đề tìm kiếm cũng thường xuất hiện khi giải quyết cácbài toán trong hoạt động kinh tế Chẳng hạn, trong số các nhàđầu tư nước ngoài, yêu cầu tìm kiếm và in ra họ tên nhà đầu tư có
số tiền đầu tư ban đầu là 120 triệu đôla , hoặc tìm kiếm và in ratên của các doanh nghiệp có giá trị tổng sản lượng bằng giá trịtổng sản lượng động trung bình v v
Bây giờ chúng ta xét giải thuật tìm kiếm Cho mảng mộtchiều A gồm n phần tử Giải thuật tìm kiếm một phần tử củamảng có giá trị bằng một đại lượng T cho trước được biểu diễnnhư sau:
Function SeachingVector (a : Vector ; Var n: integer ) : real;
Trang 11end;
2.2.6 Giải thuật tính toán trong mảng một chiều
Các vấn đề tính toán trong mảng một chiều luôn luôn xuấthiện khi chúng ta muốn xác định các chỉ tiêu thống kê đặc trưngcủa mảng.Chẳng hạn, đối với mảng các nguồn vốn đầu tư vàomột công trình người ta muốn xác định vốn đầu tư trung bình củacác nguồn vốn đầu tư, mức độ chênh lệch của các mức đâu tư sovới giá trị trung bình v v
Các tiêu thức thống kê thông dụng nhất là:
- Giá trị trung bình;
- Phương sai;
- Độ lệch chuẩn
Sau đây là giải thuật:
Procedure CalculateVector (a : Vector; Var n : integer);
Trang 12số dương Lập giải thuật xác định xem có bao nhiêu mức vốn đầu
tư và trong mỗi mức có bao nhiêu nhà đầu tư ?
Ta có chương trình sau đây :
Trang 14if b[i]<>0 then muc:=muc+1;
end;
writeln(' ');
writeln('Tong so co ',muc,' muc von dau tu');
for i:=1 to muc do
2 .3 Cấu trúc dữ liệu mảng hai chiều ( Ma trận)
Xét mảng hai chiều trong trường hợp tổng quát có n dòng
và m cột.Loại cấu trúc dữ liệu này rất thường gặp trong kinh tế.Chẳng hạn như bảng tổng hợp kinh doanh trong một trung tâmthương mại đã bán ra m mặt hàng cho n khách hàng là một mảnghai chiều Bảng thống kê các định mức tiêu thụ n loại nguyên vậtliệu để chế tạo ra m loại sản phẩm trong một phân xưởng cũng làloại cấu trúc dữ liệu mảng hai chiều
2.3.1 Cấu trúc lưu trữ mảng hai chiều
Cho mảng hai chiều( hay một ma trận) sau đây A sau đây :
A=(A i j) i=1,2,3 n
j=1,2,3, m
Có hai phương pháp lưu trữ mảng hai chiều:
1 - Lưu trữ theo dòng(như trong BASIC, PASCAL)
Trang 152 - Lưu trữ theo cột ( như trong FORTRAN )
Đối với trường hợp lưu trữ theo cột, các phần tử củamảng sẽ được lưu trữ liên tiếp bắt đầu từ cột thứ nhất sau đó sangcột thứ hai, cột thứ ba vv,, cho đến hết cột cuối cùng của mảng
Cho mảng hai chiều với mô tả:
Trang 16ĐC (Aij) = Base(A[i,j]) +(i-1) *m+(j-1)
Trong trường hợp lưu trữ theo cột ,cấu trúc trong bộ nhớ
sẽ như sau:
Trang 17ĐC (Aij) = Base(A[i,j]) + (j-1) * n + (i-1)
Ví dụ cho mảng A = a[3,4], mỗi phần tử chiếm 1 từ máy.Tính địa chỉ của phần tử a23?
Phương pháp lưu trữ theo cột:
Trong trường hợp này n = 3 ; m = 4
Đc (A23) =Base (A) +(3-1)*3+(2-1) = Base (A) + 7
Lưu trữ theo dòng:
Công thức tính địa chỉ như sau:
ĐC (A23) = Base (A)+ (2-1)*3 + (3-1)=Base(A) +5
Trang 18
2.3.2 Các phép toán với mảng hai chiều
Các phép toán thông dụng với mảng hai chiều là:
1 - Tạo lập mảng hai chiều
2 - Tìm kiếm một phần tử của mảng hai chiều
3 - Cộng hai hoặc nhiều mảng hai chiều với nhau
4 - Nhân mảng hai chiều với mảng một chiều
5 - Nhân mảng hai chiều với mảng hai chiều
Trong các giải thuật với mảng hai chiều dưới đây,biếnMatrix được mô tả như sau:
Giải thuật tạo lập mảng hai chiều như sau:
Procedure CreateMatrix (a : Matrix; Var n ,m: integer );
Trang 19end;
end;
Giải thuật này tạo lập một mảng hai chiều bằng cách sửdụng phương pháp lưu trữ theo dòng Trong quá trình này sẽ lầnlượt nạp các thành phần của mảng bắt đầu từ dòng thứ nhất,sau
đó sang dòng thứ hai v.v cho đến dòng cuối cùng để tạo thànhmột Storage Structure chứa các thành phần của mảng hai chiều
2.3.4 Giải thuật tìm kiếm
Cho mảng hai chiều A=(a i j) i=1,2,3, n
Trang 202 3.5 Giải thuật nhân mảng hai chiều với một véctơ
Bài toán nhân mảng hai chiều với một véc tơ có rất nhiềuứng dụng trong thực tế nhất là trong kinh tế Chẳng hạn, chúng taxét bài toán lập bảng tổng hợp kinh doanh của một trung tâmthương mại điệnvà điện tử gồm 5 cửa hàng và đã bán ra 10 loạihàng hoá khác nhau.Biết số lượng mỗi loại hàng mà từng cửahàng đã bán và đơn giá của mỗi mặt hàng Trong trường hợpnày bảng số liệu về số lượng các mặt hàng ( có 10 loại ) đã bántrong 5 cửa hàng là một mảng hai chiều kích thước 5x10 ,còn đơngiá từng mặt hàng là một véctơ gồm 10 thành phần( Mỗi loạihàng có một giá bán cố định) Thực hiện nhân ma trận với véctơchúng ta sẽ tính toán được được doanh số của mỗi cửa hàng
Số liệu của bài toán kinh tế này được biểu diễn trong cấutrúc mảng hai chiều như sau:
Biểu 1: Thống kê số lượng các loại hàng đã bán
trong từng cửa hàng ( CH ) của Trung tâm thương mại
Loại hàng 1 Loại hoàng 2 Loại hàng10
Trang 21Loại hàng 2 150
Kết quả tính toán sẽ được biểu diễn dưới dạng biểu 3 sau đây:
Biểu 3 : Tính toán doanh số bán lẻ trong 5 cửa hàng của
một Công ty thương mại
Tên cửa hàng Tiền bán hàng
Trang 22Giải thuật biểu diễn như sau:
Procedure MultiMatrix (a : Matrix;b,c : Vector; var n,m :integer );
Trang 232.3.6 Giải thuật cộng mảng hai chiều
Chúng ta xét bài toán dưới dạng tổng quát sau đây:
Cho mảng hai chiều A=(aij) và B=(bij) i=1,2, n
j=1,2, m
Lập giải thuật cộng hai mảng
Như đã biết công thức cộng hai mảng C = A+B ,
trong đó mỗi thành phần của mảng kết quả Cij được xácđịnh theo công thức:
Cij = Aij + Bij i = 1,2 n
j= 1,2 m
Sau đây là giải thuật :
Procedure AdditionMatrix(a,b,c : Matrix; Var n,m : integer);
Trang 25Biểu 2 : Thống kê kết quả kinh doanh 6 tháng cuối năm 1998
Tên CH tiền hàng 1 tiền hàng 2 tiền hàng 10
Biếu 3 : Thống kê kết quả kinh doanh trong năm 1998 (Triệu
Trang 262 3.7 Giải thuật nhân mảng hai chiều với mảng hai chiều
Mô hình nhân mảng hai chiều với mảng hai chiều có rấtnhiều ứng dụng trong việc giải quyết các bài toán kinh tế Chẳng hạn chúng ta xét bài toán lập bảng tổng hợp kinh doanhcủa một trung tâm thương mại trong điều kiện giá cả biến độngtrong từng tháng, tức là mô hình đã khá gần hơn với điều kiệnkinh doanh trong thực tế Trong mô hình của giải thuật nhânmảng hai chiều với mảng một chiều trên đây chúng ta đã đơngiản hoá đi so với thực tế Đó là chúng ta đã giả sử rằng giá cảcủa các mặt hàng không phụ thuộc vào yếu tố thời gian, tức là giábán của chúng là như nhau tại tất cả các tháng trong năm Nhưngtrong thực tế thì giá cả lại luôn luôn biến động từ tháng này sangtháng khác Do đó bây giờ chúng ta giả sử rằng trung tâm thươngmại đã bán ra 10 loại hàng được thống kê theo từng tháng của 6tháng đầu năm ( Từ tháng 1 đến tháng 6) , cho biết số lượng mỗiloại hàng đã bán trong từng tháng,đơn giá của mỗi loại hàngtrong từng tháng Trong trường hợp này ,bảng số liệu về sốlượng các mặt hàng gồm 10 chủng loại đã bán trong 6 tháng
là một mảng hai chiều kích thước (6 * 10) , còn đơn giá từng mặthàng trong mỗi tháng là một mảng hai chiều kích thước (10 *6) Thực hiện nhân hai mảng hai chiều này với nhau chúng ta thuđược doanh số trong từng tháng của trung tâm thương mại
Các bảng thống kê làm cơ sở để tính toán được biểu diễnnhư sau:
Bảng 1: Thống kê số lượng các loại hàng đã bán mỗi tháng
trong 6 tháng đầu năm
Trang 27loại hàng 1 loại hàng 2 loại hàng 10
Kết quả tính toán là bảng tổng hợp kinh doanh sau đây:
Bảng 3: Bảng tổng hợp kết quả kinh doanh theo giá bán lẻ từng
tháng của 6 tháng đầu năm
Trang 28Giải thuật nhân mảng hai chiều với mảng hai chiều như sau:
Procedure MultiMatrix(a,b, c :Matrix; var n,m ,q :integer);
Trang 30sử dụng cấu trúc dữ liệu mảng sẽ giúp chúng ta giải quyết cácbài toán đặt ra một cách hiệu quả, tiện lợi cho việc tổ chức cácquá trình tính toán, biểu diễn chương trình một cách ngắn gọn.Cấu trúc dữ mảng cũng là loại cấu trúc dữ liệu rất thông dụngđối với các mô hình tối ưu hoá nhằm xác định phương án tối ưutrong các mô hình kinh tế
Bây giờ chúng ta xem xét việc ứng dụng cấu trúc dữ liệumảng hai chiều trong việc giải một số bài toán
Chương trình như sau :
Program Tinh_ max ;
write(' Cho biet so dong: ');readln(m);
write(' Cho biet so cot: ');readln(n);
for i:=1 to m do
for j:=1 to n do
Trang 32Bài toán 2
Cho mảng hai chiều A= (Aij) i=1,2,3, n;j=1,2, m
Lập giải thuật sắp sếp các thành phần của mỗi dòng theo trình tựtăng dần?
write(' Cho biet so dong: ');readln(m);
write(' Cho biet so cot: ');readln(n);
Trang 332 - Xác định số lượng các thành phần khác không của mỗi cột?
3 - Xác định tỷ lệ các thành phần khác không của mảng so với
Trang 34l,m,n,i,j:integer;
tl:real;
Begin
write(' Cho biet so dong: ');readln(m);
write(' Cho biet so cot: ');readln(n);
Trang 351 - Sắp sếp các dòng lẻ của mảng theo thứ tự giảm dần;
2 - Sắp sếp các dòng chẵn của mảng theo thứ tự tăng dần?
Program Sap _ dong_cot;
Trang 36write(' Cho biet so dong: ');readln(m);
write(' Cho biet so cot: ');readln(n);
Trang 37
Điều tra mức thu nhập của dân cư
1 triệu 2 triệu 10 triệu
Trang 382- Xác định mức thu nhập có số người đông nhất của mỗi tỉnh
3 - Tính tỷ trọng của những người có mức thu nhập 100 0000
đồng so với tổng số người điều tra ?
Program Dieu_ tra_ muc_ thu_ nhap;
Trang 39write(' Cho biet so cot: ');readln(n);
{Hien ket qua tu day}
writeln (' 1 trieu 2 trieu 10 trieu ');
Trang 40if 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;
Trang 43Câu hỏi chương 2
1 - Định nghĩa cấu trúc dữ liệu mảng Cho ví dụ mảng một chiều
và mảng hai chiều? Phương pháp truy nhập mảng?
2 - Khái niệm mảng một chiều, phương pháp lưu trữ mảng một
5 - Trình bày giải thuật tìm kiếm trong mảng một chiều?
6 - Trình bày giải thuật tính toán đối với mảng một chiều? Minhhoạ giải thuật bằng một ví dụ số cụ thể?
7 - Khái niệm mảng hai chiều? Phương pháp lưu trữ mảng hai
chiều? Tính toán địa chỉ của thành phần A[2,4] của một mảnghai chiều A gồm 4 dòng và 4 cột , biết mỗi phần tử của mảnglưu trữ trong một từ máy?
8 - Trình bày giải thuật tạo lập mảng hai chiều?
9 - Trình bày giải thuật tìm kiếm một phần tử trong mảng hai
chiều?
10 - Trình bày giải thuật cộng mảng hai chiều? Cho một ví dụ cụ
thể cộng mảng hai chiều ứng dụng trong kinh tế?
11 - Trình bày giải thuật nhân mảng hai chiều với véc tơ? Cho
một ví dụ ứng dụng giải thuật này trong kinh tế?
12 - Trình bày giải thuật nhân mảng hai chiều với nhau Cho
một ví dụ ứng dụng giải thuật này trong kinh tế