Các kiểu dữ liệu số nguyên trong Pascal Pascal. Các kiểu dữ liệu đơn giản

Cơ bản về lập trình
Mỗi người chuyên nghiệp đều từng là một ấm trà. Chắc hẳn bạn đã quen với tình trạng “bạn không biết phải bắt đầu suy nghĩ như thế nào để nghĩ ra được một điều như vậy”. Có lẽ bạn đã gặp phải một tình huống mà bạn không biết bắt đầu từ đâu. Cuốn sách này nhắm chính xác đến những người muốn trở thành lập trình viên, nhưng hoàn toàn không biết làm thế nào để bắt đầu con đường này. ...

Hầu hết tất cả các kiểu dữ liệu số nguyên là . Các kiểu dữ liệu này đại diện cho các số nguyên trong một phạm vi nhất định. Tên cụ thể của các loại số nguyên và phạm vi giá trị phụ thuộc vào ngôn ngữ lập trình cụ thể, trình biên dịch và chế độ biên dịch. Bạn có thể tìm hiểu thêm về điều này trong tài liệu biên dịch.

Ví dụ, kiểu dữ liệu số nguyênở Delphi nó có phạm vi -2147483648…2147483647, trong khi ở Turbo Pascal kiểu dữ liệu số nguyênđại diện cho các số trong phạm vi -35768…32767. Trong Free Pascal, phạm vi giá trị thuộc loại số nguyênđược xác định bởi chế độ đã chọn.

Vì Lazarus sử dụng trình biên dịch Free Pascal nên mọi điều nói về các kiểu dữ liệu liên quan đến Free Pascal cũng đúng với Lazarus.

Vì vậy, các kiểu dữ liệu số nguyên của Free Pascal được liệt kê trong Bảng 13.1.

Bảng 13.1. Các kiểu dữ liệu số nguyên Pascal miễn phí (Lazarus).

Kiểu Kích thước, byte Phạm vi giá trị
Byte 1 0…255
rút gọn 1 -128…127
bạc hà 2 -35768…32767
Từ 2 0…65535
số nguyên 2 hoặc 4 Phụ thuộc vào chế độ biên dịch
hồng y 4 0…4294967295
Longint 4 -2147483648…2147483647
Từ dài 4 0...4294967295
Int64 8 -9223372036854775808...9223372036854775807
QWord 8 0...18446744073709551615

GHI CHÚ
Các loại trong Pascal miễn phí Int64QWord không! Điều này có nghĩa là bạn không thể sử dụng chúng, chẳng hạn như cho các biến chỉ mục trong vòng lặp. Tuy nhiên, tôi trình bày chúng ở đây để không mô tả chúng một cách riêng biệt trong tương lai và để thu thập tất cả các loại số nguyên Pascal miễn phí vào một nơi. Nếu bạn không hiểu một số từ, đừng lo lắng. Vào thời điểm thích hợp tôi sẽ kể cho bạn nghe về mọi thứ chi tiết hơn.

Và bây giờ là một vài giải thích về cái bàn.

Trong một cột KIỂU các mã định danh kiểu dữ liệu được cung cấp (các từ khóa cho trình biên dịch biết loại dữ liệu cụ thể thuộc về loại nào). Bạn sẽ học cách sử dụng các mã nhận dạng này trong các bài học sau.

Trong một cột KÍCH CỠ cho biết kích thước mà kiểu dữ liệu chiếm trong bộ nhớ máy tính. Ví dụ: một số nguyên dương có thể được biểu diễn bằng nhiều loại khác nhau: Byte, Từ, hồng y v.v. Tuy nhiên, một con số như hồng y sẽ chiếm 4 byte trong bộ nhớ, trong khi một số như Byte– chỉ có 1 byte. Do đó, nếu bạn biết chắc chắn rằng số bạn đang làm việc sẽ không bao giờ có giá trị lớn hơn 255 thì tốt hơn nên xác định nó là một loại Byte, vì điều này sẽ tiết kiệm dung lượng trong bộ nhớ máy tính của bạn. Mặc dù ở đây không phải mọi thứ đều đơn giản như vậy (các sắc thái phân bổ bộ nhớ và các tài nguyên máy tính khác nằm ngoài phạm vi).

Trong một cột PHẠM VI chỉ định phạm vi giá trị mà kiểu dữ liệu hoạt động. Ví dụ như một số như Byte có thể lấy giá trị từ 0 đến 255.

Bây giờ để thực hành. Hãy viết một chương trình hiển thị phạm vi giá trị của tất cả các kiểu dữ liệu số nguyên. Mã nguồn của chương trình này được đưa ra dưới đây:

Liệt kê 13.1. Một chương trình hiển thị phạm vi số nguyên. chương trình td; ($mode objfpc)($H+) sử dụng các cthread ($IFDEF UNIX)($IFDEF UseCThreads), các lớp ($ENDIF)($ENDIF) (bạn có thể thêm các đơn vị sau này); bắt đầu Writeln("Byte: ", Thấp(Byte), "..", High(Byte)); Writeln("Shortint: ", Low(Shortint), "..", High(Shortint)); Writeln("Nhỏ: ", Thấp(Nhỏ), "..", Cao(Nhỏ)); Writeln("Từ: ", Thấp(Từ), "..", Cao(Word)); Writeln("Số nguyên: ", Thấp(Số nguyên), "..", Cao(Số nguyên)); Writeln("Hồng y: ", Thấp(Hồng y), "..", Cao(Hồng y)); Writeln("Longint: ", Thấp(Longint), "..", High(Longint)); Writeln("Từ dài: ", Thấp(Từ dài), "..", Cao(Từ dài)); Writeln("Int64: ", Low(Int64), "..", High(Int64)); Writeln("QWord: ", Thấp(QWord), "..", Cao(QWord)); Đọc; kết thúc.

Chức năng tiêu chuẩn Thấp xác định giá trị tối thiểu của kiểu dữ liệu. Funtski Cao xác định giá trị tối đa. Với chức năng ViếtLnĐọcLn các bạn đã biết nhau một chút rồi. Chúng ta sẽ nói chi tiết hơn về các chương trình con (thủ tục và chức năng) trong phần tương ứng.

Cuối cùng, tôi sẽ cho bạn biết dữ liệu số nguyên được ghi trong chương trình như thế nào. Có, giống như mọi nơi khác - chỉ viết số, không có dấu ngoặc kép hoặc bất kỳ ký hiệu bổ sung nào. Ví dụ như thế này

10
178
35278

Đúng, điều này áp dụng cho các số trong hệ thống số thập phân. Chắc chắn bạn đã biết rằng có những hệ thống khác. Các hệ thống số được sử dụng rộng rãi nhất là nhị phân, thập phân và thập lục phân.

Pascal miễn phí hỗ trợ bốn định dạng số nguyên:

  1. Ký hiệu thập phân. Chỉ là một con số, như 10.
  2. Ký hiệu thập lục phân. Một số có tiền tố $. Ví dụ: số thập lục phân $10 bằng số thập phân 16.
  3. ký hiệu bát phân. Một số có tiền tố &. Ví dụ: bát phân &10 bằng số thập phân 8.
  4. ký hiệu nhị phân. Một số có tiền tố là %. Ví dụ: số nhị phân %10 bằng số thập phân 2.

Bài tập về nhà:

Tạo một chương trình hiển thị các phạm vi giá trị nguyên (Liệt kê 13.1). Biên dịch chương trình và chạy nó. Đảm bảo rằng các giá trị này tương ứng với các giá trị được hiển thị trong Bảng 13.1.

Trong mã nguồn của chương trình, tìm dòng đặt chế độ biên dịch:

($chế độ objfpc)($H+)

Trong dòng này, thay vì từ đối tượng viết từ tp. Nghĩa là, dòng cuối cùng sẽ trông như thế này:

($chế độ tp)($H+)

Khởi động chương trình. Nhìn vào phạm vi giá trị loại số nguyên. Đi đến kết luận.

Học cách suy nghĩ như một lập trình viên, nghĩa là một cách logic. Không ai sẽ nhai lại mọi thứ cho bạn cho đến khi nghỉ hưu, như tôi bây giờ. Bạn phải làm quen với việc suy nghĩ cho chính mình. Nếu không, bạn sẽ rơi vào “nguyên tắc học khỉ” và khi đó cơ hội trở thành một lập trình viên giỏi của bạn sẽ gần như bằng không. Để giúp các bạn không rơi vào tình trạng “nhồi nhét”, tôi sẽ định kỳ để lại những khoảng trống trong quá trình học tập của các bạn để các bạn cố gắng tự mình tìm ra một số điều.

