Các kiểu dữ liệu thứ tự Loại thứ tự

Các loại thứ tự

Chủ đề 3. Cấu trúc kiểu dữ liệu. Các thủ tục và hàm tiêu chuẩn áp dụng cho số nguyên, số thực. Logic, ký tự, kiểu liệt kê, kiểu phạm vi. Ví dụ.

Loại dữ liệu

Bất kỳ dữ liệu nào, tức là các hằng, biến, giá trị hàm hoặc biểu thức được đặc trưng bởi kiểu của chúng. Một kiểu xác định tập hợp các giá trị hợp lệ mà một đối tượng có thể có, cũng như tập hợp các thao tác hợp lệ có thể áp dụng cho nó. Ngoài ra, loại này còn xác định định dạng biểu diễn dữ liệu bên trong trong bộ nhớ PC.

Turbo Pascal được đặc trưng bởi cấu trúc phân nhánh của các kiểu dữ liệu.

Các loại đơn giản

1. Các loại thứ tự được phân biệt bởi thực tế là mỗi loại có một số hữu hạn các giá trị có thể. Các giá trị này có thể được sắp xếp theo một cách nhất định và do đó, một số nhất định có thể được liên kết với mỗi giá trị đó - số thứ tự của giá trị.

2. Nói đúng ra, các loại thực cũng có số lượng giá trị hữu hạn, được xác định bởi định dạng biểu diễn bên trong của một số thực.

Các loại thứ tự

Các kiểu thứ tự bao gồm các kiểu số nguyên, logic, ký tự, kiểu liệt kê và phạm vi. Hàm ORD(X) trả về giá trị thứ tự của biểu thức X và áp dụng cho bất kỳ loại thứ tự nào. Đối với kiểu số nguyên, hàm trả về giá trị của chính X, tức là ORD(X)=X cho X thuộc loại số nguyên bất kỳ.

ORD(X) cho loại ký tự cung cấp số nguyên trong phạm vi từ 0 đến 255, đối với loại liệt kê ORD(X) cung cấp số trong phạm vi từ 0 đến 65535. Loại phạm vi giữ lại tất cả các thuộc tính của loại thứ tự cơ sở , do đó kết quả áp dụng hàm ORD cho nó là (X) phụ thuộc vào thuộc tính của loại này. Bạn cũng có thể áp dụng các hàm cho các loại thứ tự:

PRED (X) - trả về giá trị trước đó của loại thứ tự, tức là ORD(PRED(X))= ORD(X)-1;

SUCC(X) - trả về giá trị tiếp theo của loại thứ tự (tương ứng với số thứ tự ORD (X)+1), tức là

Một kiểu dữ liệu xác định một tập hợp các giá trị hợp lệ và một tập hợp các phép toán hợp lệ.

Các loại đơn giản.

Các loại đơn giản được chia thành ORDINAL và REAL.

1. CÁC LOẠI ĐẶT HÀNG , lần lượt có:

toàn bộ

Pascal định nghĩa 5 kiểu số nguyên, được xác định tùy thuộc vào dấu và giá trị mà biến sẽ lấy.

Tên loại

Độ dài (tính bằng byte)

Phạm vi giá trị

32 768...+32 767

2 147 483 648...+2 147 483 647

b) logic

Tên của loại này là BOOLEAN. Giá trị Boolean có thể là một trong các hằng số Boolean: TRUE (true) hoặc FALSE (false).

c) mang tính biểu tượng

Tên của loại này là CHAR - chiếm 1 byte. Giá trị của loại ký tự là tập hợp tất cả các ký tự PC. Mỗi ký tự được gán một số nguyên trong phạm vi 0…255. Con số này đóng vai trò như một mã để thể hiện bên trong biểu tượng.

2. LOẠI THẬT .

Không giống như các loại thứ tự, có giá trị luôn được ánh xạ tới một chuỗi số nguyên và do đó được biểu diễn hoàn toàn chính xác trong PC, các giá trị của loại thực chỉ xác định một số tùy ý với một số độ chính xác hữu hạn tùy thuộc vào định dạng bên trong của số thực .

Độ dài của kiểu dữ liệu số, byte

Tên kiểu dữ liệu số

Số chữ số có nghĩa của kiểu dữ liệu số

Phạm vi thứ tự thập phân của kiểu dữ liệu số

2*1063 +1..+2*1063 -1

LOẠI CẤU TRÚC

Các kiểu dữ liệu có cấu trúc xác định một tập hợp các biến vô hướng có thứ tự và được đặc trưng bởi loại thành phần của chúng.

Các kiểu dữ liệu có cấu trúc, không giống như các kiểu dữ liệu đơn giản, xác định nhiều giá trị phức tạp bằng một tên chung. Chúng ta có thể nói rằng các kiểu cấu trúc xác định một cách nhất định để hình thành các kiểu mới từ những kiểu hiện có.

Có một số phương pháp cấu trúc. Theo phương pháp tổ chức và kiểu thành phần trong kiểu dữ liệu phức tạp, người ta phân biệt các loại sau: kiểu thông thường (mảng); loại kết hợp (hồ sơ); filetype(tập tin); nhiều loại; loại chuỗi(chuỗi); trong ngôn ngữ Turbo Pascal phiên bản 6.0 trở lên, một loại đối tượng (đối tượng) đã được giới thiệu.

Không giống như các kiểu dữ liệu đơn giản, dữ liệu kiểu có cấu trúc được đặc trưng bởi sự đa dạng của các phần tử tạo thành kiểu này, tức là một biến hoặc hằng của kiểu có cấu trúc luôn có nhiều thành phần. Lần lượt, mỗi thành phần có thể thuộc về một loại có cấu trúc, tức là có thể lồng các loại.

1. Mảng

Mảng trong Turbo Pascal về nhiều mặt tương tự như các kiểu dữ liệu tương tự trong các ngôn ngữ lập trình khác. Một đặc điểm khác biệt của mảng là tất cả các thành phần của chúng đều là dữ liệu cùng loại (có thể có cấu trúc). Các thành phần này có thể được sắp xếp dễ dàng và có thể truy cập bất kỳ thành phần nào trong số chúng chỉ bằng cách chỉ định số sê-ri.

Mô tả mảng được chỉ định như sau:

<имя типа>= mảng [<сп.инд.типов>] của<тип>

Đây<имя типа>- định danh chính xác;

Mảng, của – các từ dành riêng (mảng, từ);

<сп.инд.типов>- danh sách một hoặc nhiều loại chỉ mục, được phân tách bằng dấu phẩy; dấu ngoặc vuông đóng khung danh sách là một yêu cầu về cú pháp;

<тип>- bất kỳ loại Turbo Pascal nào.

Bất kỳ loại thứ tự nào cũng có thể được sử dụng làm loại chỉ mục trong Turbo Pascal, ngoại trừ LongInt và loại phạm vi có loại cơ sở LongInt.

Độ sâu lồng của các kiểu có cấu trúc nói chung và do đó của mảng là tùy ý, do đó số phần tử trong danh sách chỉ mục kiểu (kích thước mảng) không bị giới hạn, tuy nhiên, tổng chiều dài của biểu diễn bên trong của bất kỳ mảng nào cũng không thể lớn hơn 65520 byte.

2. Hồ sơ

Bản ghi là một cấu trúc dữ liệu bao gồm một số thành phần cố định được gọi là trường bản ghi. Không giống như mảng, các thành phần (trường) của bản ghi có thể có nhiều loại khác nhau. Để có thể tham chiếu đến một hoặc một thành phần khác của bản ghi, các trường được đặt tên.

Cấu trúc của một khai báo kiểu bài viết là:

< Tênkiểu>=GHI< liên doanh. lĩnh vực>KẾT THÚC

Đây<имя типа>- định danh chính xác;

GHI, KẾT THÚC – các từ dành riêng (ghi, kết thúc);

<сп.полей>- danh sách các trường; là một chuỗi các phần của bản ghi được phân tách bằng dấu chấm phẩy.

3 bộ

