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

[Procedural Programming + Ada] Bài 5 - Basic Types & Attributes

0 0 16

Người đăng: Semi Art

Theo Viblo Asia

Thiết kế của Ada có trọng tâm nhấn rất mạnh vào tính năng định kiểu đặc biệt mạnh mẽ. Nếu để kể hết những yếu tố chi tiết mà Ada cung cấp xoay quanh tính năng này thì có lẽ chúng ta sẽ cần khoảng vài bài viết với mật độ kiến thức khá dày. Tuy nhiên thì để duy trì mọi thứ đơn giản và có cái nhìn tổng quan tốt hơn, trong bài viết này chúng ta sẽ chỉ điểm danh qua một số kiểu dữ liệu cơ bản tương tự như đã sử dụng trong các ngôn ngữ khác.

Basic Types

[ Các Giá Trị Số Học ]

  • Integer - biểu thị các giá trị số nguyên.
  • Float - biểu thị các giá trị số thực với độ rộng lưu trữ 32bit.
  • Long_Float - tương đương với double trong C, Java, v.v... và number trong JavaScript với độ rộng lưu trữ 64bit.

Có một đặc trưng đáng lưu ý ở đây, đó là Ada sẽ không bao giờ tự động ngầm định thao tác chuyển đổi kiểu dữ liệu ngay cả khi trình biên dịch đã có đủ dữ kiện về kiểu dữ liệu của các biến.

with Ada.Text_IO; use Ada.Text_IO; procedure Main is A, B : Integer; R : Float;
begin A := 0; B := 1; R := A + B; Put_Line ("Result :" & Float'Image (R));
end Main;
gprbuild -q -P learn_ada.gpr
check_positive.adb:9:11: error: expected type "Standard.Float"
check_positive.adb:9:11: error: found type "Standard.Integer"

[ Nhận Định Logic ]

  • Boolean - biểu thị các giá trị nhận định logic TRUE hoặc FALSE.

[ Nội Dung Văn Bản ]

  • Character - biểu thị các ký tự đơn bao gồm các chữ cái và các ký tự đặc biệt.
  • String - biểu thị chuỗi ký tự có độ dài cố định.
  • Bounded_String - lưu trữ chuỗi có độ dài không cố định nhưng có độ dài tối đa khi định nghĩa.
  • Unbounded_String - lưu trữ chuỗi có độ dài không cố định và không giới hạn độ dài tối đa.

Hm.. có lẽ đây là điểm cần lưu ý, chúng ta sẽ cần xác định rõ các thao tác muốn thực hiện với một chuỗi ký tự để chọn kiểu dữ liệu phù hợp trong Ada.

with Ada.Text_IO; use Ada.Text_IO; procedure Main is -- khai báo biến có độ rộng 10 ký tự Message : String (1 .. 10);
begin -- thử lưu chuỗi có độ rộng 6 ký tự Message := "Hello!"; Put_Line (Message);
end Main;
gprbuild -q -P learn_ada.gpr
main.adb:7:15: warning: wrong length for array of subtype of "Standard.String" defined at line 5 [enabled by default]
main.adb:7:15: warning: Constraint_Error will be raised at run time [enabled by default] out/main
raised CONSTRAINT_ERROR : main.adb:7 length check failed

[ Giá Trị Vô Nghĩa ]

Đặc biệt, Ada không sử dụng giá trị null để biểu thị sự thiếu vắng dữ liệu ở một tên định danh bất kỳ. Nơi duy nhất mà null được sử dụng là các biến con trỏ mà chúng ta sẽ nói đến trong một bài viết sau.

Subtypes

Nhân tiện khi thực hiện một ví dụ về đặc trưng định kiểu của Ada với String. Chúng ta đang có một thông báo lỗi liên quan tới từ subtype - tạm dịch là một kiểu dữ liệu có biên giá trị nhỏ hơn được định nghĩa từ một kiểu dữ liệu đã có trước đó.

with Ada.Text_IO; use Ada.Text_IO; procedure Main is subtype Positive_Integer is Integer range 1 .. Integer'Last; P : Positive_Integer; I : Integer;
begin I := 9; P := I - 8; P := I - 1; -- error Put_Line ("P is" & Integer'Image (P));
end Main;
gprbuild -q -P learn_ada.gpr
main.adb:10:11: warning: value not in range of type "Positive_Integer" defined at line 4 [enabled by default]
main.adb:10:11: warning: Constraint_Error will be raised at run time [enabled by default] out/main
raised CONSTRAINT_ERROR : main.adb:10 range check failed

Như đã thấy thì trong kết quả biên dịch code chúng ta đã nhận được cảnh báo warning ở dòng P := P - 1; sẽ bị tràn giá trị lưu trữ. Tuy nhiên ở dòng P := I - 8; thì logic vận hành hoàn toàn được cho phép chứ không giống như trong trường hợp của FloatInteger.

Và ở đây chúng ta có thể hiểu rằng subtype sẽ không tạo ra một kiểu dữ liệu mới, mà tạo ra một giới hạn ràng buộc nhỏ hơn so với kiểu dữ liệu ban đầu. Chúng ta sẽ có thể sử dụng các thao tác tính toán với các biến thuộc kiểu dữ liệu gốc bình thường. Thao tác định nghĩa subtype như thế này sẽ rất hữu ích nếu chúng ta muốn tạo ràng buộc cho một biến lưu kết quả tính toán.

Attributes

Các thuộc tính attribute trong Ada có thể được hiểu như các phương thức được thiết kế để làm việc với các yếu tố như kiểu dữ liệu Type, các giá trị Value, và các chương trình con Sub-program. Chúng ta đã sử dụng attribute ngay từ ví dụ Hello, World! ở bài viết mở đầu. Đó là Image, một thuộc tính chung của các kiểu dữ liệu để chuyển một giá trị thuộc kiểu đó thành một chuỗi String.

with Ada.Text_IO; use Ada.Text_IO; procedure Main is N : Integer;
begin N := 0; Put_Line ("N is" & Integer'Image (N)); -- update value N := N + 1; Put_Line ("Now is" & Integer'Image (N));
end Main;

Ký tự nháy đơn ' ở đây được sử dụng khá giống với phép thực thi . khi chúng ta sử dụng một phương thức static trong JavaScript. Và để duy trì mục tiêu của bài viết xoay quanh việc giới thiệu các khái niệm thì chúng ta sẽ chỉ ghi chú một số thuộc tính attribute phổ biến sau:

  • Type'Image (V) - chuyển một giá trị V thuộc kiểu Type thành chuỗi String.
  • Type'Value (S) - chuyển một chuỗi S thành một giá trị thuộc kiểu Type.
  • Type'First - trả về giá trị đầu tiên trong biên giá trị thuộc kiểu Type.
  • Type'Last - trả về giá trị cuối cùng trong biên giá trị thuộc kiểu Type.
with Ada.Text_IO; use Ada.Text_IO; procedure Main is N : Integer;
begin N := Integer'Value ("1990"); Put_Line ("Scanned :" & Integer'Image (N)); -- N := Integer'First; Put_Line ("Min :" & Integer'Image (N)); -- N := Integer'Last; Put_Line ("Max :" & Integer'Image (N));
end Main;
Scanned : 1990
Min :-2147483648
Max : 2147483647

Trong bài viết tiếp theo, chúng ta sẽ nói về việc tự định nghĩa các kiểu dữ liệu mới.

(chưa đăng tải) [Procedural Programming + Ada] Bài 6 - Custom Types

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 66

- 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 72

- 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