Sẽ tốt hơn nhiều nếu bạn tự mình tìm ra nó quyết định sai lầm, bạn sẽ tự mình tìm ra lỗi và tự sửa chứ không phải lúc nào cũng dùng cách giải đúng của người khác rồi sao chép một cách ngu ngốc.

Các kiểu dữ liệu Pascal

Bất kỳ dữ liệu nào (hằng, biến, giá trị hàm hoặc biểu thức) trong Turbo Pascal đều được đặc trưng bởi loại 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ó. Loại này cũng xác định định dạng biểu diễn dữ liệu bên trong trong bộ nhớ của máy tính.

Có các kiểu dữ liệu sau trong Turbo Pascal.

1) Các loại đơn giản:

- thực tế;

- mang tính biểu tượng;

– Boolean (logic);

- liệt kê;

- Phạm vi bị giới hạn).

2) Các loại tổng hợp (có cấu trúc):

– thông thường (mảng);

– kết hợp (hồ sơ);

- tài liệu;

- nhiều;

- sợi dây;

- các đối tượng.

3) Các kiểu tham chiếu (con trỏ được gõ và không được gõ).

4) Các loại thủ tục.

Turbo Pascal cung cấp cơ chế tạo các kiểu dữ liệu mới, nhờ đó tổng số kiểu được sử dụng trong chương trình có thể lớn như mong muốn.

Kiểu số nguyên. Giá trị số nguyên là các phần tử của tập hợp con các số nguyên. Có năm loại số nguyên trong Turbo Pascal. Tên, phạm vi giá trị, độ dài biểu diễn tính bằng byte của chúng được đưa ra trong bảng. 6.

Bảng 6

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

Các biến số nguyên được mô tả bằng các từ dành riêng ở trên:

i, j, k: số nguyên;

Dữ liệu số nguyên được lưu trữ chính xác trong bộ nhớ. Ví dụ: các biến kiểu số nguyên chiếm 2 byte (16 bit) trong bộ nhớ, được phân bổ như sau: 1 bit được phân bổ để lưu trữ dấu của số (0 nếu số dương và 1 nếu số âm) và 15 bit để lưu số ở dạng nhị phân. Số thập phân tối đa có thể được viết dưới dạng nhị phân 15 bit là 32767.

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ứ khi nào từ được sử dụng, byte được cho phép (nhưng không phải ngược lại), longint “bao gồm” một số nguyên, do đó, bao gồm cả shortint.

Đối với kiểu số nguyên, năm phép toán cơ bản được xác định, kết quả của các phép tính này cũng là số nguyên: +, -, *, div, mod (cộng, trừ, nhân, chia số nguyên và phần dư của phép chia số nguyên). Trong biểu thức số học, các phép toán *, div, mod có mức độ ưu tiên cao hơn các phép toán +, -. Ví dụ về cách viết biểu thức:

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. 7. Các chữ cái b, s, w, i, l lần lượt biểu thị các biểu thức kiểu byte, shortint, word, integer, longint; x là biểu thức của bất kỳ loại nào trong số này; các định danh 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 7

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 (tôi) Byte Như nhau
Lô(i) Byte Trả về byte thấp của đối số
Thấp) Byte Như nhau
Lẻ(l) Byte 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-1)
Sqr(x) x Trả về bình phương của đối số
Hoán đổi(i) số nguyên
Hoán đổi (w) Từ Hoán đổi byte trong một từ
Thành công(x) Tương tự như tham số Trả về giá trị số nguyên tiếp theo, tức là x+1
Dự đoán(x) Tương tự như tham số Trả về giá trị số nguyên trước đó, tức là x-1

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ó các loại số nguyên khác nhau thì loại toán hạng có phạm vi giá trị tối đa. Khả năng tràn kết quả không được kiểm soát, điều này có thể dẫn đến lỗi trong chương trình.

Loại thực sự. Giá trị của kiểu thực xác định một số tùy ý với độ 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. Có năm loại thực trong Turbo Pascal (Bảng 8).

Bảng 8

Các kiểu dữ liệu thực

Các biến thực được mô tả bằng các từ dành riêng ở trên:

Một số thực trong bộ nhớ máy tính gồm 3 phần:

Ký hiệu chữ số của một số;

Phần mũ;

Mantissa của số.

Phần định trị có độ dài từ 23 (Đơn) đến 63 (Mở rộng) chữ số nhị phân, cung cấp độ chính xác 7-8 cho Chữ số đơn và 19-20 cho chữ số thập phân mở rộng. Dấu thập phân (dấu phẩy) được ngụ ý trước chữ số bên trái (có ý nghĩa nhất) của phần định trị, nhưng khi thao tác trên một số, vị trí của nó bị dịch sang trái hoặc sang phải theo thứ tự nhị phân của số được lưu trong phần mũ , do đó các phép toán trên số thực được gọi là số học dấu phẩy động (dấu phẩy).

Các loại Đơn, Đôi và Mở rộng chỉ được truy cập trong các chế độ biên dịch đặc biệt. Để kích hoạt các chế độ này, hãy chọn mục menu Tùy chọn, Trình biên dịch… và kích hoạt tùy chọn 8087/80287 trong nhóm Xử lý số.

Một vị trí đặc biệt trong Turbo Pascal bị chiếm bởi loại Comp, được coi là số thực không có phần mũ và phần phân số. Trên thực tế, Comp là một số nguyên có dấu lớn lưu trữ 19...20 chữ số thập phân có nghĩa. Đồng thời, trong các biểu thức, Comp hoàn toàn tương thích với bất kỳ loại thực nào khác: tất cả các phép toán thực được xác định trên nó, nó có thể được sử dụng làm đối số cho các phép toán, v.v.



Số thực được quy định trong hệ thống số thập phân ở một trong hai hình thức.

TRONG dạng điểm cố định bản ghi bao gồm một số nguyên và một phần phân số, cách nhau bằng dấu chấm, ví dụ:

0.087 4.0 23.5 0.6

TRONG dạng dấu phẩy động mục nhập chứa chữ E, có nghĩa là "nhân lũy thừa với mười" và lũy thừa là một số nguyên, ví dụ:

7E3 6.9E-8 0.98E-02 45E+04

Các thao tác sau được xác định trên các đối tượng kiểu thực: +, -, *, /.

Các thao tác "*" và "/" có mức độ ưu tiên cao hơn các thao tác "+" và "-".

Nếu có ít nhất một toán hạng là số thực thì các phép toán +, -, *, / sẽ dẫn đến kết quả thực. Phép chia / dẫn đến kết quả thực ngay cả trong trường hợp hai toán hạng số nguyên, ví dụ: 9/3 = 3,0.

Để làm việc với dữ liệu thực, có thể sử dụng các hàm toán học tiêu chuẩn được trình bày trong bảng. 9. Kết quả của các chức năng này cũng là có thật.

Bảng 9

Các hàm toán học làm việc với dữ liệu thực

Các biến và hằng kiểu REAL bị cấm sử dụng:

– trong các hàm pred(x), succ(x), ord(x);

– dưới dạng chỉ mục mảng;

– như các nhãn trong báo cáo chuyển giao điều khiển;

– dưới dạng các biến điều khiển (tham số chu trình).

Để chuyển đổi một số thực thành một số nguyên, bạn có thể sử dụng các hàm sau:

trunc(x) – phần nguyên của x (x – real);

round(x) – làm tròn đến số nguyên gần nhất (x là số thực).

Loại ký tự. Các biến ký tự được mô tả bằng từ char dành riêng:

Các giá trị thuộc loại này được chọn từ bộ ký tự có thứ tự (bộ ASCII) gồm 256 ký tự. Mỗi ký tự được gán một số nguyên trong phạm vi 0..255. Ví dụ: chữ in hoa của bảng chữ cái Latinh A..Z có mã 65..90 và chữ thường có mã 97..122.

Giá trị của biến kiểu ký tự là một ký tự đơn được bao quanh bởi dấu nháy đơn, ví dụ:

'F' '8' '*'

Các biến ký tự có thể được so sánh với nhau và mã ký tự được so sánh.

Có các hàm thiết lập sự tương ứng giữa ký hiệu và mã của nó:

