Mảng và vòng lặp
Mảng trong Ada mẫu mực lắm, chúng chả gây ngạc nhiên là bao cho người dùng Pascal và C. Lại xin trình diễn một đoạn mã làm thí dụ.
Code: declare
type Mang_ky_tu is array (1..100) of Character;
type Ma_tran is array(1..100, 1..100) of Float;
S, S2 : Mang_ky_tu;
M, M2 : Ma_tran;
begin
S(1) := ‘A’; -- gán 1 kí tự
S2 := S; -- gán toàn bộ mảng
S(11..15) := S(1..5); -- gán một phân mảng (slice)
S(1..5) := "Hello"; -- xâu kí tự là mảng 1 chiều
M(55, 55) := 100.0; -- chỉ số 2 chiều
end;
Mảng được đánh chỉ số bằng cặp ngoặc tròn. Điều đó thoạt nhìn thì khá điên rồ nhưng dĩ nhiên có lợi ích của nó. Nhờ đó mà có thể dễ dàng đổi truy cập mảng thành lời gọi hàm (ánh xạ), thật là một cách che giấu chi tiết thực thi hoàn hảo. Trong Ada, có thể gán cả một mảng mà chả cần dùng tới vòng lặp for nào cả. Cũng đơn giản như thế, có thể làm việc với các
phân mảng (slice), nghĩa là một “mảng con” bao gồm các phần tử đứng cạnh nhau trong mảng. Các xâu ký tự được định nghĩa hoàn toàn tự nhiên – nhờ mảng ký tự.
Tất nhiên, mảng cũng có những thuộc tính của nó. Thuộc tính
First cho chỉ số nhỏ nhất, thuộc tính
Last cho chỉ số lớn nhất. Đặc biệt hữu ích là thuộc tính
Range, cho khoảng chỉ số, rất tiện dùng để lần lượt duyệt qua tất cả các phần tử của mảng. Xin trình diễn một
vòng lặp for của Ada trước đã.
Code: for i in 1..20 loop
-- hành động lặp (khi chạy sẽ được lặp 20 lần)
end loop;
Vòng lặp for là như thế đó
. Biến i không được khai báo ở đâu cả, kiểu của nó được tự động xác định theo khoảng đi sau từ khóa
in. Vòng lặp không được giới hạn trong cặp từ khóa
begin và
end mà được giới hạn trong cặp
loop và
end loop, nhờ đó một mã nguồn tương đối dài sẽ dễ đọc hơn. Và cuối cùng thì ta cũng được xem màn “foreach”.
Code: for i in S’Range loop
-- hành động trên phần tử S(i)
end loop;
Thật phong nhã và an toàn. Lập trình viên chẳng cần phải xác định xem mảng được đánh chỉ số từ 0 hay từ 1, cũng chẳng cần phải biết cận trên bằng bao nhiêu. Điều đó không có gì ấn tượng so với những chuẩn mực ngày nay. Đa số chúng ta đều dùng những lớp container tinh xảo của C# / Java / C++ STL, nơi ta không phải lo ngại về việc tràn chỉ số. Nhưng bạn phải tưởng tượng được rằng mã nguồn trên có thể biên dịch được cho một máy đích đơn chip nào đó nằm mơ cũng chả thấy Java thì bạn mới nhận ra sự phong nhã ấy giá trị biết nhường nào.