II. KIểU MảNG, KIểU CHUẩN
a. Mảng một chiều (One-Dimensional Array)
Mảng một chiều có thể đợc hiểu nh một danh sách các phần tử (theo cột), có cùng kiểu. Mỗi phần tử của mảng đợc xác định đợ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 [].
Ví dụ 8.7: List là một mảng 1 chiều có n phần tử. Các phần tử của List có thể mang các tên List[1], List[2], List[3],..., List[n], và có thể minh họa nh hình sau:
List[1] List[2] List[3] List[4]... List[n] Hình 8.1: Minh họa mảng một chiều
+ Khai báo gián tiếp:
TYPE
<Kiểu mảng> = ARRAY [Kiểu chỉ số] OF <Kiểu phần tử >; VAR
+ Khai báo trực tiếp:
VAR
< Danh sách biến >: ARRAY [Kiểu chỉ số] OF < Kiểu phần tử >;
* Chú ý: Kiểu chỉ số phải là kiểu rời rạc (đếm đợc). Ví dụ 8.8: TYPE
KM1 = ARRAY [1.. 100] OF INTEGER; KM2 = ARRAY [1.. 20] OF CHAR; DAY = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); VAR
TUOI: KM1; TEN: KM2;
NGAY: ARRAY [DAY] OF BOOLEAN; ý nghĩa:
- KM1 là kiểu mảng gồm 100 phần tử đợc đánh số từ 1 đến 100 thông qua kiểu chỉ dẫn là một miền con các số nguyên từ 1.. 100. TUOI là biến có kiểu là KM1.
- KM2 là kiểu mảng gồm 20 phần tử đánh số từ 1.. 20 có kiểu là các ký tự. Biến TEN có kiểu là KM2.
- NGAY là một biến mảng gồm 7 phần tử kiểu Boolean đợc đánh dấu qua kiểu chỉ dẫn là tên của 7 ngày trong tuần.
Chú ý: Khi khai báo mảng, kiểu chỉ dẫn chỉ có thể là:
- Kiểu miển con của các loại dữ liệu vô hớng đếm đợc nh ký tự, số nguyên - Kiểu liệt kê do ngời viết định nghĩa (nh NGAY trong tuần)
- Kiểu Boolean
Kiểu chỉ dẫn không thể là kiểu không đếm đợc nh REAL Viết nh sau là SAI: X1: ARRAY [Real] OF Integer;
Ta cũng không thể khai báo nh: X2: ARRAY [Integer] OF Integer;
Mặc dầu Integer là kiểu vô hớng đếm đợc do giới hạn của vùng nhớ dành cho dữ liệu, số lợng phần tử của 1 mảng cũng bị hạn chế tùy theo kích thớc của kiểu dữ liệu của các phần tử, ta nên dùng kiểu miền con để khai báo số phần tử của mảng.
+ Truy xuất các phần tử của mảng:
Mỗi phần tử của mảng đợc truy xuất thông qua Tên Biến Mảng cùng với chỉ số của mảng trong dấu ngoặc vuông []. Ví dụ tên biến mảng là A, khi viết A[7], ta hiểu nó là phần tử thứ 7 của mảng A.
Ví dụ 8.9: Lập trình giải một bài toán tính trung bình một dãy số x[i]: x[1], x[2], x[3],..., x[n]
sau đó tiếp tục tính độ lệch (deviation) của từng phần tử so với trị trung bình, theo công thức:
độ_lệch = x[i] - trung_bình
Giả sử dãy số của chúng ta có giới hạn n = 100 phần tử trở lại, n là một biến số để khai báo số phần tử muốn tính . Sau đó ta lần lợt nhập tính giá trị của
phần tử kiểu số thực (real) từ phần tử thứ 1 đến phần tử thứ n. Trong chơng trình sẽ tạo ra một mảng 1 chiều x với n các phần tử. Tính trung bình của n phần tử và độ lệch. In kết quả ra màn hình.
PROGRAM Average_deviations;
{Nhập n số phần tử kiểu số thực, tính trị trung bình của chúng, sau đó tính tiếp độ lệch của từng phần tử số so với trị trung bình}
VAR
n, count: integer;
sum, average, deviation: real; x: ARRAY [1.. 100] OF real; BEGIN
(* Nhập số phần tử và tính trung bình*)
Write (' Nhập bao nhiêu số n để tính trung bình ? '); Readln (n); Writeln; sum:= 0; FOR count:= 1 TO n DO BEGIN Write ( ‘ i = ‘, count: 3, ‘ x = ‘ ); Readln (x [count] );
sum:= sum + x[count]; END;
average:= sum/n;
Writeln (' Trung bình của dãy số là =, average '); Writeln;
(* Tính độ lệch so với trị trung bình *) FOR count:= 1 TO n DO
BEGIN
deviation:= x[count] - average;
Write ( ‘ i = ‘, count: 3, ‘ x = ‘, x[count] ); Writeln (' ộ lệch d =, deviation ');
END; Readln; END.
Giả sử, ta nhập vào 5 số hạng (các số có gạch dới là phần của ngời nhập): x[1] = 3.0 x[2] = -2.0 x[3] = 12.0 x[4] = 4.4 x[5] = 3.5
Khi chạy chơng trình (nhấn Ctrl + F9), trên màn hình ta sẽ thấy: Nhập bao nhiêu số n để tính trung bình ? 5
i = 1 x = 3.0
i = 2 x = -2.0
i = 3 x = 12.0
i = 5 x = 3.5
Trung bình của dãy số là = 4. 1800000E+00
i = 1 x = 3. 0000000E+00 ộ lệch d = - 1. 1800000E+00 i = 2 x = -2. 0000000E+00 ộ lệch d = - 6. 1800000E+00 i = 3 x = 1. 2000000E+00 ộ lệch d = 7. 8200000E+00 i = 4 x = 4. 4000000E+00 ộ lệch d = 2. 2000000E - 01 i = 5 x = 3. 5000000E+00 ộ lệch d = - 6. 8000000E - 01 Ta có thể định khoảng chừa kết quả và phần lẻ thập phân, dùng lệnh: m: n Ví dụ 8.10: Sắp xếp một dãy số theo thứ tự từ nhỏ đến lớn
Tiến trình của bài toán:
- Giả sử chuỗi số của ta có n phần tử . Lần lợt cho chơng trình đọc giá trị của các phần tử nhập đợc.
- Một thủ tục (Procedure) sẽ làm công việc sắp xếp nh sau: đầu tiên đa phần tử thứ nhất so sánh với các phần tử tiếp theo, nếu nó lớn hơn phần tử so sánh thì đem đổi chổ giá trị của hai phần tử với nhau. Sau đó tiếp tục đem phần tử thứ 2 so sánh các phần tử tiếp theo theo trình tự nh vậy,... và cứ nh thế cho đến phần tử thứ n - 1.
- In kết quả ra màn hình Chơng trình Pascal nh sau: PROGRAM Reorder; (* Sắp xếp một mảng các phần tử số thực từ nhỏ đến lớn*) VAR n, i, loc: 1.. 100; x: ARRAY [1.. 100] OF real; temp: real; PROCEDURE interchange; (* ổi chỗ các phần tử mảng từ nhỏ đến lớn*) BEGIN FOR loc:= 1 TO n-1 DO
FOR i:= loc + 1 TO n DO IF x[i] < x [loc] THEN
BEGIN temp:= x[loc]; x[loc]:= x[i]; x[i]:= temp; END; END; BEGIN
Write (' Có bao nhiêu phần tử số ? '); Readln (n); FOR i:= 1 TO n DO
BEGIN
Write ( ‘ x[‘, i: 3, ‘] = ? ‘ ); Readln( x[i] );
interchange; Writeln; Writeln (' Số liệu đã sắp xếp: '); Writeln; FOR i:= 1 TO n DO Writeln ( ‘x[‘, i: 3, ‘] = ‘, x[i]: 4: 1 ); Readln; END.
Khi chạy chơng trình, giả sử ta có 5 số liệu nh phần nhập: (các số có gạch dới là phần nhập từ bàn phím) Có bao nhiêu phần tử số ? 5 x[1] = ? 4. 7 x[2] = ? - 2. 3 x[3] = ? 12. 9 x[4] = ? 8. 8 x[5] = ? 6. 0 Kết quả là: Số liệu đã sắp xếp: x[1] = ? - 2. 3 x[2] = ? 4. 7 x[3] = ? 6. 0 x[4] = ? 8. 8 x[5] = ? 12. 9