ord(c) – cho biết số của ký hiệu c;

chr(i) – trả về số ký tự i.

Các hàm này nghịch đảo với nhau.

kiểu Boolean. Các biến Boolean được mô tả bằng từ boolean dành riêng:

p1, p2: boolean;

Các biến kiểu Boolean nhận hai giá trị: ĐÚNG VẬY(ĐÚNG VẬY), SAI(nói dối).

Các giá trị này được sắp xếp như sau: false< true. false имеет порядковый номер 0, true имеет порядковый номер 1.

Các biến Boolean có thể được gán giá trị trực tiếp hoặc sử dụng biểu thức Boolean. Ví dụ,

a, d, g, b: boolean;

Các phép toán quan hệ (<, <=, >, >=, =, <>), được áp dụng cho các biến số nguyên, số thực và ký hiệu, tạo ra kết quả logic.

Các phép toán logic trên toán hạng thuộc loại logic cũng tạo ra kết quả logic (các phép toán được liệt kê theo thứ tự ưu tiên giảm dần) (để biết thêm chi tiết, xem Bảng 3 và 5):

không – phủ định (hoạt động NO);

và – phép nhân logic (phép toán AND);

hoặc – phép cộng logic (phép toán OR);

xor – HOẶC độc quyền.

Biểu thức (không phải a) có nghĩa ngược lại với a.

Biểu thức (a và b) đánh giá là đúng nếu chỉ cả a và b đều đúng; nếu không thì giá trị của biểu thức này là sai.

Biểu thức (a hoặc b) đánh giá là sai nếu chỉ cả a và b đều đánh giá là sai; nếu không thì kết quả là đúng.

Kiểu liệt kê. Kiểu liệt kê không chuẩn được chỉ định bằng một phép liệt kê dưới dạng tên các giá trị mà một biến có thể lấy. 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. Dạng chung của mô tả kiểu liệt kê:

x = (w1, w2, …, wn);

trong đó x là tên kiểu, w1, w2,..., wn là các giá trị mà một biến kiểu x có thể nhận.

Các giá trị này được sắp xếp w1

Các hàm tiêu chuẩn sau đây áp dụng cho đối số w của kiểu liệt kê:

succ(w), pred(w), ord(w).

color=(đỏ, đen, vàng, xanh lá cây)

ww=(trái, lên, phải, xuống);

f: mảng ww;

succ(d) = màu vàng;

Các biến a và b thuộc loại w. họ có thể nhận một trong ba giá trị, với bật

Các phép toán quan hệ được áp dụng cho các giá trị thuộc kiểu liệt kê: =,<>, <=, >=, <, >.

Nó được phép chỉ định các hằng số kiểu liệt kê trực tiếp trong phần var không sử dụng phân vùng kiểu, Ví dụ

c,d: (đỏ, đen, vàng, xanh);

Loại phạm vi (có giới hạn). Khi xác định một loại giới hạn, bạn chỉ định các giá trị ban đầu và cuối cùng mà biến loại phạm vi có thể nhận. Các giá trị cách nhau bằng hai dấu chấm.

Việc khai báo một loại hạn chế có dạng

Ở đây a là tên của loại, min, max là các hằng số.

Khi chỉ định loại hạn chế, phải tuân theo các quy tắc sau:

– cả hai hằng số biên min và max phải cùng loại;

– một kiểu giới hạn được tạo từ dữ liệu của kiểu cơ sở, có thể là số nguyên, ký tự hoặc kiểu liệt kê. Ví dụ:

col = đỏ.. vàng;

chữ = ‘a’..’f’;

– Các biến thuộc kiểu giới hạn có thể được khai báo trong phần var mà không cần tham khảo phần type:

– loại bị hạn chế kế thừa tất cả các thuộc tính của loại cơ sở mà nó được tạo ra;

– giới hạn tối thiểu phải luôn nhỏ hơn giới hạn tối đa.

Mảng. Mảng là một kiểu phức tạp, là một cấu trúc bao gồm một số thành phần cố định cùng kiểu. Loại thành phần được gọi là loại cơ sở. Tất cả các thành phần của mảng có thể được đặt hàng dễ dàng và có thể truy cập vào bất kỳ thành phần nào trong số chúng bằng cách chỉ ra số sê-ri của nó. Mô tả mảng trong phần var có dạng:

Một: mảng của t2;

trong đó a là tên của mảng, mảng, của– từ dịch vụ (có nghĩa là “mảng của ...”), t1 – loại chỉ mục; t2 – loại thành phần (loại cơ sở).

Số lượng chỉ mục xác định kích thước của mảng. Các chỉ mục có thể là số nguyên (trừ longint), ký tự, logic, kiểu liệt kê và phạm vi. Các chỉ số được phân cách bằng dấu phẩy và được đặt trong dấu ngoặc vuông. Các thành phần mảng có thể thuộc bất kỳ loại nào ngoại trừ tệp.

Ví dụ 1. Hãy xem xét một mảng một chiều C, các giá trị của nó là năm số thực:

4.6 6.23 12 -4.8 0.7

Mô tả của mảng này như sau:

c: mảng thực;

Bằng một giá trị chỉ mục cụ thể, bạn có thể chọn một thành phần mảng cụ thể (ví dụ: C có nghĩa là phần tử thứ ba của mảng C, tức là số 12).

Ví dụ 2. Hãy xem xét một mảng hai chiều B (ma trận B), giá trị của nó là một bảng các số nguyên:

Mô tả của mảng này như sau:

b số nguyên;

Ở đây b là tên mảng, chỉ số đầu tiên là số hàng và lấy giá trị từ 1 đến 2, chỉ số thứ hai là số cột và lấy giá trị từ 1 đến 4. Dựa trên các giá trị chỉ mục cụ thể, bạn có thể chọn một thành phần mảng cụ thể (ví dụ: b có nghĩa là thành phần bảng nằm ở hàng đầu tiên và cột thứ ba, tức là số -4).

Các chỉ mục có thể là các biểu thức tùy ý tương ứng với loại chỉ mục từ mô tả mảng:

a: mảng thực;

a[(i+1)*2] := 24;

Tập hợp các thao tác trên các phần tử mảng hoàn toàn được xác định bởi kiểu của các phần tử này.

Kiểu chuỗi. Kiểu chuỗi là tập hợp các chuỗi ký tự có độ dài tùy ý (từ 0 đến một số nhất định). Các biến kiểu chuỗi được mô tả bằng từ hàm sợi dây:

b: sợi dây ;

Đặc điểm:

– giá trị của biến chuỗi có thể được nhập bằng bàn phím, được gán trong toán tử gán hoặc đọc từ tệp. Trong trường hợp này, độ dài của chuỗi đã nhập có thể là bất kỳ (nhỏ hơn kích thước đã chỉ định, bằng kích thước hoặc lớn hơn, trong trường hợp sau, các ký tự thừa sẽ bị loại bỏ); a:= ‘Kết quả’;

– được phép sử dụng thao tác nối trong toán tử gán, vì các chuỗi có thể thay đổi độ dài của chúng một cách linh hoạt: a:= a + 'phép tính';

– độ dài tối đa của biến chuỗi là 255 ký tự, có thể bỏ qua chỉ báo độ dài này:

Một: sợi dây;

a1: sợi dây ;

Các biến a và a1 giống nhau (mô tả tương đương).

– bộ nhớ dành cho các biến kiểu chuỗi được phân bổ ở mức tối đa, nhưng chỉ sử dụng phần bộ nhớ thực sự bị chiếm giữ bởi các ký tự chuỗi tại thời điểm này. Để mô tả một biến chuỗi có độ dài n, n+1 byte bộ nhớ được sử dụng: n byte để lưu trữ các ký tự chuỗi, n+1 byte để lưu trữ độ dài hiện tại.

– Các phép toán so sánh được xác định trên giá trị của kiểu chuỗi:< <= > >= = <>. Chuỗi ngắn luôn nhỏ hơn chuỗi dài. Nếu các chuỗi có cùng độ dài thì mã ký tự sẽ được so sánh.

– có thể truy cập vào các phần tử riêng lẻ của một chuỗi giống như cách truy cập vào các phần tử mảng: a, a. Số của phần tử dòng được chỉ định trong dấu ngoặc vuông.

Các thủ tục và hàm hướng tới làm việc với chuỗi.