Bộ là một tập hợp các đối tượng cùng loại được kết nối logic với nhau. Bản chất của các kết nối giữa các đối tượng chỉ được lập trình viên ngụ ý và không được điều khiển bởi Turbo Pascal. số phần tử trong một tập hợp có thể thay đổi từ 0 đến 256 (tập hợp không chứa các phần tử được gọi là tập rỗng) Chính sự không nhất quán về số lượng phần tử của nó khiến tập hợp khác với mảng và bản ghi.

Hai tập hợp được coi là tương đương khi và chỉ khi tất cả các phần tử của chúng giống nhau và thứ tự các phần tử của tập hợp đó không đổi. Nếu tất cả các phần tử của một tập hợp cũng được bao gồm trong một tập hợp khác thì tập hợp đầu tiên được cho là nằm trong tập hợp thứ hai.

Mô tả của loại tập hợp là:

< Tênkiểu>=BỘ< căn cứ. kiểu>

Đây<имя типа>- định danh chính xác;

SET, OF – các từ dành riêng (set, from);

<баз.тип>- loại cơ sở của các phần tử tập hợp, có thể là bất kỳ loại thứ tự nào ngoại trừ WORD, INTEGER và LONGINT.

Để xác định một tập hợp, cái gọi là hàm tạo tập hợp được sử dụng: danh sách các thông số kỹ thuật của các phần tử của tập hợp, được phân tách bằng dấu phẩy; danh sách được bao quanh bởi dấu ngoặc vuông. Thông số phần tử có thể là hằng số hoặc biểu thức của một loại cơ sở, cũng như một loại phạm vi có cùng loại cơ sở.

4. Tập tin

Tệp được hiểu là vùng được đặt tên của bộ nhớ ngoài của PC hoặc thiết bị logic - nguồn hoặc bộ thu thông tin tiềm năng.

Bất kỳ tập tin nào cũng có ba tính năng đặc trưng

    nó có một tên, cho phép chương trình hoạt động với nhiều tệp cùng một lúc.

    nó chứa các thành phần cùng loại. Loại thành phần có thể là bất kỳ loại Turbo Pascal nào, ngoại trừ các tệp. Nói cách khác, bạn không thể tạo một “tệp của các tệp”.

    Độ dài của tệp mới tạo không được chỉ định theo bất kỳ cách nào khi nó được khai báo và chỉ bị giới hạn bởi dung lượng của thiết bị bộ nhớ ngoài.

Một loại tệp hoặc biến loại tệp có thể được chỉ định theo một trong ba cách:

< Tên>= TẬP TIN< kiểu>;

< Tên>=VĂN BẢN;

<имя>= TỆP;

Đây<имя>- tên loại tệp (định danh chính xác);

FILE, OF – các từ dành riêng (file, from);

TEXT – tên của loại tệp văn bản tiêu chuẩn;

<тип>- bất kỳ loại Turbo Pascal nào, ngoại trừ các tập tin.

Tùy thuộc vào phương pháp khai báo, có thể phân biệt ba loại tệp:

· các tập tin được đánh máy (được đặt bởi mệnh đề FILE OF...);

· tập tin văn bản (được định nghĩa là loại TEXT);

· các tập tin chưa được gõ (được xác định bởi loại FILE).

Về chuyển đổi kiểu dữ liệu số của Pascal

Trong Pascal, việc chuyển đổi ngầm (tự động) các kiểu dữ liệu số gần như không thể thực hiện được. Một ngoại lệ chỉ được thực hiện cho kiểu số nguyên, được phép sử dụng trong các biểu thức kiểu thực. Ví dụ: nếu các biến được khai báo như thế này:

Var X: số nguyên; Y: có thật;

sau đó người điều hành

sẽ đúng về mặt cú pháp, mặc dù có một biểu thức số nguyên ở bên phải dấu gán và một biến thực ở bên trái, trình biên dịch sẽ tự động chuyển đổi các kiểu dữ liệu số. Việc chuyển đổi ngược lại tự động từ kiểu thực sang kiểu số nguyên là không thể trong Pascal. Hãy nhớ có bao nhiêu byte được phân bổ cho các biến kiểu số nguyên và số thực: 2 byte bộ nhớ được phân bổ cho số nguyên kiểu dữ liệu số nguyên và 6 byte cho số thực. Có hai hàm dựng sẵn để chuyển đổi số thực thành số nguyên: round(x) làm tròn số thực x thành số nguyên gần nhất, trunc(x) cắt bớt số thực bằng cách loại bỏ phần phân số.

Chương II. Loại dữ liệu.

§7. Loại dữ liệu. Các kiểu thứ tự Pascal

Loại dữ liệu.

Trong đoạn thứ hai, chúng ta đã tìm hiểu một chút về các kiểu dữ liệu. Điều này là cần thiết để bắt đầu lập trình. Trong phần này chúng ta sẽ xem xét chi tiết tất cả các kiểu dữ liệu hiện có trong Pascal.

Trước tiên, chúng ta hãy tìm hiểu thuật ngữ “kiểu dữ liệu” là gì. Để làm điều này, chúng tôi liệt kê một số khía cạnh, một số khía cạnh đã được đưa ra trong đoạn thứ hai.

Bộ nhớ trong máy tính bao gồm các ô cơ bản chỉ có thể chứa một hoặc một số không. Mỗi ô có địa chỉ duy nhất của riêng nó. Kích thước bộ nhớ trong một ô được gọi là bit. Kích thước bộ nhớ 8 ô được gọi là byte. 1024 byte tạo thành một kilobyte. Và 1024 kilobyte tạo thành một megabyte. 1024 megabyte– một gigabyte và 1024 gigabyte– một tyrobyte.

Một câu hỏi thích hợp phải nảy sinh trong đầu bạn là tại sao lại có 1024 byte trong một kilobyte. Thực tế là tiền tố, chẳng hạn như kilo, trong cuộc sống bình thường có nghĩa là con số phải được nhân với một nghìn. Ví dụ: 5 km– đây là 5000 mét. Nhưng khi biểu thị dung lượng bộ nhớ, tiền tố kilo có nghĩa là số đó phải được nhân với 1024. Con số này không phải ngẫu nhiên phát sinh mà nó bằng hai lũy thừa mười. Có một thời điểm, các lập trình viên đầu tiên đã đồng ý và quyết định gọi dung lượng bộ nhớ là 1024 byte là một kilobyte. Theo đó, 1 kilobyte nhân với một kilobyte sẽ bằng một megabyte. Và một megabyte nhân với một megabyte bằng một gigabyte. Và như thế.

Lý do cho sự sắp xếp này là do cấu trúc của chính các máy tính. Và thật thuận tiện cho những lập trình viên đầu tiên sử dụng con số đặc biệt này.

Ví dụ: chúng ta có thể tính toán có bao nhiêu ô cơ bản được chứa trong một gigabyte RAM. Một gigabyte– đây là 1024 megabyte. Một megabyteđây là 1024 kilobyte. Theo đó, một gigabyte chứa 1024 x 1024 = 1048576 kilobyte. Nhân lại với 1024 và nhận được 1073741824 byte. Hãy nhân số này với 8chúng tôi nhận được 8589934592 bit. Đây là số lượng ô nhớ cơ bản được chứa trong một gigabyte RAM.

Tiếp tục nào. Hãy tưởng tượng rằng chúng ta cần xử lý 24 ô nhớ cơ bản, hay nói cách khác là 24 bit. Nội dung của các ô này có thể được biểu diễn dưới dạng danh sách. Ví dụ: nó có thể như thế này:

Bây giờ hãy nghĩ xem làm thế nào để hiểu được những gì được viết ở đây từ danh sách có vẻ hỗn loạn này. Có thể đây là ngày sinh nhật của ai đó, hoặc đây là tên của một người nào đó. Nó có thể là bất cứ thứ gì từ tên của một người đến một bức ảnh kỹ thuật số. Xin lưu ý, đây là nguồn gốc của cái tên nhiếp ảnh kỹ thuật số. Những thứ kia. ảnh được lưu trữ dưới dạng kỹ thuật số.

Để máy tính hiểu được thông tin nào được ghi vào bộ nhớ, có các kiểu dữ liệu. Ví dụ: nếu chúng ta chia danh sách này thành 4 nhóm 8 bit thì chúng ta sẽ nhận được 4 byte thông tin. Để rõ ràng, hãy viết lại danh sách bằng dấu cách:

00000001 00000010 00010100 00001101

Ví dụ: chúng ta có thể xem xét một danh sách như sau: có tổng cộng bốn số nhị phân. Giả sử số đầu tiên sẽ chỉ ngày trong tháng, số thứ hai- tháng, thứ ba - hai chữ số đầu tiên của năm, thứ tưhai chữ số thứ hai của năm. Theo đó, chúng tôi coi danh sách này như một loại ngày tháng. Trong trường hợp này, chúng tôi hiểu danh sách số 1 và số 0 dường như vô nghĩa, hỗn loạn này có ý nghĩa gì.

Về nguyên tắc, chúng ta có thể đọc danh sách này theo bất kỳ cách nào chúng ta muốn. Bạn có thể có hai bit, một hoặc năm. Danh sách này cũng có thể có ý nghĩa gì đó, điều chính là chúng ta phải thống nhất trước về cách đọc nó và ý nghĩa của nó.

Sự sắp xếp này chính xác là kiểu dữ liệu. Những thứ kia. Bằng cách sử dụng một loại nhất định, chúng ta “đồng ý với máy tính” rằng một số bit nhất định sẽ đại diện cho một số hoặc chữ cái nhất định hoặc thứ gì đó khác.

Bây giờ chúng ta sẽ không nói về các chữ số nhị phân vì ở giai đoạn này không cần thiết phải có nó. Điều chính bạn phải hiểu là nếu bạn muốn sử dụng một số nguyên, thì bạn phải chọn loại số nguyên, nếu có số phân số thì loại thực, nếu là ký tự thì loại char, v.v.

Bây giờ chúng ta chuyển sang nghiên cứu các kiểu dữ liệu. Trong Pascal, một số kiểu có thể được kết hợp thành các nhóm dựa trên những đặc điểm nhất định. Dưới đây tôi sẽ đưa ra một sơ đồ hiển thị rõ ràng tất cả các loại và nhóm.

Ban đầu, bạn có thể sử dụng lược đồ này để chọn loại mong muốn, sau này nó sẽ tự ghi nhớ. Và logic của việc kết hợp các loại thành nhóm cũng sẽ trở nên rõ ràng với bạn.

Các loại thứ tự.

Điểm đặc biệt của loại thứ tự là một biến thuộc bất kỳ loại thứ tự nào có số lượng giá trị có thể hữu hạn và một số biến thuộc bất kỳ loại thứ tự nào có thể được sắp xếp theo thứ tự giảm dần hoặc tăng dần, tức là. tổ chức (do đó có tên). Và thực tế là chỉ có các biến thuộc loại thứ tự mới có thể là tham số của vòng lặp For to do.

Toàn bộ các loại.

Như đã đề cập, một biến kiểu số nguyên chứa một số nguyên. Chúng ta đã nghiên cứu loại số nguyên Byte. Một biến kiểu này có thể chứa một số nguyên từ 0 đến 255. Nó chiếm 1 byte trong bộ nhớ máy tính. Nếu chúng ta cần một số âm hoặc một số lớn hơn 255 thì chúng ta có thể sử dụng kiểu Số nguyên. Biến thuộc loại này có thể chứa các số nguyên từ -32768 đến +32767. Tuy nhiên, biến như vậy sẽ chiếm 2 byte trong bộ nhớ.

Tên

Dịch

những cái tên bằng tiếng Nga

Kích cỡ

chiếm lĩnh

bộ nhớ tính bằng byte

Phạm vi

giá trị

từ

trước

Byte

Byte

ShortInt

Số nguyên ngắn

Từ

Từ

65 535

số nguyên

Trọn

32 768

32 767

LongInt

Số nguyên dài

2 147 483 648

2 147 483 647

Để dễ nhớ, bảng cung cấp bản dịch tên loại. Trong cột phạm vi giá trị, các số đã cho nằm trong phạm vi này. Ví dụ: một biến kiểu Integer có thể chứa số 32.767, nhưng số 32.768 thì không.

Nếu bạn khai báo một biến thuộc bất kỳ loại nào, thì sẽ không có bất kỳ sự khác biệt nào về số được ghi trong đó, 0 hoặc, ví dụ: 199. Trong mọi trường hợp, nó sẽ chiếm cùng một số byte trong bộ nhớ. Do đó, bạn phải chọn kiểu dữ liệu dựa trên giá trị tối đa mà biến có thể nhận trong quá trình thực hiện một chương trình nhất định. Điều này là cần thiết để không chiếm thêm bộ nhớ.

Cũng cần lưu ý rằng các thao tác với số lượng lớn có thể mất nhiều thời gian hơn so với các thao tác nhỏ. Vì vậy, bạn không nên sử dụng, ví dụ như kiểu LongInt nếu bạn biết rằng biến sẽ không chấp nhận các giá trị lớn hơn 32.767.

Tất nhiên, trong một chương trình nhỏ sẽ chạy trên một máy tính hiện đại mạnh mẽ, việc chọn sai loại (kích thước lớn hơn) sẽ không ảnh hưởng đến hoạt động của chương trình này theo bất kỳ cách nào, nhưng trong các chương trình lớn, việc giám sát này có thể ảnh hưởng đến hiệu suất của chương trình. như một tổng thể. Ví dụ: người dùng sẽ đợi kết quả không phải 3 giây mà là 10. Tất nhiên, nếu anh ta đợi nó mỗi ngày một lần, anh ta sẽ không đặc biệt khó chịu, nhưng nếu anh ta phải nhận kết quả suốt cả ngày, thì hãy tưởng tượng anh ta sẽ nhận được bao nhiêu kết quả nữa nếu bạn chọn đúng kiểu dữ liệu. Điều tương tự cũng áp dụng cho các kiểu dữ liệu, sẽ được nghiên cứu sau.

Với các biến kiểu số nguyên, bạn có thể thực hiện bất kỳ phép tính số học nào được thảo luận trong đoạn 3. Tuy nhiên, giá trị của phép toán này không phải lúc nào cũng được gán cho một biến kiểu số nguyên. Ví dụ: nếu chia 10 cho 3, chúng ta sẽ có một số phân số. Vì vậy, hãy cẩn thận khi chọn kiểu dữ liệu.

Thay vì phép chia, hai phép toán sau có thể được thực hiện với số nguyên:

div - phép chia số nguyên. (Chúng ta nhận được giá trị từ phép chia như thể không có phần phân số);

mod – lấy phần dư của phép chia số nguyên.

Tất cả chúng ta đều biết cách thực hiện phép chia dài. Để hiểu rõ hai thao tác này, có thể đưa ra hình sau:

Nếu chúng ta sử dụng ký hiệu như trong toán học thông thường thì:

9 phần 4 = 2;

i,f: Số nguyên ;

bắt đầu

Viết( "Nhập hai số nguyên");

Đọc(i,f);

Writeln(i, "/" ,f, "=" ,i div f, " phần còn lại " ,i mod f);

kết thúc.

____________________________________________________

Nhập hai số nguyên

13/5=2 dư 3

Ngoài ra còn có một chức năng khác để làm việc với các kiểu số nguyên– Lẻ, trả về Đúng nếu số đó là số lẻ và Sai nếu số đó là số chẵn. Ví dụ:

var i: số nguyên ;

bắt đầu

tôi:= 10 ;

Nếu lẻ(i) thì writeln("Số " ,i, " là số lẻ." )

else writeln("Số " ,i, " là số chẵn." );

kết thúc.

___________________________________________________

Số 10 là số chẵn.

Điều cần lưu ý sắc thái sau: nếu một biến thuộc loại số nguyên có giá trị cuối cùng của phạm vi, thì khi biến này tăng thêm một, nó sẽ lấy giá trị đầu tiên của phạm vi. Và ngược lại– nếu là giá trị đầu tiên thì khi giảm đi mộtthứ cuối cùng. Ví dụ: nếu biến A thuộc loại Byte có giá trị 255 thì A+1 sẽ bằng 0. Hoặc nếu tăng thêm hai thì A+2=1. Một ví dụ khác: nếu A=250 thì A+20=14. Một ví dụ khác, nếu A=0 thì A-1=255. Trong những tình huống như vậy, trình biên dịch không tạo ra lỗi. Sẽ không có lỗi khi thực hiện chương trình. Bạn sẽ nhận được giá trị sai. Hoàn cảnh này cũng phải là tiêu chí để chọn loại phù hợp.

