Chương 2. Các kiểu dữ liệu đơn giản chuẩn
9.2. Dữ liệu kiểu mảng
9.2.1. Định nghĩa, khai báo vμ sử dụng
Một mảng dữ liệu gồm một số hữu hạn phần tử có cùng kiểu gọi là kiểu cơ bản. Số phần tử tối đa của mảng đ−ợc xác định ngay từ khi
định nghĩa ra mảng. Mỗi phần tử của mảng đ−ợc truy nhập trực tiếp thông qua tên mảng cùng với chỉ dẫn truy nhập đ−ợc để giữa hai ngoặc vuông [ ].
Có hai cách để định nghĩa và khai báo dữ liệu kiểu mảng là khai báo trực tiếp và khai báo gián tiếp.
a. Khai báo gián tiếp thông qua định nghĩa kiểu dữ liệu mới Cú pháp:
Type
Tên _ kiểu = array[miền_chỉ_số] of kiểu_phần_tử
Ch−ơng 9: Kiểu dữ liệu có cấu trúc 85
Var
Tên_biến_mảng: Tên_kiểu;
VÝ dô:
Type
Mang1 = array[1..100] of real;
Var
A, B, C: Mang1;
b. Khai báo trực tiếp với từ khóa Var Var
Tên_biến_mảng: array[miền_chỉ_số] of kiểu_phần_tử;
trong đó: miền_chỉ_số là miền con của một kiểu liệt kê (Byte, Integer, Char,...) và không đ−ợc là kiểu real; kiểu_phần_tử: là một kiÓu bÊt kú trõ kiÓu File.
VÝ dô:
Var
A, B, C: array[1..100] of real;
Việc truy nhập vào một phần tử nào đó của mảng đ−ợc viết:
Tên_biến_mảng[giá_trị_chỉ_số,...].
trong đó giá_trị_chỉ_số là một giá trị cụ thể thuộc miền_chỉ_số.
Số các miền_chỉ_số trong mảng đ−ợc gọi là số chiều của mảng.
Do thời gian truy nhập vào một phần tử của mảng không phụ thuộc vào giá trị của chỉ dẫn nên cấu trúc mảng thuộc kiểu cấu trúc truy nhËp trùc tiÕp.
9.2.2. Mảng nhiều chiều
Kiểu phần tử của mảng không bị hạn chế nhiều nh− miền_chỉ_số.
Nó còn có thể là kiểu có cấu trúc. Ví dụ sau cho thấy việc khai báo một mảng có các phần tử cũng là mảng.
VÝ dô:
Type
pt: array[1..5] of real;
Var
A, B, C: array[1..3] of pt;
Hoặc khai báo trực tiếp:
Var
A, B, C: array[1..3] of array [1..5] of real;
Các biến A, B, C đ−ợc định nghĩa nh− trên chính là ma trận hai chiều có 3 hàng và 5 cột, kiểu của các phần tử mảng là kiểu số thực Real.
Việc truy nhập đối với mảng có định nghĩa phức tạp nh− A, B, C ở trên có thể tiến hành theo hai cách:
1. Dùng hai lần đóng mở ngoặc vuông. Ví dụ: A[2][4] biểu diễn phần tử thuộc hàng 2 cột 4.
2. Viết đơn giản trong một ngoặc vuông với các chỉ dẫn cách nhau bằng dấu phảy: A[2, 4]
Hai cách viết trên là tương đương nhau. Mảng được định nghĩa nh− trên là mảng nhiều chiều. Phần tử A[i, j] là phần tử thuộc hàng i cột j của mảng A.
Chú ý: Khi truy nhập đến một phần tử mảng thì số l−ợng chỉ số mảng phải tương ứng với số chiều của mảng đã khai báo và giá trị của các chỉ số mảng phải nằm trong khoảng đã khai báo.
9.2.3. Các ví dụ lμm việc với mảng
Ví dụ 1: Viết ch−ơng trình nhập vào một dãy số thực, sắp xếp và in ra dãy đó theo thứ tự tăng dần.
Program sapxep;
uses crt;
Type mang = array[1..100] of real;
Ch−ơng 9: Kiểu dữ liệu có cấu trúc 87
Var
a: mang; i, j, n: byte;
t: real;
Begin Clrscr;
Write ('Cho so phan tu day n='); readln(n);
for i:=1 to n do begin
Write('a[',i,']='); readln(a[i]);
end;
for i:= 1 to n do for j:= i+1 to n do if a[i]>a[j] then begin
t:= a[j];
a[j]:=a[i];
a[i]:=t;
end;
writeln('Day so sau sap xep:');
for i:=1 to n do writeln (a[i]:6:2);
readln;
End.
Ví dụ 2: Đọc vào dãy số gồm n số nguyên, lập trình thực hiện các việc sau:
a. Xóa các số nhỏ hơn 5, đ−a kết quả ra màn hình b. Xóa các số thuộc đoạn [10, 100]
Program XOASO;
uses crt;
var
a: array[1..100] of Integer;
i, j: integer; c: char;
Begin Clrscr;
Repeat
Write(' Cho so hang cua day n=');Readln(n);
until (n>0) and (n<100) for i:= 1 to n do Begin
Write('So thu',i,':'); Readln(a[i]);
End;
Write ('Xet truong hop nao (a/b)');
repeat
c:= upcase(readkey) until (c='A') or (c='B');
j:=0;
case c of
'A': for i:=1 to n do if a[i]>=5 then begin
inc(j); a[j]:=a[i];
end;
'B': for i:=1 to n do
if (a[i]<10) or (a[i] >100) then begin
inc(j); a[j]:=a[i]
end;
end;
n:=j;
writeln('Day ket qua nhu sau:');
for i:= 1 to n do write(a[i]:8);
writeln(#13#10 'Go phim bat ky de ra!');
c:=readkey;
End.
Ch−ơng 9: Kiểu dữ liệu có cấu trúc 89
Ví dụ 3: Lập trình đọc từ bàn phím dãy n số thực (n<=100) rồi
đếm xem có bao nhiêu số dương, hãy tính tổng các số dương đó. Đưa kết quả ra màn hình.
Program tongsoduong;
uses crt;
Type mang= ARRAY[1..100] of real;
Var
a: mang; i,j,n,dem:byte; s: real;
Begin Clrscr;
s:=0.0; dem:=0;
Write ('Cho so phan tu day n='); readln(n);
for i:=1 to n do begin
Write('a[',i,']='); readln(a[i]);
if a[i] >0 then Begin
dem:=dem+1;
s:= s+a[i];
end;
end;
wrireln('trong ',n,' so co',dem,'so duong ');
wrireln('Tong cac so duong la= ', s:12:3);
readln;
end.
Ví dụ 4: Viết ch−ơng trình tìm giá trị nhỏ thứ 2 của dãy số d−ới
đây: Dãy số: 0, 1, 2, 3, 4, -1, -2, -3, -4, 5.
Program vidu4_c7;
const
a: array[1..10] of shortint = (0,1,2,3,4,-1,-2,-3,-4,5);
var i, imin:byte;
atg: shortint;
Begin
imin:=1; {a[1] coi la nho nhat}
for i:= 2 to 10 do {so voi cac phan tu con lai}
if a[imin] > a[i] then {neu con phan tu nho hon}
imin:=i; {danh dau phan tu do}
atg:=a[1];
a[1]:=a[imin]; {doi gia tri nho nhat ve dau day}
a[imin]:=atg;
imin:=2;
for i:= 3 to 10 do
if a[imin]> a[i] then imin:=i;
writeln('Phan tu nho thu 2 cua day la:', a[imin]);
readln;
End.