nối (s1, s2,…)– chức năng hợp nhất chuỗi, s1, s2,... - số dòng, số lượng dòng có thể tùy ý. Kết quả của hàm là một chuỗi. Nếu chuỗi kết quả dài hơn 255 ký tự, chuỗi sẽ bị cắt ngắn còn 255 ký tự.

(các) bản sao, chỉ mục, số lượng)– hàm trích xuất một chuỗi từ chuỗi nguồn S chiều dài đếm ký tự, bắt đầu bằng số ký tự mục lục.

xóa (s, chỉ mục, số lượng)– thủ tục loại bỏ khỏi chuỗi s một chuỗi con có độ dài đếm ký tự, bắt đầu bằng số ký tự mục lục.

chèn (s1, s2, chỉ mục)– thủ tục chèn hàng s1 xếp hàng s2, bắt đầu bằng ký tự có số mục lục.

(các) chiều dài– hàm xác định độ dài chuỗi hiện tại, trả về một số bằng độ dài chuỗi hiện tại.

vị trí(s1,s2)– hàm tìm kiếm trong chuỗi s2 chuỗi con s1. trả về số vị trí của ký tự đầu tiên của chuỗi con s1 xếp hàng s2(hoặc 0 nếu dòng này không tồn tại).

giá trị (st, x, mã)– thủ tục chuyển chuỗi s thành số nguyên hoặc biến thực x. Tham số mã số chứa 0 nếu chuyển đổi thành công (và trong x kết quả của việc chuyển đổi được đặt) hoặc số vị trí dòng nơi phát hiện ký tự sai (trong trường hợp này là giá trị x không thay đổi).

Khả năng tương thích và chuyển đổi loại. Turbo Pascal là một ngôn ngữ đánh máy. Nó được xây dựng trên cơ sở tuân thủ nghiêm ngặt khái niệm kiểu, theo đó tất cả các phép toán được sử dụng trong ngôn ngữ chỉ được xác định trên các toán hạng của các kiểu tương thích.

Hai loại được coi là tương thích nếu:

– cả hai đều cùng loại;

– cả hai đều có thật;

- cả hai đều còn nguyên vẹn;

– một loại là loại phạm vi của loại thứ hai;

– cả hai đều là loại phạm vi có cùng loại cơ sở;

– cả hai đều là tập hợp gồm các phần tử cùng loại cơ bản;

– cả hai đều là các chuỗi được đóng gói (được xác định bằng từ được đóng gói trước đó) có cùng độ dài tối đa;

– một là kiểu chuỗi và một là kiểu chuỗi hoặc ký tự;

– một loại là con trỏ bất kỳ và loại kia là con trỏ tới đối tượng liên quan của nó;

– cả hai đều là loại thủ tục có cùng loại kết quả (đối với một loại hàm), số lượng tham số và loại tham số tương ứng lẫn nhau.

Khả năng tương thích kiểu đặc biệt quan trọng trong toán tử gán. Đặt t1 là loại biến và t2 là loại biểu thức, nghĩa là phép gán t1:=t2 được thực hiện. Nhiệm vụ này có thể thực hiện được trong các trường hợp sau:

– t1 và t2 là cùng một loại và loại này không đề cập đến tệp, mảng tệp, bản ghi chứa trường tệp hoặc mảng của bản ghi đó;

– t1 và t2 là các loại thứ tự tương thích và giá trị của t2 nằm trong phạm vi các giá trị có thể có của t1;

– t1 và t2 là kiểu thực, giá trị của t2 nằm trong khoảng giá trị có thể có của t1;

– t1 – kiểu thực và t2 – kiểu số nguyên;

– t1 – dòng và t2 – ký tự;

– t1 – chuỗi và t2 – chuỗi đóng gói;

– t1 và t2 – các chuỗi đóng gói tương thích;

– t1 và t2 là các tập hợp tương thích và tất cả các thành viên của t2 đều thuộc tập hợp các giá trị có thể có của t1;

– t1 và t2 là các con trỏ tương thích;

– t1 và t2 là các loại thủ tục tương thích;

– t1 là một đối tượng và t2 là con cháu của nó.

Trong một chương trình, dữ liệu của một loại có thể được chuyển đổi thành dữ liệu của loại khác. Chuyển đổi này có thể rõ ràng hoặc tiềm ẩn.

Chuyển đổi loại rõ ràng gọi các hàm chuyển đổi đặc biệt có đối số thuộc về một loại và có giá trị thuộc về loại khác. Một ví dụ là các hàm đã được thảo luận ord, trunc, round, chr.

Chuyển đổi ngầm chỉ có thể thực hiện được trong hai trường hợp:

– trong các biểu thức bao gồm các biến số thực và số nguyên, biến sau sẽ tự động được chuyển đổi thành kiểu thực và toàn bộ biểu thức thu được một kiểu thực;

– cùng một vùng bộ nhớ được xử lý luân phiên như chứa dữ liệu thuộc loại này hoặc loại khác (kết hợp dữ liệu thuộc các loại khác nhau trong bộ nhớ).

Để một máy có thể xử lý bất kỳ dữ liệu đầu vào nào, nó phải “hiểu” loại biến chứa các giá trị được lưu trữ. Trong trường hợp không có thông tin về định dạng dữ liệu, máy tính sẽ không thể xác định liệu thao tác này hay thao tác đó có được phép trong một trường hợp cụ thể hay không: ví dụ: bằng trực giác, rõ ràng là không thể nâng một chữ cái lên lũy thừa hoặc lấy tích phân của một chuỗi. Vì vậy, người dùng phải xác định những hành động nào được phép thực hiện với mỗi biến.

Giống như trong các ngôn ngữ lập trình cấp cao khác, các kiểu biến trong Pascal được tối ưu hóa để thực hiện các tác vụ thuộc nhiều loại khác nhau, có phạm vi giá trị và độ dài tính bằng byte khác nhau.

Phân chia các loại biến

Các loại biến trong Pascal được chia thành đơn giản và có cấu trúc. Các loại đơn giản bao gồm các loại thực và thứ tự. Những cái có cấu trúc bao gồm mảng, bản ghi, bộ và tệp. Riêng biệt, con trỏ, đối tượng và các loại thủ tục được phân biệt.

Chúng ta hãy xem xét các loại thứ tự và thực tế. Kiểu thứ tự bao gồm 5 kiểu số nguyên, kiểu liệt kê và kiểu phạm vi.

Các loại thứ tự

Có 5 loại số nguyên, khác nhau về độ dài byte và phạm vi giá trị.

Độ dài của Byte và ShortInt là 1 byte. Sự khác biệt giữa chúng là Byte chỉ lưu trữ các giá trị không âm, trong khi ShortInt cho phép bạn lưu trữ các giá trị âm (từ -128 đến +127). Các loại Word và Integer liên quan với nhau theo cách tương tự, với điểm khác biệt duy nhất là kích thước của chúng là 2 byte.

Cuối cùng, LongInt cho phép bạn lưu trữ cả giá trị âm và dương bằng cách sử dụng 4 byte - theo lũy thừa thứ 16 của thứ nguyên số ở hai bên số 0. Nhiều loại biến khác nhau trong Pascal góp phần giải quyết hiệu quả các tác vụ của người dùng, vì trong từng trường hợp cụ thể, cả một phạm vi giá trị nhỏ và lớn đều có thể được yêu cầu và cũng có thể có những hạn chế về lượng bộ nhớ được phân bổ.

Điều quan trọng là phải hiểu rằng số 0 chiếm nhiều không gian bộ nhớ như bất kỳ số nào khác. Do đó, khi hình thành một phạm vi giá trị, số âm tối thiểu trong giá trị tuyệt đối sẽ lớn hơn số dương một đơn vị: ví dụ: từ -128 đến +127.

Các biến thuộc về có thể lấy giá trị TRUE (true) hoặc FALSE (false) và yêu cầu 1 byte bộ nhớ.

Kiểu CHAR cho phép bạn lưu trữ bất kỳ ký tự nào trong số nhiều ký tự tồn tại trong bộ nhớ máy tính. Đồng thời, trong các biến ký hiệu trong Pascal, chỉ có mã của ký hiệu thực sự được lưu trữ, theo đó dạng đồ họa của nó được hiển thị.

Các loại thực

Trong số các loại biến trong Pascal, có một số loại biến số có khả năng viết phần phân số. Sự khác biệt giữa các loại Đơn, Thực, Đôi và Mở rộng nằm ở phạm vi giá trị được chấp nhận, số chữ số có nghĩa sau dấu thập phân và kích thước tính bằng byte.