Như đã đề cập, bạn có thể sử dụng một biến thuộc bất kỳ loại thứ tự nào trong vòng lặp For to do. Tuy nhiên, có một lưu ý. Nếu bạn chỉ định sau từ cho một số vượt quá các giá trị có thể có của loại biến xuất hiện sau từ For, thì vòng lặp này sẽ không bao giờ được thực thi. Trong trường hợp này, chỉ toán tử gán nằm sau từ For mới được thực thi và bạn sẽ không nhận được bất kỳ thông báo lỗi nào. Ví dụ:

b: byte;

bắt đầu

b:= 2 ;

Viết(b);

Với b:=- 5 đến 5 hãy làm Writeln(b);

Viết(b);

kết thúc.

______________________________

Lưu ý rằng mã vòng lặp không được thực thi và b được đặt thành 251. Điều gì đã xảy ra? Trong vòng lặp For to do, chúng tôi đã cố gắng gán cho biến b một giá trị nằm ngoài phạm vi “làm việc” của loại byte. Máy tính đã làm gì? Dường như anh ta đã hoàn thành biểu thức số học sau: b=0-5. Và những gì được mô tả ở đoạn trước đã xảy ra. Những thứ kia. b trở thành bằng 251, như có thể thấy từ kết quả của chương trình.

Bây giờ đã rõ tại sao mã vòng lặp không được thực thi dù chỉ một lần. Trước khi thực thi mã vòng lặp, giá trị của biến được so sánh với giá trị xuất hiện sau từ to. Trong tình huống này, biến b hóa ra lớn hơn số 5.

Xuất số nguyên dưới dạng bảng.

Xét một bài toán được phát biểu như sau: cần hiển thị một bảng số từ 1 đến 100. Mỗi dòng có 10 số nên có 10 cột.

Để giải quyết vấn đề, chúng ta sẽ lý giải như sau: có thể sử dụng thủ tục write và writeln để xuất ra từng số riêng biệt theo trình tự yêu cầu. Tuy nhiên, chúng ta cần tự động hóa quá trình này để mã chiếm ít dòng nhất có thể. Vì vậy chúng ta cần sử dụng vòng lặp. Trong tình huống này, khi làm việc với số nguyên, vòng lặp For to do là phù hợp nhất.

Hãy thử sử dụng vòng lặp này để in mười số từ 1 đến 10 trên một dòng:

var i: số nguyên ;

bắt đầu

Với i:= 1 đến 10 thì làm

viết(i: 4);

kết thúc.

________________________________________

1 2 3 4 5 6 7 8 9 10

Xin lưu ý rằng 4 ký tự được chỉ định để hiển thị biến i trên màn hình. Làm như vậy để số 100 cuối cùng cách số 99 trước đó một khoảng trắng.

Chúng tôi đã tổ chức xuất tự động 10 số trên một dòng. Bây giờ chúng ta cần nghĩ cách hiển thị tất cả 100 số. Để làm điều này, chúng ta cần chuyển sang một dòng mới sau khi in mười số mới. Hãy thực hiện việc này theo điều kiện sau: nếu số chia hết cho 10 mà không có phần dư thì gọi thủ tục Writeln:

var i: số nguyên ;

bắt đầu

Với i:= 1 đến 100 thì làm

Bắt đầu

viết(i: 4);

if (i mod 10 ) = 0 thì writeln;

kết thúc ;

kết thúc.

_________________________________________

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

31 32 33 34 35 36 37 38 39 40

41 42 43 44 45 46 47 48 49 50

51 52 53 54 55 56 57 58 59 60

61 62 63 64 65 66 67 68 69 70

71 72 73 74 75 76 77 78 79 80

81 82 83 84 85 86 87 88 89 90

91 92 93 94 95 96 97 98 99 100

Tại sao tôi lại đưa ra một ví dụ về chương trình này. Đầu tiên, bạn thường cần hiển thị nhiều danh sách khác nhau dưới dạng bảng và chương trình này là một ví dụ về cách thực hiện việc này. Thứ hai, tôi muốn chỉ ra quá trình phát triển phần mềm diễn ra như thế nào. Đầu tiên, chúng tôi viết chương trình để in một dòng và đảm bảo rằng nó hoạt động chính xác. Sau đó, chúng tôi cải tiến chương trình và nó bắt đầu hiển thị toàn bộ danh sách. Đây chính xác là cách quá trình phát triển phần mềm diễn ra. Lúc đầu, một số hành động cơ bản được thực hiện, sau đó nó trở nên phức tạp hơn và những hành động mới được thêm vào. Và mỗi khi chương trình được kiểm tra chức năng.

Trong phần này, chúng ta đã xem xét các loại dữ liệu là gì. Chúng ta đã tìm hiểu những loại tồn tại trong Pascal. Chúng tôi đã nghiên cứu toàn bộ các loại và học cách tự động hiển thị danh sách trên màn hình.

Nhiệm vụ.

1. Người dùng nhập số nguyên không sử dụng hàm Odd để xác định số đó có phải là số chẵn hay không.

2. Chúng ta có 4 số. Dòng đầu ghi các số chia hết cho 3, dòng thứ hai ghi số chia hết cho 3– chia hết cho ba có số dư. Nếu không có số nào chia hết mà không có số dư hoặc chia hết cho số dư thì hiển thị thông báo tương ứng. Dòng thứ ba, dưới số chia hết cho số dư, in số dư khi chia cho 3.

3. Tạo hàm của riêng bạn để xác định xem một số có chẵn hay không dựa trên phép toán mod, cũng như một chương trình minh họa ví dụ về cách sử dụng hàm này.

4. Chỉ hiển thị các số chẵn từ 1 đến 100 dưới dạng bảng. Bảng nên có 9 cột.

Giải pháp.

var i: số nguyên ;

bắt đầu

viết( "Nhập một số nguyên.");

Đọc(i);

if (i mod 2 )= 0 thì writeln("Số " ,i, " là số chẵn." )

kết thúc.

______________________________________________________

Nhập một số nguyên.

Số 57 là số lẻ.

var i,k,l,m: số nguyên ;

S1,s2: longint ;

bắt đầu

tôi:= 3 ;k:= 45 ;l:= 21 ;m:= 1 ;

Viết( "Chúng tôi có những con số sau:",i, " " ,k, " " ,l, " " ,m);

S1:= 0 ;s2:= 0 ;

nếu (i mod 3 ) = 0 thì s1:=s1+ 1 nếu không s2:=s2+ 1 ;

nếu (k mod 3 ) = 0 thì s1:=s1+ 1 nếu không s2:=s2+ 1 ;

nếu (l mod 3 ) = 0 thì s1:=s1+ 1 nếu không s2:=s2+ 1 ;

nếu (m mod 3 ) = 0 thì s1:=s1+ 1 nếu không s2:=s2+ 1 ;

nếu s1 = 0 thì viết( "Không có số nào chia hết cho 3 mà không có số dư".)

viết khác ( "Chia hết cho 3 không có dư: ");

nếu (i mod 3 ) = 0 thì viết(i, " " );

nếu (k mod 3 ) = 0 thì viết(k, " " );

if (l mod 3 ) = 0 thì write(l, " " );

nếu (m mod 3 ) = 0 thì viết(m, " " );

Viết;

nếu s2 = 0 thì viết( “Không có số nào chia hết cho 3 mà có dư”.)

viết khác ( "Chia hết cho 3 có số dư:");

nếu (tôi mod 3)<>0 thì viết(i: 4 );

nếu (k mod 3)<>0 thì viết(k: 4 );

nếu (l mod 3)<>0 thì viết(l: 4 );

nếu (m mod 3)<>0 thì viết(m: 4 );

Viết;

Write("phần còn lại:" );

nếu (tôi mod 3)<>0 thì viết((i mod 3 ): 4 );

nếu (k mod 3)<>0 thì viết((k mod 3 ): 4 );

