[Procedural Programming + Ada] Bài 6 – Enums & Records

Như vậy là chúng ta đã điểm qua các kiểu dữ liệu đơn nguyên được định nghĩa sẵn bởi Ada và một thao tác rất hữu ích khi muốn tạo ràng buộc biên lưu trữ nhỏ hơn cho một biến bất kỳ. Đó là thao tác định nghĩa một subtype từ một kiểu dữ liệu

Như vậy là chúng ta đã điểm qua các kiểu dữ liệu đơn nguyên được định nghĩa sẵn bởi Ada và một thao tác rất hữu ích khi muốn tạo ràng buộc biên lưu trữ nhỏ hơn cho một biến bất kỳ. Đó là thao tác định nghĩa một subtype từ một kiểu dữ liệu đã được định nghĩa trước đó.

Type

Một subtype không phải là một kiểu dữ liệu hoàn toàn mới so với kiểu ban đầu và có thể tham gia vào các biểu thức tính toán cùng với kiểu ban đầu mà không cần phải thực hiện thao tác chuyển đổi kiểu dữ liệu. Bên cạnh đó thì Ada cũng hỗ trợ chúng ta định nghĩa các kiểu type hoàn toàn mới.

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
   type d is new Integer
      range 1 .. 31;
   
   Day : d;
   I : Integer;
begin
   Day := 23;
   I := 1;
   -- try to increase Day by I
   Day := Day + I;
   Put_Line (d'Image (Day));
end Main;

Ở đây chúng ta đang định nghĩa kiểu d để biểu thị các ngày trong tháng từ kiểu số nguyên Integer với biên giá trị giới hạn trong khoảng 1 .. 31. Sau đó chúng ta đã khai báo biến Day : d và biến I : Integer, và thử thực hiện phép toán cộng gộp giá trị số nguyên I vào Day. Do d là kiểu dữ liệu hoàn toàn mới chứ không phải là một subtype, thao tác này hiển nhiên sẽ không hợp lệ.

gprbuild -q -P learn_ada.gpr
main.adb:18:15: error: invalid operand types for operator "+"
main.adb:18:15: error: left operand has type "d" defined at line 5
main.adb:18:15: error: right operand has type "Standard.Integer"
gprbuild: *** compilation phase failed

Enum

Trước khi tự định nghĩa một kiểu dữ liệu phức hợp với thao tác type, chúng ta sẽ xem xét một trường hợp phổ biến khác – đó là khi chúng ta muốn định nghĩa một kiểu đơn nguyên với một tập giá trị hữu hạn có thể liệt kê được Enumerable.

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
   type dddd is ( Sun,
      Mon, Tue, Wed,
      Thu, Fri, Sat );
begin
   for Day in dddd loop
      case Day is
         When Sun => Put_Line (dddd'Image (Day) & " : Sunday");
         When Mon => Put_Line (dddd'Image (Day) & " : Monday");
         When Tue => Put_Line (dddd'Image (Day) & " : Tuesday");
         When Wed => Put_Line (dddd'Image (Day) & " : Wednesday");
         When Thu => Put_Line (dddd'Image (Day) & " : Thursday");
         When Fri => Put_Line (dddd'Image (Day) & " : Friday");
         When Sat => Put_Line (dddd'Image (Day) & " : Saturday");
      end case;
   end loop;
end Main;

Ở đây chúng ta đang định nghĩa dddd là một kiểu type mới với tập giá trị được liệt kê trong ngoặc đơn ( Sun, ..., Sat );. Sau đó chúng ta đã thử lặp qua tập giá trị này và in các giá trị này kèm theo ý nghĩa biểu thị các ngày trong tuần.

SUN : Sunday
MON : Monday
TUE : Tuesday
WED : Wednesday
THU : Thursday
FRI : Friday
SAT : Saturday

Như đã thấy trong kết quả thì chúng ta có các giá trị được liệt kê trong cặp ngoặc đơn định nghĩa dddd đã được lưu thành một tập các hằng số mà chúng ta có thể lặp qua bằng một vòng lặp. Thao tác định nghĩa các kiểu Enum rất hữu ích khi sử dụng với case .. when bởi chúng ta có thể dễ dàng liệt kê đầy đủ các trường hợp khả thi mà không cần dự trù when others.

Record

Tất cả những kiểu dữ liệu mà chúng ta đã biết tới trước đó, đều là các kiểu đơn nguyên. Bây giờ chúng ta sẽ tự định nghĩa một kiểu dữ liệu tổ hợp. Tương tự như việc sử dụng struct trong C, thì Ada gọi đây là record (bản ghi) – để mô tả các bản ghi dữ liệu về các thực thể trong cuộc sống.

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
   type Date is record
      Day : Integer range 1 .. 31;
      Month : Integer range 1 .. 12;
      Year : Integer range 1 .. 3000;
   end record;

   Birthday : Date;
begin
   Birthday := ( Day => 13,
                 Month => 2,
                 Year => 1990 );

   Put_Line ("Birthday : Date record");
   Put_Line ("   Day => " & Integer'Image (Birthday.Day));
   Put_Line ("   Month => " & Integer'Image (Birthday.Month));
   Put_Line ("   Year => " & Integer'Image (Birthday.Year));
end Main;

Ở đây chúng ta định nghĩa một kiểu record có tên là Date để mô tả ngày tháng với các trường dữ liệu lần lượt là Day, Month, Year, đều là các giá trị số nguyên Integer. Sau đó chúng ta đã tạo ra một bản ghi Bỉrthday với các trường dữ liệu tương ứng.

Birthday : Date record
   Day =>  13
   Month =>  2
   Year =>  1990

(chưa đăng tải) [Procedural Programming + Ada] Bài 7 – Arrays & Aggregates

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