Theo thứ tự trình bày ở trên, một biến của mỗi loại sẽ chiếm 4, 6, 8 hoặc 10 byte.

Mảng

Các kiểu dữ liệu có cấu trúc rất phức tạp và cho phép bạn kết hợp một số giá trị đơn giản trong một biến duy nhất. Một ví dụ điển hình là một mảng, có thể được định nghĩa như sau:

String=mảng char;

Vì vậy, chúng ta có một kiểu gọi là String, cho phép chúng ta xác định các biến dài tối đa 100 ký tự. Dòng cuối cùng xác định trực tiếp mảng một chiều Y kiểu String. Các biến trong Pascal được mô tả bằng cách đặt mã định danh ở bên trái và giá trị biến ở bên phải, sau dấu bằng.

Phạm vi chỉ mục được viết cho phép truy cập vào từng phần tử cụ thể của mảng:

Trong trường hợp này, chúng ta đọc phần tử thứ hai của mảng Y được tạo trước đó.

Các biến chuỗi trong Pascal cũng là trường hợp đặc biệt của mảng một chiều, vì chuỗi là một chuỗi các ký tự, tức là các phần tử thuộc kiểu char.

bài viết

Một bản ghi bao gồm một số trường chứa đầy dữ liệu thuộc bất kỳ loại nào ngoại trừ tệp. Nói chung, loại biến này tương tự như một phần tử cơ sở dữ liệu. Ví dụ: bạn có thể nhập tên và số điện thoại của một người:

gõ Ntel = Bản ghi

Dòng đầu tiên bên trái cho biết tên của loại và bên phải - bản ghi từ dịch vụ. Dòng thứ hai chứa trường có tên, dòng thứ ba - số điện thoại. Từ “kết thúc” có nghĩa là chúng tôi đã nhập tất cả các trường mà chúng tôi muốn và điều này hoàn tất quá trình tạo bản ghi.

Cuối cùng, ở dòng cuối cùng chúng ta đặt biến One, thuộc loại NTel.

Bạn có thể truy cập cả bản ghi nói chung và các thành phần riêng lẻ của nó, ví dụ: one.NAME (tức là tên biến. record_field_name).

Các tập tin

Pascal cho phép bạn làm việc với các tệp văn bản, được gõ và không được gõ, là một chuỗi có cấu trúc của các thành phần có cùng loại.

Khi đọc hoặc ghi vào một tập tin, có thể sử dụng địa chỉ đầy đủ hoặc dạng rút gọn của nó:

‘C:\Thư mục\File2.txt’

Biểu mẫu ngắn được sử dụng khi tệp được đặt trong thư mục lưu trữ chương trình truy cập vào nó. Mẫu đầy đủ có thể được sử dụng trong mọi trường hợp.

Bạn có thể đặt biến loại tệp như sau:

f1: tệp số nguyên;

Để làm việc với các tệp, nhiều chức năng và quy trình khác nhau được sử dụng để liên kết một biến với một tệp trên đĩa, mở nó để đọc, ghi và ghi đè, đóng nó khi hoàn tất, cho phép bạn tạo tên mới và xóa tệp khỏi máy tính.

Cuối cùng

Nếu không có khả năng sử dụng nhiều loại biến khác nhau trong Pascal, người dùng sẽ không thể thực hiện ngay cả tác vụ đơn giản nhất. Để chương trình thực thi thuật toán mà không mắc lỗi, cần phải học cả từ chức năng và cú pháp, vì máy chỉ có thể “hiểu” các lệnh nếu chúng được viết theo cách duy nhất đúng.

Phổ biến nhất trong toán học các loại số- Cái này trọn các số đại diện cho vô số giá trị rời rạc và có hiệu lực những con số đại diện cho sự liên tục không giới hạn của các giá trị.

Mô tả các kiểu dữ liệu số (số nguyên) của Pascal

Trong cùng một ngôn ngữ, các tập hợp con khác nhau của tập hợp số nguyên có thể được triển khai. Phạm vi giá trị có thể có của các kiểu 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. Do đó, trong Pascal 7.0 các kiểu dữ liệu số nguyên sau được sử dụng:

Với toàn bộ kiểu dữ liệu số Pascal có thể thực hiện các phép toán sau:

  • Môn số học:
    phép cộng (+);
    phép trừ(-);
    phép nhân(*);
    phần dư của phép chia (mod);
    lũy thừa;
    cộng một ngôi (+);
    dấu trừ đơn nhất (-).
  • Hoạt động quan hệ:
    quan hệ bình đẳng (=);
    quan hệ bất đẳng thức (<>);
    tỷ lệ nhỏ hơn (<);
    tỷ lệ lớn hơn (>);
    quan hệ không nhỏ hơn (>=);
    không còn thái độ nữa (<=).

Khi hành động với kiểu dữ liệu 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ó các loại số nguyên khác nhau, thì sẽ tương ứng với loại toán hạng có lũy thừa tối đa (phạm vi giá trị tối đa). Khả năng tràn kết quả không được kiểm soát dưới bất kỳ hình thức nào (nó quan trọng!) , điều này có thể dẫn đến sai sót.

Cần đặc biệt chú ý đến phép chia của các kiểu dữ liệu số nguyên. Pascal cho phép thực hiện hai phép chia, được ký hiệu tương ứng "/" div. Bạn cần biết rằng kết quả của phép chia "/" không phải là số nguyên mà là số thực(điều này đúng ngay cả khi bạn chia 8 cho 2, tức là 8/2=4,0). Phép chia div là phép chia số nguyên, I E. loại kết quả là số nguyên.

Mô tả các kiểu dữ liệu số của Pascal (số thực)

Kiểu dữ liệu số thực đề cập đến một tập hợp con các số thực có thể được biểu diễn ở định dạng được gọi là dấu phẩy động với một số chữ số cố định. Với dấu phẩy động, mỗi kiểu dữ liệu số được biểu diễn dưới dạng hai nhóm chữ số. Nhóm số đầu tiên được gọi là mantissa, nhóm số thứ hai là số mũ. Nói chung, kiểu dữ liệu số ở dạng dấu phẩy động có thể được biểu diễn như sau: X= (+|-)MP (+ | -) r, trong đó M là phần định trị của số; r – thứ tự số (r – số nguyên); P - cơ số của hệ thống số. Ví dụ: đối với cơ số thập phân, biểu diễn 2E-1 (ở đây E là cơ số của hệ thập phân) sẽ có dạng: 2*10 -1 =0,2 và biểu diễn 1.234E5 sẽ tương ứng với: 1.234*10 5 =123400.0.

Pascal sử dụng các loại số thực sau đây, chúng chỉ xác định một số tùy ý với độ chính xác hữu hạn nào đó tùy thuộc vào định dạng bên trong của số thực:

Khi mô tả một biến thực kiểu real, một biến có kích thước 4 byte sẽ được tạo trong bộ nhớ máy tính. Trong trường hợp này, 3 byte sẽ được cung cấp cho phần định trị và một byte cho đơn hàng.

Các thao tác sau có thể được thực hiện trên các kiểu dữ liệu số thực:

  • Môn số học:
    phép cộng (+);
    phép trừ(-);
    phép nhân(*);
    phân công(/);
    lũy thừa;
    cộng một ngôi (+);
    dấu trừ đơn nhất (-).
  • Hoạt động quan hệ:
    quan hệ bất đẳng thức (<>);
    tỷ lệ nhỏ hơn (<);
    tỷ lệ lớn hơn (>);
    quan hệ không nhỏ hơn (>=);
    không còn thái độ nữa (<=).

Như bạn có thể thấy, Pascal có đặc điểm là có nhiều loại thực, nhưng truy cập được vào các loại dữ liệu số. đơn, gấp đôimở rộng chỉ có thể thực hiện được trong các chế độ biên dịch đặc biệt. Các kiểu dữ liệu số này được thiết kế để hỗ trợ phần cứng cho số học dấu phẩy động và để sử dụng chúng một cách hiệu quả, PC của bạn phải có bộ đồng xử lý toán học.