nếu (l mod 3)<>0 thì viết((l mod 3 ): 4 );

nếu (m mod 3)<>0 thì viết((m mod 3 ): 4 );

kết thúc.

_________________________________________________________________________

Ta có các số sau: 3 45 21 1

Chia cho 3 không dư: 3 45 21

Chia cho 3 dư: 1

Còn lại: 1

Hàm chetnost(i: số nguyên): boolean ;

bắt đầu

Nếu (i mod 2 )= 0 thì chetnost:= True

else chetnost:= Sai ;

kết thúc ;

Var i: số nguyên ; b:boolean ;

bắt đầu

viết( "Nhập số nguyên");

Đọc(i);

B:=chetnost(i);

nếu b thì writeln("Số " ,i, " là số chẵn." )

else writeln("Số " ,i, " là số lẻ." );

kết thúc.

_____________________________________________

Nhập một số nguyên

Số 3 là số lẻ.

var i: số nguyên ;

Loại thứ tự là những loại tương ứng với dữ liệu hỗ trợ các khái niệm về “giá trị trước” và “giá trị tiếp theo”. Ví dụ: đối với số nguyên 5, chúng ta có thể nói chắc chắn rằng số 4 đứng trước số 4 và số tiếp theo là số 6. Mặt khác, không thể nói số nào đứng ngay trước số thực 5.0.

Object Pascal định nghĩa các kiểu thứ tự sau:

- toàn bộ loại;

- kiểu ký tự;

– Các kiểu Boolean;

- loại hạn chế

Đối với các loại thứ tự, một số hàm được xác định để phản ánh các chi tiết cụ thể của dữ liệu này. Danh sách các chức năng này được đưa ra trong Bảng 6.1.

Bảng 6.1 – Hàm cho kiểu dữ liệu thứ tự

Tiếp theo Bảng 6.1

6.1.1.1 Kiểu dữ liệu số nguyên

Các kiểu dữ liệu số nguyên được sử dụng để biểu diễn số nguyên. Các loại cung cấp hiệu suất tối đa là số nguyênhồng y. Cả hai loại đều chiếm 4 byte trong bộ nhớ và lấy các giá trị trong phạm vi: for Integer -2147483648..2147483647, for Cardina l 0..4294967295. Trong trường hợp cần phạm vi số lớn hơn, bạn có thể sử dụng loại int64.

Cần nhớ rằng các phép tính số học với số nguyên có những đặc điểm riêng. Phép toán dùng để chia là div, thực hiện phép chia số nguyên. Phần còn lại của phép chia số nguyên cho một số nguyên nào đó có thể được tìm thấy bằng phép toán mod.

Đối với dữ liệu số nguyên, bạn cũng có thể sử dụng các phép toán logic, chẳng hạn như và, hoặc, xor. Kết quả sẽ được xác định bằng cách áp dụng phép toán thích hợp cho từng cặp bit tương ứng của biểu diễn số nhị phân. Khi thực hiện các thao tác như vậy, biểu diễn số thập lục phân thường được sử dụng. Ký hiệu của số thập lục phân là ký hiệu $ đứng trước số đó, ví dụ $FF tương ứng với số thập phân 255 và $100 tương ứng với số thập phân 256.

Bạn cũng có thể sử dụng thao tác dịch mã nhị phân của một số sang trái ( shl) hoặc đúng ( shr) với một số chữ số nhất định. Dịch sang phải một vị trí tương ứng với phép chia số nguyên của một số cho 2. Dịch sang trái một vị trí tương ứng với nhân với 2. Ví dụ: là kết quả của việc thực hiện lệnh $FF shr 4, chúng ta nhận được kết quả $0F.

6.1.1.2 Kiểu dữ liệu ký tự

Các kiểu ký tự được thiết kế để đại diện cho các ký tự. Có hai loại ký hiệu bạn có thể sử dụng trong Object Pascal:

– Kiểu Char tương ứng với một bộ gồm 256 ký tự, trong đó các ký tự được sắp xếp theo bảng mã hóa ANSI (American National Standard Code for Information Interchange). Mỗi ký tự thuộc loại này chiếm 1 byte. Sự tương ứng giữa mã và ký tự tương ứng của nó được đưa ra bởi bảng mã hóa ký tự. Nửa đầu của bảng (mã từ 0 đến 127) được sử dụng cho các ký tự điều khiển, số, chữ cái Latinh và các ký hiệu phổ biến nhất, chẳng hạn như dấu chấm câu, ký hiệu phép toán, v.v. Nửa sau của bảng (mã từ 128 đến 255) được sử dụng cho bảng chữ cái quốc gia và các ký tự khác.

– Loại WideChar tương ứng với nhiều ký tự Unicode, trong đó mỗi ký tự chiếm 2 byte, và đương nhiên bảng ký tự này có thể chứa danh sách các ký tự rất lớn. Chúng tương ứng với các mã trong phạm vi từ 0 đến 65535. 256 ký tự đầu tiên trong bộ này tương ứng với các ký tự ANSI có mã tương ứng.

Trong phòng thí nghiệm của chúng tôi, chúng tôi sẽ chỉ sử dụng loại Char. Một đoạn của bảng mã hóa ký tự được trình bày dưới đây trong bảng 6.2.

Bảng 6.2 – Mã hóa một số ký tự ANSI

Biểu tượng Mã số Biểu diễn nhị phân Biểu diễn thập lục phân
Thiếu biểu tượng 0000 0000 $00
Không gian 0010 0000 $20
! 0010 0001 $21
0011 0000 $30
0011 0001 $31
0011 0010 $32
0011 0011 $33
MỘT 0100 0001 $41
B 0100 0010 $42
C 0100 0011 $43
Một 0110 0001 $61
b 0110 0010 $62
MỘT $C0
B $C1
MỘT 1110 0000 $E0
b 1110 0001 $E1
TÔI 1111 1111 $FF

Hãy chú ý đến thứ tự các ký hiệu trong bảng. Thứ tự này cho phép bạn sắp xếp các từ và số nhận dạng theo thứ tự bảng chữ cái bằng mã ký tự.

Các hằng ký tự có thể được viết theo nhiều cách khác nhau. Đối với hầu hết các ký tự, bạn có thể sử dụng hình ảnh của ký tự được đặt trong dấu ngoặc đơn. Ví dụ: '1', 'z', '*'. Thật thuận tiện khi biểu thị các ký tự đặc biệt bằng mã của chúng, dưới dạng số nguyên đứng trước dấu #. Ví dụ: #0, #8, #13. Ngoài ra, bất kỳ ký tự nào cũng có thể được lấy bằng cách sử dụng hàm chr(), hàm này được truyền mã ký tự làm đối số. Ví dụ: chr(65) trả về chữ cái Latinh viết hoa 'A' và chr(255) trả về chữ cái Cyrillic viết thường 'I'.

Việc chuyển đổi nghịch đảo, nghĩa là chuyển đổi một ký tự thành mã, có thể được thực hiện bằng cách sử dụng hàm ord(). Ví dụ: ord('0') sẽ trả về 48.

Khi nhập các ký tự riêng lẻ từ các thành phần của lớp TEdit, bạn phải nhớ rằng thuộc tính văn bản của các thành phần này không trả về một ký tự mà là một chuỗi ký tự. Để lấy một ký tự riêng lẻ của chuỗi này, hãy sử dụng số thứ tự của ký tự trong chuỗi, viết nó trong dấu ngoặc vuông sau tên của chuỗi ký tự. Ví dụ: Edit1.text.

Tất cả các hoạt động so sánh đều có thể áp dụng cho các ký hiệu. Trong trường hợp này, mã ký tự được so sánh. Do đó, 'b' > 'B' và 'a' trong tiếng Cyrillic lớn hơn 'a' trong tiếng Latin.

