- vừa được xem lúc

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

0 0 17

Người đăng: Semi Art

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 67

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 47

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 41

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 75

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 280

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 50