Kiểu dữ liệu số chiếm một vị trí đặc biệt trong Pascal. máy tính, được coi là số thực không có phần mũ và phần phân số. Thực ra, máy tính là số nguyên có dấu "lớn" giữ lại 19..20 chữ số thập phân có nghĩa. Đồng thời, kiểu dữ liệu số máy tính trong các biểu thức, nó hoàn toàn tương thích với các kiểu thực khác: tất cả các phép toán thực được xác định trên nó, nó có thể được sử dụng làm đối số cho các hàm toán học, v.v.

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

Việc chuyển đổi ngầm định (tự động) các kiểu dữ liệu số gần như không thể thực hiện được trong Pascal. Một ngoại lệ chỉ được thực hiện cho loại số nguyên, được phép sử dụng trong các biểu thức như thực tế. 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;

Đó là 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 được tự động gõ thực tế trong loại số nguyên không thể có trong Pascal. Hãy nhớ có bao nhiêu byte được phân bổ cho các biến loại số nguyênthực tế: đối với kiểu dữ liệu số nguyên số nguyên 2 byte bộ nhớ được phân bổ và thực - 6 byte. Để chuyển đổi thực tế V. số nguyên Có hai chức năng tích hợp: tròn(x) làm tròn số thực x lên số nguyên gần nhất, cắt ngắn(x) cắt bớt một số thực bằng cách loại bỏ phần phân số.

BÀI 2

Cơ bản về lập trình.

Giới thiệu Pascal. Loại dữ liệu. Hoạt động.

bảng chữ cái ngôn ngữPascal

Bất kỳ ngôn ngữ tự nhiên nào cũng bao gồm các yếu tố như ký hiệu, từ, cụm từ và câu. Một ngôn ngữ lập trình cũng có các yếu tố tương tự: ký hiệu, từ, biểu thức (cụm từ), toán tử (câu).

Các từ được hình thành từ một bộ sưu tập các ký hiệu. Biểu thức - đây là các nhóm từ và toán tử - Đây là sự kết hợp của các từ và cách diễn đạt. Ký hiệu ngôn ngữ là những ký hiệu cơ bản (chữ cái) được sử dụng để soạn thảo một số văn bản. Vì vậy, tập hợp các ký hiệu này tạo thành bảng chữ cái của ngôn ngữ.

Bảng chữ cái Pascal bao gồm:

1. Chữ hoa và chữ thường của bảng chữ cái Latinh, bao gồm các ký tự sau:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - chữ in hoa;

A b c d e f g h i j k l m n o p q r s t u v w x y z - chữ thường;

2. Chữ số Ả Rập thập phân: 0 1 2 3 4 5 6 7 8 9;

3. Chữ số thập lục phân (được cấu tạo từ chữ số thập phân và các chữ cái từ A đến F);

4. 32 chữ hoa và chữ thường của bảng chữ cái tiếng Nga;

5. Ký tự đặc biệt:

Sự kết hợp của các ký tự đặc biệt có thể tạo thành các ký tự ghép:

: = bài tập;

< >không công bằng;

>= lớn hơn hoặc bằng;

<= меньше или равно;

Phạm vi giá trị;

(* *) hoặc ( ) - bình luận.

Cấu trúc chương trình Pascal

Để trình biên dịch Passal hiểu chính xác những hành động được mong đợi từ nó, chương trình của bạn phải được định dạng đầy đủ theo cú pháp (quy tắc xây dựng chương trình) của ngôn ngữ này.

Bất kỳ chương trình Pascal nào cũng có thể bao gồm các khối sau (các phần tùy chọn được đánh dấu bằng dấu ngoặc vuông sau đây):

chương trình<имя_программы>;

[sử dụng<имена_подключаемых_модулей>;]

[ nhãn<список_меток>;]

[ hằng số<имя_константы> = <значение_константы>;]

[ kiểu<имя_типа> = <определение_типа>;]

[var<имя_переменной> : <тип_переменной>;]

[ thủ tục<имя_процедуры> <описание_процедуры>;]

[ chức năng<имя_функции> <описание_функции>;]

bắt đầu (bắt đầu phần chính của chương trình)

<операторы>

kết thúc. (* kết thúc nội dung chính của chương trình *)

Các phiên bản sau này của trình biên dịch ngôn ngữ Pascal không còn yêu cầu chỉ định tên chương trình, tức là dòng chương trình<имя_программы>; có thể được bỏ qua. Nhưng điều này chỉ có thể thực hiện được nếu toàn bộ chương trình được chứa trong một tệp mô-đun. Nếu chương trình bao gồm một số phần độc lập - mô-đun, thì mỗi phần trong số chúng phải có một tiêu đề (chương trình hoặc đơn vị).

Bất kỳ phần tùy chọn nào được liệt kê đều có thể xuất hiện nhiều lần trong văn bản chương trình, trình tự chung của chúng cũng có thể thay đổi, nhưng phải luôn tuân theo quy tắc chính của ngôn ngữ Pascal: trước khi sử dụng một đối tượng, nó phải được khai báo và mô tả.

Trình biên dịch Pascal không phân biệt chữ thường và chữ in hoa và bỏ qua các ký tự khoảng trắng, do đó văn bản chương trình có thể được cấu trúc sao cho thuận tiện nhất cho việc đọc và gỡ lỗi.

Chỉ thị trình biên dịch