Các nhóm ký tự tương ứng với chữ cái được sắp xếp sao cho dễ dàng chuyển đổi chữ lớn thành chữ nhỏ và ngược lại. Sự khác biệt trong cách mã hóa các chữ cái lớn và nhỏ và bảng chữ cái Latinh và tiếng Nga là 20 đô la hoặc 32. Do đó, để biến một chữ cái viết thường thành chữ in hoa, chỉ cần trừ 32 khỏi mã của nó là đủ. Số 32 có thể không được nhớ , vì nó có thể thu được bằng cách trừ mã của chữ hoa một chữ cái khỏi mã tương ứng với chữ thường. Ví dụ, mệnh lệnh(z) – mệnh lệnh(Z), hoặc mệnh lệnh(Một) - mệnh lệnh(MỘT).

Một tính năng đặc biệt của mã hóa chữ số là phần nhỏ bậc thấp của ký tự chữ số tương ứng với giá trị số của nó trong biểu diễn nhị phân. Điều này cho phép bạn dễ dàng chuyển đổi mã ký tự của các chữ số thành các số tương ứng bằng cách sử dụng toán tử logic và mặt nạ $0F. Ví dụ, do kết quả của hoạt động mệnh lệnh(‘5’) $0F sẽ cho kết quả là số 5.

Để chuyển các ký hiệu chữ số thành số tương ứng, bạn có thể sử dụng thực tế là các ký hiệu chữ số nối tiếp nhau trong bảng mã hóa theo thứ tự tăng dần giá trị của các chữ số này.

Dưới đây là hai tùy chọn cho việc chuyển đổi như vậy.

Tùy chọn đầu tiên sử dụng sự khác biệt giữa mã số 0 và chữ số được chọn, tương ứng với giá trị số của ký hiệu chữ số

var c:char; n: số nguyên;

n:= ord(c)- 48; // tương đương với ord(c) –ord('0');

Phiên bản thứ hai của phép chuyển đổi này sử dụng thao tác $0F với mặt nạ $0F.

hằng số mặt nạ = $0F; // hằng số bằng số nhị phân 00001111

var c:char; n: số nguyên;

n:= mệnh lệnh(c) mặt nạ; // mặt nạ loại bỏ nibble cao

6.1.1.3 Loại dữ liệu bị hạn chế.

Đối với các loại thứ tự, bạn có thể chỉ định một phạm vi con các giá trị có thể có của chúng - đây sẽ là loại giới hạn.

Phạm vi giá trị của một loại giới hạn được chỉ định bởi biểu thức có dạng:<минимальное значение>..<максимальное значение>.

Ví dụ:

kiểu TPaps = 'A'..'Z';

var bigLetter: TCaps; tháng: 1..12;

Trong các ví dụ này, biến bigLetter chỉ có thể chấp nhận các ký tự Latin viết hoa và biến tháng chỉ có thể chấp nhận các giá trị từ 1 đến 12.

Ví dụ, các loại bị hạn chế được sử dụng khi khai báo mảng.

Trình biên dịch Object Pascal có một tùy chọn để kích hoạt kiểm tra phạm vi khi gán giá trị cho một biến thuộc loại bị hạn chế - ($R+). Nó có thể được bật ở vị trí trong chương trình của bạn, nơi bạn cần bắt đầu kiểm tra phạm vi và tắt ở bất cứ đâu với tùy chọn ($R-). Nếu bạn cố gắng gán một biến thuộc loại giới hạn cho một giá trị nằm ngoài phạm vi con được chỉ định, một ngoại lệ sẽ được đưa ra với thông báo “Lỗi kiểm tra phạm vi”.

Loại khoảng có thể được sử dụng để chỉ định một tập hợp dữ liệu thuộc loại đó bằng cách đặt khoảng trong dấu ngoặc vuông. Ví dụ: rất nhiều chữ cái tiếng Nga có thể được chỉ định theo cách này ["a".."ya"]. Để xác định xem một ký hiệu nào đó có thuộc về một tập hợp được xác định theo cách này hay không, bạn có thể sử dụng thao tác TRONG, trả về ĐÚNG VẬY, nếu ký hiệu thuộc về tập hợp và sai nếu nó không thuộc về. Ví dụ: kết quả đánh giá biểu thức '5' TRONG['0'..'9'], sẽ là ĐÚNG VẬY.

Các kiểu thứ tự bao gồm (xem Hình 4.1) các kiểu số nguyên, logic, ký tự, liệt kê và phạm vi. Hàm ORD(X) có thể áp dụng cho bất kỳ hàm nào trong số chúng, hàm này trả về số thứ tự của giá trị của biểu thức X. Đối với các kiểu số nguyên, hàm ORD(X) trả về giá trị của chính X, tức là. ORD(X) = X cho X thuộc bất kỳ loại shell nào. Áp dụng ORD(X) cho các kiểu boolean, ký tự và kiểu liệt kê sẽ tạo ra một số nguyên dương trong phạm vi 0 đến 1 (boolean), 0 đến 155 (ký tự), 0 đến 65535 (liệt kê). Một loại phạm vi giữ lại tất cả các thuộc tính của loại thứ tự cơ bản, do đó, kết quả của việc áp dụng hàm ORD(X) cho nó phụ thuộc vào các thuộc tính của loại đó.

Bạn cũng có thể áp dụng các hàm cho các loại thứ tự:

PRED (X) - trả về giá trị trước đó của loại thứ tự (giá trị tương ứng với số thứ tự ORD(X) - 1), tức là.

ORD(PRED(X)) = ORD(X) - 1;

SUCC (X) - trả về giá trị thứ tự tiếp theo khớp với số thứ tự ORD(X) +1, tức là

ORD(SUCC(X)) = ORD(X) + 1.

Ví dụ: nếu một chương trình định nghĩa một biến

thì hàm PRED(C) sẽ trả về giá trị "4" và hàm SUCC(C) sẽ trả về giá trị "6".

Nếu chúng ta tưởng tượng bất kỳ loại thứ tự nào là một tập hợp các giá trị có thứ tự, tăng dần từ trái sang phải và chiếm một đoạn nhất định trên trục số, thì hàm PRED(X) không được xác định cho bên trái và SUCC(X) cho bên phải. cuối phân đoạn này.

Toàn bộ các loại. Phạm vi giá trị có thể có của các loại số nguyên phụ thuộc vào biểu diễn bên trong của chúng, có thể là một, hai hoặc bốn byte. Trong bảng 4.1 hiển thị tên của các loại số nguyên, độ dài biểu diễn bên trong của chúng theo byte và phạm vi các giá trị có thể có.

Bảng 4.1

Khi sử dụng các thủ tục và hàm có tham số nguyên, bạn nên được hướng dẫn bằng cách “lồng” các loại, tức là. bất cứ nơi nào WORD có thể được sử dụng, BYTE có thể được sử dụng (nhưng không phải ngược lại), LONGINT “bao gồm” INTEGER, do đó, bao gồm SHORTINT.

Danh sách các thủ tục và hàm áp dụng cho các kiểu số nguyên được đưa ra trong Bảng 4.2. Bức thư b, s, w, tôi, l các biểu thức loại BYTE, SHORTINT, WORD, INTEGER và LONGINT được chỉ định tương ứng, x là biểu thức của bất kỳ loại nào trong số này; bức thư vb, vs, vw, vi, vl, vx biểu thị các biến có kiểu tương ứng. Một tham số tùy chọn được chỉ định trong dấu ngoặc vuông.

Bảng 4.2

Các quy trình và chức năng tiêu chuẩn áp dụng cho toàn bộ các loại
Bắt mắt Loại kết quả Hoạt động
cơ bụng (x) x Trả về mô-đun x
chr(b) Char Trả về một ký tự theo mã của nó
tháng mười hai(vx[, i]) - Giảm giá trị của vx xuống i và khi không có i - xuống 1
inc(vx[, i]) - Tăng giá trị của vx lên i và khi không có i - lên 1
Xin chào (tôi) Byte Trả về byte cao của đối số
Xin chào (w) Như nhau Như nhau
Lo(i) " Trả về byte thấp của đối số
Thấp) " Như nhau
lẻ(l) Boolean Trả về True nếu đối số là số lẻ
Ngẫu nhiên (w) Tương tự như tham số Trả về một số giả ngẫu nhiên được phân bố đồng đều trong phạm vi 0...(w-l)
sgr(x) X Trả về bình phương của đối số
trao đổi (i) số nguyên Hoán đổi byte trong một từ
trao đổi(w) Từ

