Như đã biết trong các giáo trình Pascal, mảng (Array) là một kiểu dữ liệu có cấu trúc lưu trữ các phần tử cùng kiểu và truy cập theo chỉ số (index).
Có hai loại mảng: mảng tĩnh và mảng động. Chúng ta sẽ xem xét sau.
Mảng tĩnh là mảng được khai báo trước số phần tử. Như ví dụ sau khai báo một mảng tĩnh A gồm các phần tử kiểu số nguyên.
var
A: array [0..4] of Integer;
Khai báo trên tương tự như khai báo
type
TA = array [0..4] of Integer;
var
A: TA;
Như trên ta đã khai báo mảng A với 5 phần tử. Cách khai báo đầu gọi là khai báo trực tiếp, cách 2 là gián tiếp do có định nghĩa kiểu TA.
Truy cập vào các phần tử trong mảng theo chỉ số (số thứ tự). Lấy ví dụ mảng A đã khai báo ở trên, ta muốn đặt phần tử thứ 3 trong mảng thành giá trị 10, lúc đó ta làm như sau
A[2] := 10;
Tại sao lại là A[2] mà không phải A[3]. Cũng xin nói thêm rằng mảng chúng ta bắt đầu từ 0, nên phần tử thứ 3 mang chỉ số là 2. Mảng nên được đặt chỉ số từ 0.
Gán giá trị cho một phần tử trong mảng ta nên chú ý đến kiểu dữ liệu cần gán, chẳng hạn không thể gán 'A' cho mảng kiểu Integer được.
Lưu ý: Mảng tĩnh cho tốc độ truy cập nhanh hơn mảng động.
Mảng động là mảng thay đổi được số phần tử trong thời gian chạy mà không cần xác định trước.
Khai báo
var
A: array of Integer;
Lưu ý: Mảng động đánh số từ 0.
Trước khi gán giá trị cho mảng, cần dùng hàm SetLength cấp phát cho mảng một số lượng phần tử nhất định.
SetLength(A, 3);
Sau đó ta có thể tùy ý gán giá trị cho các phần tử đầu đã được cấp phát
A[0] := 10;
A[1] := 4;
A[2] := 5;
A[3] := 1; // Sai vì đã vượt quá phạm vi
Đối với mảng động đa chiều, ta cũng có thể dùng SetLength với hai chỉ số sau để thay đổi.
var
A: array of array of Integer;
...
begin
SetLength(A, 5, 4);
end.
Mảng có thể chứa nhiều mảng khác, gọi là array of array, nghĩa là mảng trong mảng. Một mảng như thế gọi là mảng đa chiều.
Khai báo một mảng đa chiều
var
A: array of array of Integer;
// Mảng động số nguyên hai chiều
B: array [1..2] of array [1..2] of Integer;
// Mảng tĩnh hai chiều
C: array [1..2, 1..2] of Integer;
// Tương tự mảng B nhưng khai báo ngắn hơn
D: array [1..2, 1..2, 1..5] of Integer;
// Mảng tĩnh ba chiều
Như trên, một mảng có thể có nhiều chiều, và có thể là mảng tĩnh hoặc mảng động. Các bạn có thể chuyển sang khai báo gián tiếp dùng từ khóa type tương tự như phần 1.
Gán nhanh giá trị cho mảng động
const
H: array of array of Integer = [[1,2], [1,2,3]];
var
G: array of array of Integer;
...
begin
G := [[2,3], [1,2]];
end.
Lưu ý: Chỉ làm việc với mảng động đa chiều.
Như trên ta gán thông qua khai báo một hằng mảng H, hoặc gán trong chương trình. Các số của mảng được lưu theo từng cặp ngoặc vuông [] như ví dụ trên.
Delphi cung cấp một cách dễ dàng và nhanh chóng để thao tác nhanh với mảng kiểu số và mảng kí tự.
Chẳng hạn ta khai báo nhanh một hằng mảng kiểu số nguyên
const
A = array [1..3] of Integer = (10, 20, 30);
B = array of Integer = [10, 15, 20, 25, 30];
Mảng tĩnh được đặt giá trị hằng bằng cặp ngoặc tròn () và số phần tử phải chính xác với khai báo.
Mảng động được đặt giá trị trong cặp ngoặc vuông [] và số phần tử tùy ý.
Gán giá trị
Không thể gán giá trị cho mảng tĩnh trực tiếp được.
Với mảng động ta có thể gán nhanh giá trị như sau, số các phần tử là tùy ý.
var
A: array of Integer;
...
begin
A := [1, 2, 5, 3, 6];
end.
Với mảng tĩnh kiểu kí tự ta có thể gán nhanh giá trị cho nó tương tự như một string
var
A: array [1..3] of Char;
...
begin
A := 'abc';
end.
Đặt giá trị cho một hằng tương tự
const
A: array [1..2] of Char = 'Vu';
Đối với mảng động kí tự không thể thực hiện gán như trên được.
Lưu ý: Số phần tử của string được gán phải bằng với số phần tử đã được khai báo trước.