Dòng bắt đầu bằng các ký hiệu ($ không phải là một nhận xét mà là một chỉ thị của trình biên dịch - một lệnh đặc biệt mà quá trình biên dịch và thực thi chương trình phụ thuộc vào. Chúng tôi sẽ xem xét các chỉ thị trong những phần mà chúng liên quan đến "theo ý nghĩa".

Ví dụ: dòng ($I-,Q+) vô hiệu hóa xác thực I/O nhưng cho phép kiểm soát tràn tính toán.

Số nhận dạng

Tên được đặt cho các đối tượng chương trình (hằng, kiểu, biến, hàm và thủ tục và toàn bộ chương trình) được gọi là mã định danh. Chúng chỉ có thể bao gồm các số, chữ cái Latinh và dấu "_" (dấu gạch dưới). Tuy nhiên, một số không thể bắt đầu một tên. Mã định danh có thể có độ dài bất kỳ, nhưng nếu hai tên có 63 ký tự đầu tiên giống nhau thì tên được coi là giống hệt nhau.

Bạn có thể đặt cho các đối tượng chương trình của mình bất kỳ tên nào, nhưng bạn phải đảm bảo rằng chúng khác với các từ dành riêng được Pascal sử dụng, vì trình biên dịch sẽ vẫn không chấp nhận các biến có tên "nước ngoài".

Dưới đây là danh sách các từ dành riêng phổ biến nhất:

triển khai mảng shl

chuỗi giao diện trường hợp

nhãn const rồi

sử dụng con trỏ tập tin

thủ tục xa var

cho chương trình trong khi

chuyển tiếp bản ghi với

chức năng lặp lại xor

Biến và kiểu dữ liệu

Biến là một đối tượng chương trình có giá trị có thể thay đổi trong khi chương trình đang chạy.

Kiểu dữ liệu là đặc điểm của phạm vi giá trị mà các biến thuộc kiểu dữ liệu đó có thể lấy.

Tất cả các biến được sử dụng trong chương trình phải được mô tả trong phần var đặc biệt bằng mẫu sau:

var<имя_переменной_1> [, <имя_переменной_2, _>] : <имя_типа_1>;

<имя_переменной_3> [, <имя_переменной_4, _>] : <имя_типа_2>;

Ngôn ngữ Pascal có một tập hợp lớn các kiểu dữ liệu khác nhau, nhưng bây giờ chúng tôi sẽ chỉ chỉ ra một số trong số đó. Chúng ta sẽ nói thêm về tất cả các loại dữ liệu.

Hằng số

Hằng là một đối tượng có giá trị được biết trước khi chương trình bắt đầu chạy.

Các hằng số cần thiết cho việc thiết kế các chương trình trực quan, không thể thiếu khi sử dụng các giá trị lặp đi lặp lại trong văn bản của chương trình và thuận tiện nếu cần thay đổi các giá trị này trong toàn bộ chương trình cùng một lúc.

Có ba loại hằng số trong Pascal:

Các hằng số không tên (chữ số và số, ký hiệu và chuỗi, bộ);

Các hằng số chưa được đặt tên;

Các hằng số được gõ tên.

Hằng số không tên

Các hằng không tên không có tên và do đó không cần phải khai báo.

Theo mặc định, loại hằng số không tên được xác định tự động:

Bất kỳ chuỗi số nào (có thể đứng trước dấu "-" hoặc "+" hoặc được chia nhỏ bằng một dấu chấm) được trình biên dịch coi là một hằng số không tên - một số (số nguyên hoặc số thực);

Bất kỳ chuỗi ký tự nào được đặt trong dấu nháy đơn đều được coi là một hằng số không tên - một chuỗi;

Bất kỳ chuỗi số nguyên hoặc ký hiệu nào được phân tách bằng dấu phẩy, được đóng khung bằng dấu ngoặc vuông, được coi là một hằng số không tên - một tập hợp.

Ngoài ra, còn có hai hằng số đặc biệt true và false liên quan đến kiểu dữ liệu Boolean.

Ví dụ về việc sử dụng hằng số không tên bao gồm các toán tử sau:

real2:= 12,075 + x;

string4:= "abc" + string44;

set5:= * set55;

boolean6:= đúng;

Các hằng số chưa được gõ

Các hằng được đặt tên, như tên gọi của chúng gợi ý, phải có tên. Vì vậy, những tên này phải được báo cáo cho trình biên dịch, nghĩa là được mô tả trong phần const đặc biệt.

Nếu bạn không chỉ định loại hằng số thì khi xuất hiện, chính trình biên dịch sẽ xác định loại (cơ sở) nào sẽ được gán cho nó. Bất kỳ hằng số nào đã được mô tả đều có thể được sử dụng khi khai báo các hằng, biến và kiểu dữ liệu khác. Dưới đây là một số ví dụ về mô tả các hằng số được đặt tên chưa được định kiểu:

Hằng số được gõ

Các hằng số được đặt tên được gõ là các biến (!) Có giá trị ban đầu đã được biết trước khi chương trình bắt đầu. Do đó, thứ nhất, các hằng đã gõ không thể được sử dụng để xác định các hằng, kiểu dữ liệu và biến khác, thứ hai, giá trị của chúng có thể bị thay đổi trong khi chương trình đang chạy.

Các hằng số được gõ được mô tả bằng mẫu sau:

hằng số<имя_константы> : <тип_константы> = <начальное_значение>;

Các ví dụ dưới đây cho thấy cách thực hiện việc này:

const n: số nguyên = -10;

b: boolean = đúng;

Chúng tôi sẽ cung cấp các ví dụ về các hằng số được gõ thuộc các loại khác khi chúng tôi nghiên cứu các loại dữ liệu tương ứng.

Các kiểu dữ liệu Pascal

Trình biên dịch Pascal yêu cầu thông tin về dung lượng bộ nhớ cần thiết để chạy chương trình phải được cung cấp trước khi chương trình chạy. Để làm được điều này, trong phần mô tả biến (var), bạn cần liệt kê tất cả các biến được sử dụng trong chương trình. Ngoài ra, bạn cũng cần cho trình biên dịch biết mỗi biến này sẽ chiếm bao nhiêu bộ nhớ.

Tất cả điều này có thể được truyền đạt tới chương trình bằng cách chỉ ra loại biến tương lai. Có thông tin về loại biến, trình biên dịch “hiểu” số byte cần được phân bổ cho nó, những hành động nào có thể được thực hiện với nó và nó có thể tham gia vào cấu trúc nào.

Để thuận tiện cho các lập trình viên, Pascal có nhiều kiểu dữ liệu tiêu chuẩn và ngoài ra còn có khả năng tạo các kiểu dữ liệu mới dựa trên các kiểu dữ liệu hiện có (tiêu chuẩn hoặc do chính lập trình viên xác định lại), được gọi là được xây dựng.

Việc phân chia thành các kiểu dữ liệu cơ bản và xây dựng trong Pascal được thể hiện trong bảng:

Các kiểu dữ liệu thứ tự (rời rạc)

Các kiểu dữ liệu địa chỉ

Các kiểu dữ liệu có cấu trúc

Các kiểu dữ liệu số học

Các kiểu dữ liệu cơ bản

Hợp lý

tượng trưng

Thực tế

Netipizi

chỉ mục được lập chỉ mục

Các loại đã xây dựng

Có thể liệt kê được

tuần = (su, mo, tu, we, th,fr,sa);

con trỏ gõ

Mảng

chuỗi chuỗi

kỷ lục kỷ lục

thủ tục

Sự vật

Khoảng (phạm vi)

Các kiểu dữ liệu do lập trình viên xây dựng

Kiểu dữ liệu thứ tự

Trong số các loại dữ liệu cơ bản, loại thứ tự nổi bật. Tên này có thể được biện minh theo hai cách:

1. Mỗi phần tử thuộc loại thứ tự có thể được liên kết với một số (thứ tự) duy nhất. Đánh số các giá trị bắt đầu từ số 0. Ngoại lệ là các kiểu dữ liệu shortint, số nguyên và longint. Việc đánh số của chúng trùng với giá trị của các phần tử.

2. Ngoài ra, trên các phần tử thuộc bất kỳ loại thứ tự nào, một thứ tự được xác định (theo nghĩa toán học của từ này), điều này phụ thuộc trực tiếp vào việc đánh số. Do đó, đối với hai phần tử bất kỳ thuộc loại thứ tự, người ta có thể nói chính xác phần tử nào nhỏ hơn và phần tử nào lớn hơn.

Các quy trình chuẩn xử lý các kiểu dữ liệu thứ tự

Các hàm và thủ tục sau đây chỉ được xác định cho các loại thứ tự:

1. Hàm ord(x) trả về số thứ tự của giá trị của biến x (liên quan đến loại mà biến x thuộc về).

2. Hàm pred(x) trả về giá trị trước x (không áp dụng cho phần tử đầu tiên của kiểu).

3. Hàm succ(x) trả về giá trị theo sau x (không áp dụng cho phần tử cuối cùng của loại).

4.Thủ tục inc(x) trả về giá trị theo sau x (đối với kiểu dữ liệu số học, giá trị này tương đương với toán tử x:=x+1).

5.Thủ tục inc(x,k) trả về giá trị thứ k theo sau x (đối với kiểu dữ liệu số học, giá trị này tương đương với toán tử x:=x+k).

6.Thủ tục dec(x) trả về giá trị trước x (đối với kiểu dữ liệu số học, giá trị này tương đương với toán tử x:=x-1).

7.Thủ tục dec(x,k) trả về giá trị k-e trước x (đối với kiểu dữ liệu số học, giá trị này tương đương với toán tử x:=x-k).

Thoạt nhìn, có vẻ như kết quả của việc sử dụng thủ tục inc(x) hoàn toàn giống với kết quả của việc sử dụng hàm succ(x). Tuy nhiên, sự khác biệt giữa chúng xuất hiện ở ranh giới trong phạm vi cho phép. Hàm succ(x) không thể áp dụng cho phần tử tối đa của một loại, nhưng thủ tục inc(x) sẽ không tạo ra bất kỳ lỗi nào, nhưng hoạt động theo quy tắc cộng máy, sẽ thêm phần tử tiếp theo vào số phần tử . Tất nhiên, số sẽ nằm ngoài phạm vi và do bị cắt bớt, sẽ biến thành số có giá trị nhỏ nhất của phạm vi. Hoá ra là các thủ tục inc() và dec() nhận biết bất kỳ loại thứ tự nào như thể “đóng trong một vòng”: ngay sau giá trị cuối cùng lại đến giá trị đầu tiên.

Hãy để chúng tôi giải thích mọi thứ đã được nói bằng một ví dụ. Đối với kiểu dữ liệu

gõ mười sáu = 0,15;

cố gắng thêm 1 vào số 15 sẽ cho kết quả như sau:

Đơn vị ban đầu sẽ bị cắt đi và do đó thu được inc(15)=0.

Tình huống tương tự ở giới hạn dưới của phạm vi cho phép của kiểu dữ liệu thứ tự tùy ý được quan sát thấy đối với thủ tục dec(x) và hàm pred(x):

tháng mười hai (min_element)= max_element

Các kiểu dữ liệu liên quan đến thứ tự

1. Kiểu boolean có hai giá trị: false và true, và các đẳng thức sau đây áp dụng cho chúng:

ord(false)=0, ord(true)=1, false

pred(true)=false, succ(false)=true,

inc(true)=false, inc(false)=true,

tháng mười hai(true)=false, tháng mười hai(false)=true.

2. Kiểu ký tự char chứa 256 ký tự ASCII mở rộng (ví dụ: “a”, “b”, “i”, “7”, “#”). Số ký tự được hàm ord() trả về giống với số ký tự trong bảng ASCII.

3. Hãy tóm tắt các kiểu dữ liệu số nguyên trong một bảng:

Loại dữ liệu

Số byte

Phạm vi

2147483648..2147483647

4. Các kiểu dữ liệu liệt kê được chỉ định trong phần kiểu bằng cách liệt kê rõ ràng các phần tử của chúng. Ví dụ:

gõ tuần =(sun,thứ hai,thứ ba,thứ tư,thứ năm,thứ sáu,thứ bảy)

Hãy nhớ lại rằng đối với kiểu dữ liệu này:

inc(sat) = mặt trời, dec(sun) = sat.

5. Các kiểu dữ liệu khoảng chỉ được xác định bởi ranh giới phạm vi của chúng. Ví dụ:

gõ tháng = 1..12;

bugni = mon..fri;

6. Các kiểu dữ liệu do người lập trình xây dựng được mô tả trong phần kiểu dữ liệu theo mẫu sau:

kiểu<имя_типа> = <описание_типа>;

Ví dụ:

gõ lat_bukvy = "a".."z","A".."Z";

Các kiểu dữ liệu cơ bản là tiêu chuẩn nên không cần mô tả chúng trong phần kiểu. Tuy nhiên, nếu muốn, điều này cũng có thể được thực hiện, ví dụ, bằng cách đặt tên ngắn cho các định nghĩa dài. Giả sử bằng cách giới thiệu một kiểu dữ liệu mới

gõ int = số nguyên;

Bạn có thể rút ngắn văn bản chương trình một chút.

Các kiểu dữ liệu thực

Hãy nhớ lại rằng các kiểu dữ liệu này là số học, không phải thứ tự.

Loại dữ liệu

Số byte

Phạm vi (giá trị tuyệt đối)

1.5*10-45..3.4*1038

2.9*10-39..1.7*1038

5.0*10-324..1.7*10308

3.4*10-4932..1.1*104932

Các kiểu dữ liệu được xây dựng

Chúng ta sẽ xem xét kỹ hơn các loại dữ liệu này (cùng với các phép toán được xác định cho chúng) trong một số bài giảng.

Hoạt động và biểu thức

Các phép tính toán học

Hãy nói về các thao tác - các hành động tiêu chuẩn được phép đối với các biến thuộc loại dữ liệu cơ bản này hoặc loại khác. Cơ sở sẽ là các phép toán số học và logic.

Lưu ý: Tất cả các toán tử được liệt kê bên dưới (ngoại trừ "-" và không) đều yêu cầu hai toán hạng.

1. Các phép toán logic (và - logic AND, hoặc - logic OR, không - logic NOT, xor - OR độc quyền) chỉ được áp dụng cho các giá trị thuộc loại boolean. Chúng cũng dẫn đến các giá trị boolean. Dưới đây là bảng giá trị cho các hoạt động này:

đúng sai đúng

sai sai sai

đúng sai sai

2. Các phép toán so sánh (=,<>, >, <, <=, >=) áp dụng cho tất cả các loại cơ bản. Kết quả của họ cũng là giá trị boolean.

3. Các phép tính số học số nguyên chỉ áp dụng được cho kiểu số nguyên. Kết quả của chúng là một số nguyên có kiểu phụ thuộc vào kiểu của toán hạng.

a div b - chia a cho b hoàn toàn (có lẽ không cần phải nhắc bạn rằng phép chia cho 0 bị cấm, vì vậy trong những trường hợp như vậy thao tác sẽ tạo ra lỗi). Kết quả sẽ có kiểu dữ liệu chung cho kiểu dữ liệu của toán hạng.

Ví dụ: (shortint div byte = số nguyên). Điều này có thể được giải thích theo cách này: số nguyên là loại tối thiểu trong đó cả byte và shortint đều là tập hợp con.

a mod b - lấy số dư khi chia a cho b. Loại kết quả, như trong trường hợp trước, được xác định bởi loại toán hạng và 0 là giá trị không hợp lệ cho b. Không giống như mod phép toán, kết quả của nó luôn là số không âm, dấu của kết quả của mod phép toán "lập trình viên" được xác định bằng dấu của toán hạng đầu tiên của nó. Do đó, nếu trong toán học (-2 mod 5) = 3, thì chúng ta có (-2 mod 5) = -2.

a shl k - dịch chuyển giá trị của a x k bit sang trái (điều này tương đương với việc nhân giá trị của biến a với 2k). Kết quả của phép toán sẽ có cùng loại với (các) toán hạng đầu tiên của nó.

a shr k - dịch chuyển giá trị của a x k bit sang phải (điều này tương đương với việc chia hoàn toàn giá trị của biến a cho 2k). Kết quả của phép toán sẽ có cùng loại với (các) toán hạng đầu tiên của nó.

và, hoặc, không, xor - các phép toán số học nhị phân hoạt động với các bit biểu diễn số nguyên nhị phân, tuân theo các quy tắc giống như các phép toán logic tương ứng.

4. Các phép tính số học tổng quát (+, -, *, /) áp dụng cho tất cả các loại số học. Kết quả của chúng thuộc về một kiểu dữ liệu chung cho cả hai toán hạng (ngoại lệ duy nhất là phép chia phân số /, kết quả của nó luôn là kiểu dữ liệu thực).

Các hoạt động khác

Có các thao tác khác dành riêng cho giá trị của một số kiểu dữ liệu tiêu chuẩn của Pascal. Chúng ta sẽ xem xét các hoạt động này trong các phần thích hợp:

#, in, +, *, : xem bài 5 “Ký hiệu. Dòng. Vô số"

@, ^: xem bài giảng 7 “Địa chỉ và con trỏ”

Hàm số học tiêu chuẩn

Các phép toán số học cũng bao gồm các hàm số học tiêu chuẩn. Chúng tôi cung cấp một danh sách chúng với một mô tả ngắn gọn trong bảng.

Chức năng

Sự miêu tả

Loại đối số

Loại kết quả

Giá trị tuyệt đối (mô đun) của một số

Môn số học

Giống như kiểu đối số

Arctang (tính bằng radian)

Môn số học

Thực tế

Cosin (tính bằng radian)

Môn số học

Thực tế

Số mũ (ví dụ)

Môn số học

Thực tế

Lấy phần phân số của một số

Môn số học

Thực tế

Lấy toàn bộ phần của một số

Môn số học

Thực tế

Logarit tự nhiên (cơ số e)

Môn số học

Thực tế

Kiểm tra xem một số có phải là số lẻ không

Ý nghĩa số

Thực tế

Làm tròn đến số nguyên gần nhất

Môn số học

Làm tròn xuống - đến số nguyên nhỏ hơn gần nhất

Môn số học

Sin (tính bằng radian)

Môn số học

Thực tế

bình phương

Môn số học

Thực tế

Căn bậc hai

Môn số học

Thực tế

biểu thức số học

Tất cả các phép toán số học có thể được kết hợp với nhau - tất nhiên, có tính đến các kiểu dữ liệu được phép cho toán hạng của chúng.

Toán hạng của bất kỳ thao tác nào có thể là biến, hằng, lệnh gọi hàm hoặc biểu thức được xây dựng trên cơ sở các thao tác khác. Tất cả cùng nhau được gọi là một biểu thức.

Ví dụ về biểu thức số học:

(x<0) and (y>0) - một biểu thức có kết quả thuộc loại boolean;

z shl abs(k) - toán hạng thứ hai là lệnh gọi hàm tiêu chuẩn;

(x mod k) + min(a,b) + trunc(z) - sự kết hợp của các phép toán số học và lệnh gọi hàm;

Odd(round(x/abs(x))) - biểu thức "nhiều tầng".

Thứ tự tính toán

Nếu biểu thức chứa dấu ngoặc đơn thì các phép tính được thực hiện theo thứ tự sau: độ sâu lồng trong dấu ngoặc đơn càng nhỏ thì phép tính trong dấu ngoặc đơn càng muộn. Nếu không có dấu ngoặc đơn thì các giá trị của phép toán có mức độ ưu tiên cao hơn sẽ được tính trước, sau đó là các giá trị có mức độ ưu tiên thấp hơn. Một số thao tác liên tiếp có cùng mức độ ưu tiên được tính theo trình tự từ trái sang phải.

Bảng 2.1. Ưu tiên (cho tất cả) Hoạt động Pascal