Khi thao tác với số nguyên, loại kết quả sẽ tương ứng với loại toán hạng và nếu toán hạng có loại số nguyên khác nhau thì loại toán hạng có lũy thừa lớn nhất (phạm vi giá trị tối đa). Khả năng tràn kết quả không được kiểm soát theo bất kỳ cách nào, điều này có thể dẫn đến hiểu lầm, ví dụ:

a:= 32767; (Giá trị INTEGER tối đa có thể)

x:= a + 2; (Tràn trong khi đánh giá biểu thức này !}

y:= LongInt(a)+2; (Không tràn sau khi truyền biến sang loại mạnh hơn)

WriteLn(x:10:0, y:10:0)

Kết quả chạy chương trình chúng tôi nhận được

kiểu Boolean. Giá trị Boolean có thể là một trong các hằng số được khai báo trước FALSE hoặc TRUE. Các quy tắc áp dụng cho họ:

SAI< True;

succ(Sai)= Đúng;

pred(Đúng) = Sai.

Vì kiểu Boolean là kiểu thứ tự nên nó có thể được sử dụng trong toán tử kiểu đếm được, ví dụ:

cho 1:= Sai thành Đúng làm ....

Loại ký tự. Giá trị của loại ký tự là tập hợp tất cả các ký tự PC. Mỗi ký tự được gán một số nguyên trong phạm vi 0...255. Số này đóng vai trò là mã cho cách thể hiện bên trong của ký hiệu; nó được trả về bởi hàm ORD.

Mã ASCII được sử dụng để mã hóa ( Mã tiêu chuẩn Mỹ về trao đổi thông tin- Mã tiêu chuẩn Mỹ về trao đổi thông tin). Đây là mã 7 bit, tức là nó chỉ có thể mã hóa 128 ký tự trong phạm vi từ 0 đến 127. Đồng thời, trong byte 8 bit được phân bổ để lưu trữ một ký tự trong Turbo Pascal, bạn có thể mã hóa gấp đôi số ký tự trong phạm vi từ 0 đến 255. nửa đầu ký tự PC có mã 0...127 tương ứng với chuẩn ASCII (Bảng 4.3). Nửa sau của các ký tự có mã 128...255 không bị giới hạn bởi khuôn khổ cứng nhắc của tiêu chuẩn và có thể thay đổi trên các loại PC khác nhau (Phụ lục 2 trình bày một số tùy chọn mã hóa phổ biến cho các ký tự này).

Bảng 4.3

Mã hóa ký tự theo chuẩn ASCII
Mã số Biểu tượng Mã số Biểu tượng Mã số Biểu tượng Mã số Biểu tượng
KHÔNG B.L. ® "
ZON ! MỘT Một
STX " TRONG b
ETX # VỚI Với
EOT $ D d
ENQ % E e
HỎI & F f
BEL " G g
B.S. ( H h
NT ) TÔI Tôi
LF * J j
VT + k k
FF , L Tôi
CR - M tôi
VÌ THẾ . N N
S.I. / VỀ
DEL P P
DC1 Q q
DC2 R r
DC3 S S
DC4 T t
N.A.K. bạn bạn
SYN V. V.
ETB w w
CÓ THỂ X X
E.M. bạn bạn
PHỤ : z z
THOÁT / [ {
FS < \ tôi
G.S. = ] }
R.S. > ^ ~
CHÚNG TA ? - N

Các ký tự có mã 0...31 ám chỉ mã dịch vụ. Nếu những mã này được sử dụng trong văn bản ký tự của chương trình, chúng được coi là khoảng trắng. Khi được sử dụng trong các thao tác I/O, chúng có thể có ý nghĩa độc lập sau:

Biểu tượng Mã số Nghĩa
BEL Gọi; Việc hiển thị biểu tượng này đi kèm với tín hiệu âm thanh
NT lập bảng theo chiều ngang; khi hiển thị trên màn hình, di chuyển con trỏ đến vị trí là bội số của 8 cộng 1 (9, 17, 25, v.v.)
LF Dịch dòng; khi hiển thị trên màn hình, tất cả các ký tự tiếp theo sẽ được xuất ra bắt đầu từ cùng một vị trí nhưng ở dòng tiếp theo
VT Tab dọc; khi hiển thị lên màn hình nó được thay thế bằng ký tự đặc biệt
FF Chạy trang; khi xuất ra máy in thì tạo thành một trang, khi xuất ra màn hình thì nó được thay thế bằng một ký tự đặc biệt
CR Vận chuyển trở lại; được nhập bằng cách nhấn phím Enter (khi được nhập bằng READ hoặc READLN, nó có nghĩa là lệnh “Enter” và không được đặt trong bộ đệm đầu vào; khi xuất ra, nó có nghĩa là lệnh “Tiếp tục đầu ra từ đầu dòng hiện tại”)
PHỤ Phần cuối của tập tin; nhập từ bàn phím bằng cách nhấn Ctrl-Z; khi xuất ra nó được thay thế bằng một dấu hiệu đặc biệt
SSC Kết thúc công việc; nhập từ bàn phím bằng cách nhấn phím ESC; khi xuất ra nó được thay thế bằng một dấu hiệu đặc biệt

Các phép toán quan hệ, cũng như các hàm dựng sẵn, có thể áp dụng cho loại CHAR: СНR(В) - hàm thuộc loại CHAR; chuyển đổi một biểu thức B thuộc loại BYTE thành một ký tự và trả về giá trị của nó;

UPCASE(CH) - Hàm kiểu CHAR; trả về chữ hoa nếu CH là chữ Latinh viết thường, nếu không thì trả về chính ký tự CH, ví dụ:

cl:= UpCase("s" ;

c2:= UpCase ("Ф" ;

WriteLn(cl," ",c2)

Vì hàm UPCASE không xử lý chữ Cyrillic nên kết quả của việc chạy hàm này

chương trình sẽ được hiển thị trên màn hình

Kiểu liệt kê. Một kiểu liệt kê được chỉ định bằng cách liệt kê các giá trị mà nó có thể nhận được. Mỗi giá trị được đặt tên bởi một số mã định danh và nằm trong danh sách được bao quanh bởi dấu ngoặc đơn, ví dụ:

màu sắc =(đỏ, trắng, xanh);

Việc sử dụng các kiểu liệt kê làm cho chương trình trở nên trực quan hơn. Ví dụ: nếu chương trình sử dụng dữ liệu liên quan đến các tháng trong năm, thì đoạn chương trình sau:

TypeMonth=(Tháng 1,Tháng 2,Tháng 3,Tháng 4,Tháng 5,Tháng 6,Tháng 7,Tháng 8,Tháng 9,Tháng 10,Tháng 11,Tháng 12);

tháng: LoạiTháng;

nếu tháng = tháng 8 thì WriteLn("Thật tuyệt khi được đi biển!");

Bạn thấy đấy, nó sẽ rất rõ ràng. Than ôi! Trong Turbo Pascal bạn không thể sử dụng Cyrillic trong mã định danh, vì vậy chúng tôi buộc phải viết như thế này:

TypeMonth=(tháng một, tháng hai, tháng ba, tháng năm, tháng sáu, tháng bảy, tháng tám, tháng chín, tháng mười, tháng mười một, tháng mười hai);

tháng: LoạiTháng;

nếu tháng = tháng 8 thì WriteLn("Thật tuyệt khi được đi biển!");

Sự tương ứng giữa các giá trị của một kiểu liệt kê và số thứ tự của các giá trị này được thiết lập theo thứ tự liệt kê: giá trị đầu tiên trong danh sách nhận số thứ tự 0, giá trị thứ hai - 1, v.v. Dung lượng tối đa của một kiểu liệt kê là 65536 giá trị, do đó trên thực tế, một kiểu liệt kê xác định một tập con nhất định của toàn bộ kiểu WORD và có thể được coi là một khai báo thu gọn của một nhóm các hằng số nguyên có giá trị 0, 1, v.v.

Việc sử dụng các kiểu liệt kê làm tăng độ tin cậy của chương trình bằng cách cho phép bạn kiểm soát các giá trị mà các biến tương ứng nhận được. Ví dụ: cho các kiểu liệt kê sau:

màu sắc = (đen, đỏ, trắng);

ordenal= (một, hai, ba);

ngày = (thứ hai, thứ ba, thứ tư);

Xét về quyền lực và đại diện nội bộ thì cả 3 loại đều tương đương nhau:

ord(đen)=0, ..., ord(trắng)=2,

thứ tự(một)=0, ...thứ tự(ba)=2,

ord(thứ hai)=0, ...ord(thứ tư)=2.

Tuy nhiên, nếu các biến được xác định

col:màu sắc; num:ordenal;

sau đó các nhà khai thác được phép

num:= succ(hai);

ngày:= trước(thứ ba);

nhưng không thể chấp nhận được

Như đã đề cập, có sự tương ứng một-một giữa các giá trị của kiểu liệt kê và tập hợp các số nguyên, được chỉ định bởi hàm ORD(X). Turbo Pascal cũng cho phép chuyển đổi ngược: bất kỳ biểu thức nào thuộc loại WORD đều có thể được chuyển đổi thành giá trị của loại enum, miễn là giá trị của biểu thức số nguyên không vượt quá power1™ của loại liệt kê. Việc chuyển đổi này đạt được bằng cách sử dụng hàm được khai báo tự động với tên của kiểu liệt kê (xem phần 4.4). Ví dụ, đối với việc khai báo kiểu đã thảo luận ở trên, các phép gán sau là tương đương:

col:= màu sắc(0);

Tất nhiên, nhiệm vụ

sẽ không thể chấp nhận được.

Các biến thuộc bất kỳ kiểu liệt kê nào cũng có thể được khai báo mà không cần khai báo kiểu đó trước, ví dụ:

col: (đen, trắng, xanh);

Phạm vi loại. Loại phạm vi là tập hợp con của loại cơ sở, có thể là bất kỳ loại thứ tự nào ngoại trừ loại phạm vi. Một loại phạm vi được xác định bởi ranh giới của các giá trị của nó trong loại cơ sở:

<мин.знач.>..<макс.знач.>

Đây<мин.знач. >- giá trị tối thiểu của phạm vi loại;

<макс.знач.>- giá trị lớn nhất của nó.

Ví dụ:

chữ số = "0".."9";

Loại phạm vi không nhất thiết phải được mô tả trong phần TYPE, nhưng có thể được chỉ định trực tiếp khi khai báo một biến, ví dụ:

Ichr: "A".."Z";.

Khi xác định loại phạm vi, bạn phải tuân theo các quy tắc sau:

  • hai ký tự ".." được coi là một ký tự, do đó không được phép có khoảng trắng giữa chúng;
  • đường viền bên trái của phạm vi không được vượt quá đường viền bên phải của nó. Loại phạm vi kế thừa tất cả các thuộc tính của loại cơ sở nhưng có hạn chế về mức lũy thừa thấp hơn. Đặc biệt, nếu một biến được xác định

ngày = (mo,tu,we,th,fr,sa,su);

WeekEnd = sa .. su;

thì ORD(W) sẽ trả về giá trị 5 trong khi PRED(W) sẽ gây ra lỗi.

Thư viện chuẩn Turbo Pascal bao gồm hai hàm hỗ trợ làm việc với các loại phạm vi:

CAO(X) - trả về giá trị tối đa của loại phạm vi mà biến X thuộc về;

THẤP(X) - trả về giá trị tối thiểu của loại phạm vi.

Chương trình ngắn sau đây sẽ in dòng

WriteLn(Thấp(k),"..",Cao(k))

Tập hợp các số nguyên là vô hạn, nhưng chúng ta luôn có thể chọn số bit để biểu thị bất kỳ số nguyên nào phát sinh khi giải một bài toán cụ thể. Tập hợp số thực không chỉ là vô hạn mà còn liên tục nên dù lấy bao nhiêu bit đi chăng nữa, chúng ta chắc chắn sẽ gặp phải những số không có cách biểu diễn chính xác. Số dấu phẩy động là một cách khả thi để biểu diễn số thực, đó là sự cân bằng giữa độ chính xác và phạm vi giá trị được chấp nhận.

Một số dấu phẩy động bao gồm một tập hợp các chữ số riêng lẻ, được chia theo quy ước thành dấu, số mũ và phần định trị. Số mũ và phần định trị là các số nguyên, cùng với dấu, đưa ra biểu diễn sau của số dấu phẩy động:

Về mặt toán học nó được viết như thế này:

(-1) s × M × B E, trong đó s là dấu, B là cơ số, E là số mũ và M là phần định trị.

Cơ số xác định hệ thống chữ số. Về mặt toán học, người ta đã chứng minh rằng các số dấu phẩy động có cơ số B=2 (biểu diễn nhị phân) có khả năng chống lại các lỗi làm tròn tốt nhất, do đó trong thực tế chỉ gặp cơ số 2 và ít phổ biến hơn là cơ số 10. Để trình bày thêm, chúng ta sẽ luôn giả sử B= 2 và công thức tính số có dấu phẩy động sẽ như sau:

(-1) s × M × 2 E

Mantissa và trật tự là gì? thần chú là một số nguyên có độ dài cố định biểu thị các bit quan trọng nhất của một số thực. Giả sử phần định trị của chúng ta bao gồm ba bit (|M|=3). Lấy ví dụ: số "5", số này trong hệ nhị phân sẽ bằng 101 2. Bit có trọng số cao nhất tương ứng với 2 2 =4, bit ở giữa (bằng 0) là 2 1 =2, và bit có trọng số thấp nhất là 2 0 =1. Đặt hàng– đây là lũy thừa cơ số (hai) của chữ số cao nhất. Trong trường hợp của chúng tôi E=2. Thật thuận tiện khi viết những con số như vậy ở dạng tiêu chuẩn được gọi là “khoa học”, ví dụ “1,01e+2”. Rõ ràng ngay rằng lớp phủ bao gồm ba dấu hiệu, và thứ tự là hai.

Giả sử chúng ta muốn lấy một số phân số bằng cách sử dụng cùng 3 bit của phần định trị. Chúng ta có thể làm được điều này nếu lấy E=1. Khi đó số của chúng ta sẽ bằng nhau

1,01e+1 = 1×2 1 +0×2 0 +1×2 -1 =2+0,5=2,5

Rõ ràng, theo cách này, cùng một số có thể được biểu diễn theo những cách khác nhau. Hãy xem xét một ví dụ với độ dài của lớp phủ |M|=4. Số “2” có thể được biểu diễn như sau:

2 = 10 (ở dạng nhị phân) = 1,000e+1 = 0,100e+2 = 0,010e+3.

Do đó, ngay từ những chiếc máy đầu tiên, các con số đã được biểu diễn dưới dạng cái gọi là dạng chuẩn hóa, khi bit đầu tiên của phần định trị luôn được coi là bằng một.

Điều này tiết kiệm một bit (vì bit ẩn không cần được lưu trong bộ nhớ) và đảm bảo rằng số được biểu diễn duy nhất. Trong ví dụ của chúng tôi, “2” có một biểu diễn duy nhất (“1.000e+1”) và phần định trị được lưu trong bộ nhớ dưới dạng “000”, bởi vì đơn vị dẫn đầu được ngầm hiểu. Nhưng một vấn đề mới nảy sinh trong cách biểu diễn chuẩn hóa các số - không thể biểu diễn số 0 ở dạng này.

  • Phân tích dữ liệu bằng cách sử dụng lệnh Lựa chọn tham số và Tìm kiếm giải pháp
  • Phân tích và giải thích dữ liệu nghiên cứu tâm lý thực nghiệm.
  • Phân tích dữ liệu nguồn. Tiêu chuẩn kỹ thuật đường đô thị.
  • PHÂN TÍCH DỮ LIỆU THU ĐƯỢC. QUYẾT ĐỊNH VỀ ĐẶC ĐIỂM CẤP NƯỚC ĐẦY HAY KHÔNG ĐỦ CHO NHU CẦU CỦA HỆ THỐNG Tưới tiêu.
  • Thiết bị đường truyền thông: thiết bị truyền dữ liệu, thiết bị đầu cuối, thiết bị trung gian.