Điều đó có nghĩa là mọi biến và hằng của một kiểu dữ liệu không thể tự do đem trộn lẫn với các biến và hằng của một kiểu dữ liệu khác.. Được chia thành 7 kiểu khai báo với các từ khóa sa
Trang 3M· sè: GD 08 HM 11
Trang 4LỜI NÓI ĐẦU
Con người liên lạc với nhau thông qua ngôn ngữ, tạo ra các mẫu
từ ngữ và âm thanh. Ngôn ngữ lập trình cũng tương tự như vậy, đó
là một tập từ ngữ và ký hiệu cho phép lập trình viên hoặc người dùng có thể tương tác với máy tính. Việc hiểu biết và nắm vững các ngôn ngữ lập trình là thật sự cần thiết đối với các lập trình viên. Mặc
dù đã có hàng trăm ngôn ngữ lập trình được sinh ra, song chỉ có một
số ít là được sử dụng rộng rãi và được xem là một chuẩn công nghiệp. Các ngôn ngữ này đều có thể được sử dụng trên nhiều loại máy tính khác nhau. Hiện nay, ngôn ngữ lập trình Pascal là ngôn ngữ bậc cao đang được sử dụng khá rộng rãi trong lập trình.
Nhằm giúp các bạn sinh viên, nghiên cứu sinh, lập trình viên có được một tài liệu khá hệ thống về ngôn ngữ lập trình Pascal, NXB
Thông tin và Truyền thông trân trọng giới thiệu cuốn sách “Giáo trình ngôn ngữ lập trình Pascalʺ do TS. Nguyễn Ngọc Cương (Trưởng khoa
Chương 5: Kiểu vô hướng liệt kê và kiểu khoảng con
Chương 6: Các câu lệnh có cấu trúc
Trang 5Nhà xuất bản xin trân trọng giới thiệu cùng bạn đọc và rất mong nhận được ý kiến đóng góp của quý vị. Mọi ý kiến đóng góp xin gửi
Trang 6Chương 1: Các thμnh phần cơ bản của ngôn ngữ lập trình Pascal 5
Chương 1 CÁC THÀNH PHẦN CƠ BẢN CỦA NGễN NGỮ LẬP TRèNH PASCAL
1.1 Giới thiệu ngôn ngữ lập trình Turbo Pascal
- Là ngôn ngữ lập trình bậc cao, có cấu trúc và có tính vạn năng
do giáo sư Niklaus Wirth (tác giả của cuốn "Cấu trúc dữ liệu + Giải thuật = Chương trình) sáng tác và công bố vào đầu những năm 1970 lấy tên nhà bác học bậc thầy người Pháp là Pascal để đặt tên Lúc đầu Pascal được sáng tạo ra với mục đích làm ngôn ngữ dạy học
- Pascal là một ngôn ngữ có định kiểu mạnh mẽ Điều đó có nghĩa
là mọi biến và hằng của một kiểu dữ liệu không thể tự do đem trộn lẫn với các biến và hằng của một kiểu dữ liệu khác Việc định kiểu một cách chặt chẽ như vậy đòi hỏi người lập trình phải có các biểu thức tương thích nhau về kiểu dữ liệu
- Pascal là một ngôn ngữ có cấu trúc Một ngôn ngữ có cấu trúc khối là một ngôn ngữ mà ta có thể tách các thông tin dữ liệu (biến, hằng, ) và các lệnh cần dùng cho một nhiệm vụ xác định thành những khối riêng, tách ra khỏi phần còn lại của chương trình để người lập trình có thể giải quyết dần từng phần một, từng khối một và thậm chí
có thể cho nhiều người cùng tham gia lập trình, mỗi người phụ trách một vài khối Mỗi khối ứng với một nhiệm vụ cụ thể và xác định, thường được thực hiện bằng các chương trình con Bằng cách này ta có thể viết các chương trình con sao cho các sự kiện xảy ra trong đó không làm ảnh hưởng tới các phần khác nằm ngoài chương trình Tính cấu trúc của Pascal được thể hiện trên 3 mặt:
Trang 7+ Cấu trúc về mặt dữ liệu: Từ các dữ liệu đã có (kiểu đơn giản chuẩn hoặc dữ liệu có cấu trúc) ta có thể xây dựng các cấu trúc dữ liệu phức tạp hơn
+ Cấu trúc về mặt lệnh: Từ các lệnh đã có (lệnh đơn giản hoặc lệnh có cấu trúc) ta có thể nhóm chúng lại với nhau và đặt giữa hai từ khóa Begin và End thành câu lệnh phức tạp hơn, gọi là lệnh hợp thành hay lệnh ghép
+ Cấu trúc về mặt chương trình: Một chương trình có thể chia thành các mô-đun chương trình độc lập (chương trình con)
1.2 Các thμnh phần cơ bản của ngôn ngữ Pascal
Được xây dựng từ một bộ ký tự, các chữ viết và chữ số được kết hợp lại thành các từ, các từ tạo thành các câu, tất cả đều phải tuân theo một cú pháp và ngữ pháp chặt chẽ
a Bộ chữ viết dùng trong Turbo Pascal
Trang 8Chương 1: Các thμnh phần cơ bản của ngôn ngữ lập trình Pascal 7
- Từ khóa chung: program, begin, end, procedure, function
- Từ khóa để khai báo: const, var, type, label, array, string, record, set, file of
- Từ khóa của lệnh lựa chọn: if then else ; case of
- Từ khóa của lệnh lặp: for to do; for downto do, while do, repeat until
- Từ khóa điều khiển: with, goto, exit
- Từ khóa các phép toán: and, or, not, in, div, mod
- Từ khóa NUL
Các từ khóa có thể viết bằng chữ thường hay chữ hoa Khi đó giá trị và ý nghĩa của chúng là như nhau, điều này khác với ngôn ngữ C/C++ mà chúng ta nghiên cứu sau này
c Tên gọi (Identifier - Định danh)
Là một khái niệm quan trọng dùng để xác định các đại lượng khác nhau trong chương trình như tên biến, tên hằng, tên kiểu, tên chương trình con, tên chương trình, tên tệp, tên nhãn Tên trong Pascal được thành lập theo quy tắc: Là một dãy ký tự bao gồm chữ cái, chữ số và dấu gạch nối Ký tự đầu tiên không được là chữ số, tên có thể có độ dài tối đa là 127 ký tự, nhưng chỉ có 63 ký tự đầu tiên là có ý nghĩa Tên không được trùng với từ khóa Pascal không phân biệt chữ thường
Một số tên chuẩn của Pascal: boolean, char, integer, word, byte, real, text, false, true, maxint, eof, eoln Các hàm chuẩn: abs, arctan, chr, cos, sin Các thủ tục chuẩn: write, writeln, read, readln
Trang 9Ví dụ: Ta có thể định nghĩa ra một hàm có tên là SIN(x) để tính
giá trị tuyệt đối của x (nếu muốn) Song không thể dùng từ khóa Begin
để làm bất cứ việc gì ngoài quy định của bản thân nó
d Dấu chấm phảy (;)
Dấu chấm phảy ";" được dùng để ngăn cách các câu lệnh của Pascal và không thể thiếu được Không nên hiểu dấu ";" là dấu kết thúc lệnh
Turbo Pascal quy định nếu mở lời giải thích bằng dấu (* thì phải
đóng lại bằng dấu *) chứ không được đóng lại bằng dấu } Nếu mở bằng dấu { thì phải đóng lại bằng dấu } chứ không được đóng lại bằng dấu *) Dấu mở có thể có nhiều lần trước một dấu đóng
1.3 Cấu trúc chung của một chương trình Pascal
Cấu trúc chung tổng quát nhất của một chương trình Pascal gồm
Trang 10Chương 1: Các thμnh phần cơ bản của ngôn ngữ lập trình Pascal 9
1.3.1 Phần tên chương trình
Phần tên chương trình bắt đầu bằng từ khóa Program tiếp theo là tên do người lập trình đặt có ý nghĩa nào đó đặc trưng cho công việc của chương trình và kết thúc bằng dấu chấm phảy ";" Phần tiêu đề chiếm một dòng và có thể không có cũng được
1.3.2 Phần khai báo
Phần này có nhiệm vụ khai báo các thư viện có sẵn cần sử dụng trong chương trình, mô tả đối tượng bài toán, mô tả dữ liệu sẽ được chương trình xử lý Được chia thành 7 kiểu khai báo với các từ khóa sau:
Uses Crt, Printer; (Khai báo sử dụng các thư viện)
Label (Khai báo nhãn)
Const (Khai báo các hằng số, hằng ký tự)
Type (Mô tả các kiểu dữ liệu mới)
Var (Khai báo các biến)
Procedure (Khai báo thủ tục)
Function (Khai báo hàm)
Các phần khai báo có thể có hoặc không tùy theo nhu cầu Tuy nhiên với Turbo Pascal for Windows bắt buộc phải khai báo sử dụng các thư viện
1.3.3 Phần thân chương trình
Phần này nằm giữa hai từ khóa BEGIN và END Sau từ khóa END
là dấu chấm để báo kết thúc chương trình Phần này bắt buộc phải có
đối với mọi chương trình, nó chứa các lệnh để xử lý các đối tượng số liệu đã được mô tả trong phần khai báo
1.3.4 Giới thiệu phần mềm Turbo Pascal
Turbo Pascal là sản phẩm của hãng BORLAND (Mỹ) Từ ngày xuất bản đầu tiên đến nay đã qua nhiều lần tái bản, mỗi lần tái bản đã
Trang 11cho một phiên bản mới hơn với nhiều cải tiến hơn Các phiên bản đang
được sử dụng hiện nay là 7.0 và Turbo Pascal for Windows Đặc biệt
là Turbo Pascal 7.0 thích hợp cho các máy vi tính có dung lượng bộ nhớ nhỏ (640kB), tốc độ thấp, vì vậy phiên bản 7.0 được chọn làm mẫu để giới thiệu trong phần này
a Các tập tin của Turbo Pascal
TURBO.EXE: Soạn thảo, dịch và liên kết chương trình theo menu TURBO.TPL: Tập tin thư viện, lưu các đơn vị chuẩn để chạy với TURBO.EXE
TINST.EXE: Cung cấp các tiện ích cho phép cài đặt các thông số của TURBO.EXE như màu chữ, màu nền, viền cửa sổ…
TPC.EXE: Trình biên dịch độc lập không thông qua TURBO.EXE TPMOVER.EXE: Chuyển các đơn vị chương trình tự tạo sang tập tin thư viện chuẩn TPL
README: tập tin văn bản chứa các thông tin của Turbo Pascal README.COM: Chương trình giới thiệu các hiểu biết sơ bộ trước khi sử dụng Turbo Pascal
GRAPH.TPU: Đơn vị đồ họa
TURBO.TPH: Cung cấp các giúp đỡ khi lập trình
*.BGI: Chứa các font màn hình
*.CHR: Chứa các font chữ trong chế độ đồ họa
b Tổ chức các tập tin trên đĩa
Dùng chương trình cài đặt INSTALL.EXE và trả lời từng câu hỏi của chương trình, các tập tin sẽ tự động bung ra ghi vào trong đĩa cứng Nếu sử dụng Turbo Pascal trên đĩa mềm thì tối thiểu phải có 2 tập tin TURBO.EXE và TURBO.TPL để chạy được chương trình
Trang 12Chương 1: Các thμnh phần cơ bản của ngôn ngữ lập trình Pascal 11
c Khởi động phần mềm Turbo Pascal
- Đưa hệ điều hành vào làm việc trên thư mục có tập tin TURBO.EXE
- Sau khi gõ vào câu lệnh trên và bấm phím Enter, chỉ độ vài giây
ta sẽ thấy xuất hiện trên màn hình:
+ Hàng trên cùng là những thực đơn chính của Pascal (Main Menu), gồm có các menu: File, Edit, Run, Compile, Option, Debug + Cửa sổ hình chữ nhật màu trắng ở giữa màn hình là những dòng
tự giới thiệu vắn tắt của TP7.0 Khi bấm Enter sẽ mất khung cửa sổ này để dành toàn bộ màn hình cho ta soạn thảo chương trình
1.3.5 Các bước cơ bản để chạy một chương trình Turbo Pascal
Bước 1: Khởi động Turbo Pascal
Với Turbo Pascal chạy trên môi trường DOS, chuyển địa chỉ làm việc đến thư mục chứa File TURBO.EXE và chạy file này Với Turbo Pascal chạy trên môi trường Windows, nháy đúp chuột tại biểu tượng Shortcut của Turbo Pascal hoặc khởi động từ nút lệnh Start/Programs/TPW rồi chọn biểu tượng TPW Khi đó xuất hiện màn hình soạn thảo với các file chương trình được mở ra là các file mà ta chưa đóng lại khi thoát khỏi Pascal ở lần chạy trước Nếu muốn ta có thể đóng các file đó lại và mở một file mới có tên NANAME00.PAS
Bước 2: Soạn thảo nội dung chương trình
a Các thao tác với file chương trình trong khi soạn thảo
F2: Ghi vào đĩa (SAVE)
F3: Mở file khác (LOAD)
Ctrl-F2: Ghi vào tên file khác
Directory: Danh mục file chương trình
OS Shell: Ra DOS tạm thời
Trang 13b Các kỹ năng soạn thảo (menu edit)
Ctrl-Y: Xóa cả dòng ký tự chứa con trỏ, các dòng ở dưới sẽ dồn lên Ctrl-Q-Y: Xóa phần cuối dòng kể từ con trỏ
Ctrl-K-Y: Xóa cả một khối ký tự
Ctrl-Q-F: Tìm kiếm một từ nào đó
Ctrl-Q-A: Tìm và thay thế một từ nào đó
Bước 3: Dịch thử, sửa lỗi cú pháp vμ chạy chương trình
Alt-F9: Biên dịch chương trình đang làm việc để kiểm tra các lỗi
Trang 14Chương 2: Các kiểu dữ liệu đơn giản chuẩn 13
Chương 2 CÁC KIỂU DỮ LIỆU ĐƠN GIẢN CHUẨN
2.1 Khái niệm về kiểu dữ liệu
Khái niệm kiểu dữ liệu trong Pascal cũng như các ngôn ngữ lập trình khác là rất quan trọng, nó xác định tập hợp giá trị mà biến có thể nhận Mô tả kiểu sẽ quy định loại giá trị của biến và cung cấp cho chương trình dịch những thông tin cần thiết Các kiểu dữ liệu trong Pascal như kiểu integer, real, char, boolean, byte được gọi là các kiểu dữ liệu đơn giản vì chúng là các dữ liệu không phân chia được nữa Như vậy, một kiểu dữ liệu được định nghĩa là một tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận được, trên đó xác định một
số phép toán Nói cách khác một kiểu dữ liệu là một tập hợp được quy
định về cấu trúc, khoảng giá trị, cách biểu diễn và các thao tác xử lý Dữ liệu trong Turbo Pascal được chia thành hai lớp lớn là kiểu dữ liệu đơn giản (Simple Type) và kiểu dữ liệu có cấu trúc (Structure Type) Kiểu dữ liệu biểu diễn một giá trị được gọi là kiểu dữ liệu đơn giản, bao gồm:
- Kiểu logic (Boolean)
- Kiểu số nguyên (Integer)
- Kiểu ký tự (Character)
- Kiểu vô hướng liệt kê (Enumerated scalar)
- Kiểu đoạn con (Subrage)
- Kiểu số thực (Real)
- Kiểu chuỗi ký tự (String)
Trang 15Năm kiểu đầu là kiểu dữ liệu đếm được (hay có thứ tự), chúng
được dùng làm chỉ số mảng và trong các toán tử điều khiển
Kiểu dữ liệu có cấu trúc bao gồm: Mảng, tập hợp, bản ghi và tệp
2.2 Kiểu logic (Boolean)
Một tập hợp Logic Boolean là một tập hợp chỉ có hai giá trị True (Đúng) hoặc False (Sai)
- Một dữ liệu thuộc kiểu logic là một đại lượng chỉ có thể nhận một trong hai giá trị logic True hoặc False
- Các phép toán có thể áp dụng trên kiểu logic: AND, OR, NOT, XOR Sau đây là bảng giá trị của các phép toán:
True True True True False False True False False True True False False True False True True True False False False False False True Các biểu thức quan hệ (so sánh) luôn cho kết quả kiểu Boolean
Có các phép toán quan hệ sau: <>, =, >=, <=, >, <
Hai vế của biểu thức so sánh phải cùng kiểu nhau (ngoại trừ kiểu
số thực và kiểu số nguyên) và chúng có thể là các kiểu: Real, Integer, Boolean, Char, vô hướng do người sử dụng định nghĩa
Giá trị False được coi là nhỏ hơn (đứng trước) True
2.3 Kiểu số nguyên (Integer)
- Trong toán học, số nguyên là tập hợp các số có giá trị nguyên từ
- ∞ ữ +∞ Nhưng do giới hạn biểu diễn của máy tính cũng như để tiết kiệm bộ nhớ nên Turbo Pascal cung cấp năm kiểu số nguyên được
định nghĩa với các từ khóa tương ứng với phạm vi biểu diễn của kiểu
Trang 16Chương 2: Các kiểu dữ liệu đơn giản chuẩn 15
và số Byte cần thiết để biểu diễn một giá trị thuộc kiểu số nguyên tương ứng
+ DIV: Chia lấy phần nguyên
+ MOD: Chia lấy phần dư
+ Hàm ODD(n): Kiểm tra tính chẵn lẻ của một số nguyên, cho kết quả là True nếu n là một số lẻ, False nếu n là một số chẵn
+ Các phép toán quan hệ (<>, =, >=, <=, >, <) có thể áp dụng cho các toán hạng là số nguyên và cho kết quả trả về kiểu Boolean
Chú ý: Khi thực hiện các phép tính số học đối với số nguyên, cần
hết sức thận trọng xem các phép toán đó có cho kết quả vượt khỏi phạm vi biểu diễn số nguyên của máy không Trong trường hợp quá giới hạn, máy có thể báo lỗi
- Phép toán chia "/" hai số nguyên cho kết quả là một giá trị thực Bởi vậy trong tập hợp các số nguyên không tồn tại phép chia, nhưng vẫn có thể có phép gán mà vế trái là một biến thực, còn vế phải là một biểu thức toán học chứa phép chia của hai số nguyên
2.4 Kiểu số thực (Real)
Tập hợp các số thực có giới hạn từ -∞ ữ +∞ và các giá trị của số thực lấp đầy trục số Mặc dù vậy do mục đích tiết kiệm bộ nhớ nên Turbo Pascal định nghĩa 5 kiểu số thực với giới hạn, khả năng biểu
Trang 17diễn số thực về độ chính xác và số lượng Byte cần thiết để biểu diễn một số thực khác nhau nhằm phục vụ cho người lập trình sử dụng tùy thuộc vào yêu cầu bài toán Các kiểu số thực bao gồm:
Kiểu Phạm vi biểu diễn Số chữ số có nghĩa Số Byte
Giải thích: Phạm vi biểu diễn của 4 kiểu đầu được hiểu như sau:
Giả sử lấy số thực Single làm ví dụ Máy có thể lưu trữ được một số kiểu Single có giá trị tuyệt đối trong khoảng từ 1.5*10-45 đến 3.4*1038
Số có giá trị tuyệt đối nhỏ hơn 1.5*10-45 được xem là bằng 0 Số có giá trị tuyệt đối lớn hơn 3.4*1038 không biểu diễn được trong máy Phạm
vi biểu diễn của các kiểu Real, Double, Extended được hiểu theo nghĩa tương tự
+ Các phép toán đối với số thực bao gồm: Cộng (+), Trừ (-), nhân (*), chia (/), khai căn (hàm SQRT), lũy thừa bậc hai (hàm SQR)
+ Các phép toán quan hệ (<>, =, >=, <=, >, <) có thể áp dụng cho các toán hạng là số thực và cho kết quả trả về giá trị kiểu Boolean
- Các hàm số học thường được dùng cho số nguyên và số thực: ABS(x): Lấy giá trị tuyệt đối, SQR(x): Lấy bình phương của x, SQRT(x): Lấy căn bậc hai của x
Một số thực bất kỳ có thể biểu diễn bằng tổng các số với mũ của 2:
i n
i i
Trang 18Chương 2: Các kiểu dữ liệu đơn giản chuẩn 17
Trong cách biểu diễn số thực dấu chấm động, một phần của từ máy
được dùng để lưu trữ một số cố định các bit của phần định trị, phần khác lưu trữ phần mũ Chẳng hạn số 2.1E2 là 210, 5.67E-1 là 0.567
2.5 Kiểu ký tự (Character)
Ký tự là tất cả các chữ viết mà ta thường dùng như các chữ cái, các chữ số, các dấu phân đoạn câu, Kiểu ký tự được định nghĩa trong Turbo Pascal với từ khóa CHAR Một giá trị kiểu ký tự là một phần tử của một tập hợp hữu hạn các ký tự được sắp xếp có thứ tự Có nhiều cách sắp xếp bộ chữ khác nhau Tuy vậy bộ mã được dùng phổ biến để trao đổi thông tin giữa các thiết bị, nhất là máy vi tính là bộ mã ASCII
(American Standard Code Information Interchange) Phép toán phổ
biến cho các ký tự là so sánh tuần tự (collating sequence)
Các ký tự được mã hóa bằng 1 Byte, vì vậy bảng mã ký tự có thể mã hóa 256 ký tự Tuy vậy số ký tự cơ bản nhất có thể gói gọn lại trong 128 số đầu tiên và được chuẩn hóa Còn 128 số sau (có số thứ tự
từ 128 đến 255) trên máy vi tính được gọi là phần mã mở rộng và được dùng để mã hóa các ký tự riêng của một số ngôn ngữ, các ký tự toán học, các ký tự đồ họa, có nhiều bảng mã khác nhau ở phần mở rộng Trong Turbo Pascal chúng ta quan tâm chủ yếu tới phần 128 ký tự đầu của bảng mã ASCII là phần chuẩn để xây dựng bộ ký tự cho ngôn ngữ lập trình
Mã của một ký tự chính là số thứ tự của nó trong bảng mã Ví dụ
ký tự A trong bảng mã ASCII có mã là 65, ký tự B trong bảng mã ASCII có mã là 66 Khi đó phép so sánh A>B sẽ cho kết quả sai
Trong bảng mã ASCII các ký tự từ 0 đến 31 là các ký tự điều khiển không in ra được Chúng dùng để điều khiển quá trình vào ra trên các thiết bị ngoại vi Ví dụ khi máy nhận được ký tự số 7 (BEL)
nó sẽ đánh một tiếng chuông Khi nhận được các ký tự số 13 (CR: Carriage Return) và số 10 (LF: Line Feed), thiết bị ngoại vi như màn hình và máy in sẽ chuyển điểm là việc (con trỏ màn hình, đầu kim in) xuống đầu dòng tiếp theo
Trang 19Các ký tự có vị trí trong bảng mã ASCCI từ 45 đến 57 là các chữ
số Các ký tự từ 65 đến 90 là các chữ cái hoa,
Để biểu diễn một ký tự có thể dùng một trong ba cách sau:
Cách 1: Biểu diễn hằng ký tự bằng cách đặt ký tự trong 2 dấu
Các hàm chuẩn liên quan đến kiểu ký tự:
Hàm chuẩn Ord(n): Cho số thứ tự của ký tự n trong bảng mã Hàm chuẩn Chr(n) hay #n: cho ký tự có số thứ tự là n
Hàm chuẩn Pred(ch): Cho ký tự đứng trước ch trong bảng mã Hàm chuẩn Succ(ch): Cho ký tự đứng sau ch trong bảng mã
Do quan hệ ORD('A') <ORD('C') là đúng nên ta có quan hệ 'A'<'C' là đúng (nhận giá trị TRUE)
Kiểu CHAR, INTEGER, BOOLEAN là kiểu có thứ tự Đối với kiểu
có thứ tự có thể sử dụng các hàm chuẩn ORD(x), PRED(x), SUCC(x)
Trang 20Chương 2: Các kiểu dữ liệu đơn giản chuẩn 19
Bài tập chương 2
Bμi 1: Viết các khai báo cho các yêu cầu sau:
a) x, y là biến thực
b) Biến k sẽ nhận các giá trị trong khoảng [0,255]
c) z, t là các biến nguyên trong khoảng [-32768, + 32767]
d) k, j, i là các biến có thể nhận các giá trị nguyên trong khoảng [0, 65535]
Trang 21Chương 3 CÁC KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC VÀ CÂU LỆNH
3.1 Hằng (Constant)
Hằng là các đại lượng có giá trị xác định và không thay đổi trong
suốt quá trình chạy chương trình Tương ứng với các kiểu dữ liệu trong
Pascal ta có các loại hằng số (nguyên, thực), hằng Boolean, hằng ký tự
(Char) và hằng chuỗi (String)
Các hằng (hằng số, hằng ký tự, hằng Boolean) được khai báo bằng
tên đặt trong phần khai báo Const ở đầu chương trình
Tên hằng = giá trị của hằng; hoặc Tên hằng = biểu thức hằng;
Biểu thức hằng là biểu thức mà các toán hạng của nó hoặc là giá
trị của hằng hoặc là tên hằng đã được khai báo trước đó
Một dòng khai báo hằng được kết thúc bằng dấu chấm phảy Tên
hằng được viết theo quy tắc viết tên đã trình bày ở chương 1
Trang 22Chương 3: Các khai báo hằng, biến, kiểu, biểu thức vμ câu lệnh 21
3.2 Biến (Variable)
Biến là một đại lượng có giá trị thay đổi Biến của chương trình là tên của ô nhớ cất giữ dữ liệu (còn gọi là biến tên hay danh hiệu của biến) Biến ghi nhớ một dữ liệu nào đó gọi là giá trị của biến Giá trị của biến có thể được làm thay đổi trong thời gian sử dụng biến Sự truy xuất một biến nghĩa là đọc giá trị hay thay đổi giá trị của biến được
thực hiện thông qua tên biến Ví dụ: Readln(x) Biến là một cấu trúc
để ghi nhớ dữ liệu vì vậy nó phải tuân theo quy định của kiểu dữ liệu: một biến phải thuộc một kiểu dữ liệu nhất định
Mỗi kiểu của biến quy định một vùng ô nhớ và vùng ô nhớ đó chỉ
có thể chứa được các giá trị của kiểu đã khai báo
Mọi biến sử dụng trong chương trình đều cần phải được khai báo
ở đầu chương trình sau từ khóa Var bằng cú pháp:
Var
Tên biến: Kiểu dữ liệu của biến;
Ví dụ:
Var
A: Real; Ten: String[20];
B,C: Interger; X: Boolean; Chon: Char;
Trong trường hợp khai báo nhiều biến có cùng kiểu thì các biến
được cách nhau bởi dấu phảy
Riêng với biến chuỗi, nếu khai báo như trên thì ta nói biến "Ten" chứa được một dãy không quá 30 ký tự Ta nói biến "Ten" có độ dài
30 Byte Độ dài của biến chuỗi cần không quá 255 Byte
Cũng như kiểu dữ liệu, biến được chia thành hai loại: Biến kiểu
đơn giản và biến có cấu trúc Biến kiểu đơn giản gồm các biến kiểu nguyên, thực, logic, ký tự, chuỗi, vô hướng liệt kê và đoạn con Biến
có cấu trúc gồm mảng, tập hợp, bản ghi và tệp
Trang 233.3 Định nghĩa kiểu dữ liệu mới
Ngoài các kiểu dữ liệu cơ sở đã được Pascal định nghĩa sẵn nên khi khai báo biến ta có thể dùng trực tiếp các kiểu dữ liệu này ngay Còn các kiểu dữ liệu khác ta phải định nghĩa ra, mô tả ra một cách tường minh trong phần khai báo của chương trình Pascal cho phép ta
định nghĩa các kiểu dữ liệu khác từ các kiểu căn bản theo quy tắc xây
dựng Pascal bằng cách sử dụng từ khóa Type Sau đó sẽ khai báo các
biến thuộc kiểu dữ liệu mới mô tả
Trang 24Chương 3: Các khai báo hằng, biến, kiểu, biểu thức vμ câu lệnh 23
Ví dụ 2: Để quản lý hồ sơ cán bộ cần quản lý các thuộc tính: họ
tên, tuổi, giới tính, chức vụ, phòng, lương Hãy định nghĩa kiểu dữ liệu NHANSU mô tả hồ sơ đó
Biểu thức là một công thức tính toán để có một giá trị theo một
quy tắc toán học nào đó Biểu thức (Expression) bao gồm: Toán tử
(Operator) và toán hạng (Operand) Toán tử được viết ra bằng dấu phép toán, toán hạng có thể là hằng, biến, hàm và các dấu ngoặc Các phần tử của biểu thức có thể được phân thành số hạng, thừa số, biểu thức đơn giản
Trang 25toán hạng trong biểu thức quan hệ có thể là các số nguyên, số thực, ký
tự và chúng phải tương thích với nhau về kiểu
Thứ tự ưu tiên: Khi tính giá trị của một biểu thức, ngôn ngữ lập trình Pascal quy ước thứ tự ưu tiên của các phép toán trình tự tính từ trái sang phải với thứ tự ưu tiên như sau:
Dấu ngoặc ( ) Biểu thức trong dấu ngoặc được ưu tiên nhất
Các hμm
Not, - (dấu trừ) Các phép toán một ngôi
*, /, DIV, MOD, AND Các phép tính loại nhân, cùng mức ưu tiên
+, -, OR, XOR Các phép tính loại cộng, cùng mức ưu tiên
=, <>, <=, >=, <, >, IN Các phép toán quan hệ có cùng mức ưu tiên
Kiểu của biểu thức là kiểu của kết quả sau khi tính biểu thức Kiểu của biểu thức là kiểu của kết quả sau khi tính biểu thức Quy định cách viết biểu thức: Pascal quy định mỗi biểu thức chỉ
được viết trên một dòng, ngoài các dữ liệu và dấu phép toán viết theo quy định, người lập trình chỉ được dùng các cặp dấu ngoặc tròn ()
sử dụng để viết biểu thức:
abs (x) Tính giá trị tuyệt đối của x sqrt(x) Tính căn bậc hai của x sqr(x) Tính bình phương của x
ln(x) Tính ln x sin(x) Tính sin x cos(x) Tính cos x
Trang 26Chương 3: Các khai báo hằng, biến, kiểu, biểu thức vμ câu lệnh 25
3.5 Câu lệnh (Statement)
Trong chương trình Pascal, sau phần mô tả dữ liệu là phần các câu lệnh của chương trình để xác định các công việc mà máy tính phải thực hiện để xử lý các dữ liệu đã được mô tả và khai báo Các câu lệnh cách nhau bằng dấu chấm phảy Câu lệnh được chia ra làm hai loại: Câu lệnh đơn giản và câu lệnh có cấu trúc
Câu lệnh đơn giản: Là những lệnh không chứa các lệnh khác Đó
là phép gán, lời gọi chương trình con loại Procedure (thủ tục), lệnh nhảy không điều kiện Goto
Lời gọi các chương trình con loại Procedure bao hàm rất nhiều quá trình xử lý khác nhau như:
- Vào dữ liệu: read, readln
- Ra dữ liệu: write, writeln
- Xử lý tập tin: reset, rewrite, assign
Câu lệnh có cấu trúc: Là khối lệnh, lệnh thử và rẽ nhánh, lệnh lặp
- Lệnh ghép: Begin End;
- Lệnh chọn: if then else ; case of
- Lệnh lặp: for to do , repeat until , while do
Mỗi câu lệnh của Pascal bao giờ cũng được đặt cách nhau bởi dấu chấm phảy (;) Dấu chấm phảy chỉ có tác dụng ngăn cách các câu lệnh chứ không phải là dấu kết thúc câu lệnh và nó không thuộc vào câu lệnh Turbo Pascal không bắt buộc phải viết mỗi câu lệnh trên một dòng Vấn đề là chúng ta phải trình bày chương trình sao cho đẹp, rõ ràng, thể hiện được thuật toán
3.6 Lệnh gán (assignment statement)
Một trong các lệnh đơn giản nhất của Pascal là lệnh gán
Dạng lệnh: Tên biến := biểu thức;
Trang 27Vế trái là biến nhận kết quả của biểu thức ở vế phải, biểu thức ở vế phải cho kết quả có kiểu trùng với kiểu dữ liệu của biến ở vế trái Vai trò của hai vế khác hẳn nhau dù vế phải cũng có thể là một tên biến
Ví dụ: Khi đã khai báo:
Lệnh ghép là một nhóm câu lệnh đơn đ−ợc đặt giữa hai chữ BEGIN
và END Một câu lệnh ghép có thể chứa cả lệnh ghép bên trong Các lệnh này đ−ợc thực hiện theo thứ tự nh− đã viết trong lệnh ghép
- Cách viết:
Begin
Trang 28Ch−¬ng 3: C¸c khai b¸o h»ng, biÕn, kiÓu, biÓu thøc vμ c©u lÖnh 27
LÖnh n;
End;
Chó ý r»ng b¶n th©n c©u lÖnh 1 còng lµ mét lÖnh ghÐp
CÊu tróc BEGIN END cña c©u lÖnh ghÐp cho ta thÊy râ h¬n tÝnh
cã cÊu tróc cña ng«n ng÷ Pascal: nhãm c¸c lÖnh thµnh tõng khèi Mét khèi lÖnh chØ cã mét ®Çu vµo vµ mét ®Çu ra
Trang 29g) 2cosx + 3siny h) x+ +y log y2
l) ln(y+1) - sinx m) xy +1
Bμi 2: ViÕt c¸c biÓu thøc quan hÖ sau b»ng ng«n ng÷ lËp tr×nh Pascal
a) a < x < b b) b2 - 4ac < 0
c) i > 10 hoÆc i < 5 d) D = 0 vµ D1 ≠ 0 hoÆc D3 ≠ 0 e) -12 ≤ t <7 f) a = 0 vµ b ≠ 0
Bμi 3: ChuyÓn c¸c biÓu thøc viÕt trong Pascal sau ®©y thµnh biÓu thøc
to¸n th«ng th−êng:
a) SQRT(b)- 4*a*c b) (a+b)/2/a
c) (a*a + b*b)/2*a d) (x+y)/(2*a)
Bμi 4: TÝnh vµ ®−a ra mµn h×nh gi¸ trÞ cña biÓu thøc sau ®©y:
Trang 30Ch−¬ng 3: C¸c khai b¸o h»ng, biÕn, kiÓu, biÓu thøc vμ c©u lÖnh 29
Trang 31Chương 4 THỦ TỤC NHẬP – XUẤT DỮ LIỆU
Trong đó: bt1, bt2, , btn có thể là biến, hàm, biểu thức, hằng
mà giá trị của chúng cần đưa ra màn hình
Các bt1, bt2, btn phải cách nhau bởi dấu phảy
Màn hình thông dụng nhất của máy vi tính gồm 25 dòng và 80 cột (mỗi dòng có thể chứa 80 ký tự) Tại mỗi thời điểm, màn hình có một
vị trí làm việc thể hiện ra dưới dạng một khối sáng hoặc một nét gạch nhấp nháy gọi là con trỏ hay điểm nhắc (Cursor)
Hai thủ tục đầu tuy cùng có tác dụng đưa giá trị của bt1, bt2, , btn
ra một dòng màn hình bắt đầu từ vị trí hiện tại của con trỏ, nhưng sau
đó hoạt động của chúng khác nhau Thủ tục thứ hai sẽ đưa con trỏ xuống đầu dòng tiếp theo, còn thủ tục đầu vẫn đặt con trỏ trên dòng hiện tại ở ngay sau giá trị của biểu thức cuối cùng
Thủ tục thứ ba được dùng để chuyển con trỏ về đầu dòngtiếp theo Các biểu thức có thể là: Kiểu nguyên, thực, Boolean và ký tự Nếu biểu thức là một hằng ký tự hay hằng chuỗi thì dữ liệu kiểu này phải
được đặt giữa hai dấu nháy đơn
Trang 32Chương 4: Thủ tục nhập - xuất dữ liệu 31
Khi dùng các thủ tục nêu trên, có hai cách viết để trình bày dữ liệu in ra, đó là cách viết không quy cách và cách viết có quy cách đối với từng kiểu dữ liệu
4.1.1 Đưa ra giá trị nguyên
+ Cách viết không quy cách: Write(I); Giá trị của biểu thức I được viết ra trên một số vị trí đúng bằng độ dài của nó
+ Cách viết có quy cách: Write(I:m); Giá trị của biểu thức I được viết ra trên ít nhất là m vị trí Khi độ dài của số nhỏ hơn m thì số được dồn về bên phải để tạo ra các khoảng trống bên trái
4.1.2 Đưa ra giá trị thực
+ Cách viết không quy cách: Write(R); Trong chế độ thông thường giá trị của biểu thức R được viết ra dưới dạng dấu phảy động trên 17 vị trí với 10 chữ số phần thập phân trong phần định trị
X.X XE±XX (đối với số dương)
-X.X XE±XX (đối với số âm)
Trong Mode 8087 số được in ra trên 23 vị trí với 14 chữ số phần thập phân trong phần định trị
X.XX XE±XXXX (đối với số dương)
-X.XX XE±XXXX (đối với số âm)
+ Cách viết có quy cách 1: Write(R:m); Đối với Mode thông thường giá trị của biểu thức R được viết ra dưới dạng dấu phảy động trên max(8,m) vị trí, trong đó có 2 ký tự để chỉ số mũ của R Trong Mode 8087, số được in ra trên max(10, m) vị trí trong đó có 4 chữ số
để biểu diễn số mũ trong cách biểu diễn của R
+ Cách viết có quy cách 2: Write(R:m:n); Giá trị của biểu thức R
được in ra trên ít nhất m vị trí, viết trong đó có n chữ số phần thập phân Khi còn dư thừa vị trí thì số được dồn về bên phải để tạo ra các khoảng trống bên trái
Trang 334.1.3 Đ−a ra giá trị kiểu Boolean
Việc đ−a ra giá trị kiểu Boolean có thể tiến hành theo hai cách giống nh− kiểu nguyên tức là:
+ Cách viết không quy cách: Write(OK); Giá trị của biểu thức OK
đ−ợc viết ra trên một số vị trí đúng bằng độ dài của nó
+ Cách viết có quy cách: Write(OK:m); Giá trị của biểu thức OK
đ−ợc viết ra trên ít nhất là m vị trí Khi độ dài của OK nhỏ hơn m thì
OK đ−ợc dồn về bên phải để tạo ra các khoảng trống bên trái
Trang 34Chương 4: Thủ tục nhập - xuất dữ liệu 33
4.1.5 Đưa dữ liệu ra máy in
Để đưa dữ liệu ra máy in, ta vẫn dùng các thủ tục Write và Writeln nhưng viết thêm tham số LST và dấu phảy vào trước các giá trị các biến cần in ra Tất cả những kiểu cách đưa dữ liệu ra màn hình vẫn còn đúng khi đưa ra máy in
Biến LST được khai báo trong Unit Printer vì vậy cần khai báo UNIT này ở đầu chương trình sau từ khóa USES
Writeln(LST, X1, , Xn); Đưa giá trị của các biến X1, , Xn ra
Read(X1, X2, Xn);
Readln(X1, X2, Xn);
Các thủ tục trên cho phép nhập dữ liệu từ bàn phím gán cho các
đối số X1, X2, , Xn Trong đó X1, X2, , Xn có thể là các biến (hay phần tử mảng) nguyên, thực, ký tự, hoặc chuỗi Các dữ liệu gõ vào từ bàn phím được cách nhau bởi dấu cách với số lượng dấu cách không
Trang 35quan trọng, song ít nhất phải là một được dùng để ngăn cách các số liệu khi đọc
Trong khi đọc dữ liệu, thủ tục này còn kiểm tra xem các dữ liệu
gõ vào có tương thích với kiểu dữ liệu của biến hay không Từ Version 4.0 trở đi, nếu ta chưa gõ dữ liệu tương ứng cho các biến trong thủ tục Readln thì máy sẽ vẫn tiếp tục chờ, cho dù đã gõ phím Enter nhiều lần Kết thúc việc nhập dữ liệu nhấn phím Enter Thủ tục này cũng cho phép nhập dữ liệu từ File, nhưng sau mỗi lần thực hiện lệnh, con trỏ sẽ tiếp tục chuyển xuống dòng tiếp theo của File để đọc dữ liệu thuộc dòng dưới ngay cả khi tại dòng đó vẫn còn dữ liệu chưa được đọc Khi gặp các câu lệnh này, máy dừng để đợi nạp số liệu Quy tắc thu nhận ký tự của từng kiểu biến như sau:
- Mỗi phím sẽ cho một ký tự, riêng phím Enter cho 2 ký tự: CR (mã 13) và LF (mã 10)
- Biến số (nguyên, thực) bỏ qua CR, LF và dấu cách (Space) Sau khi đã nhận được một chữ số thì nhấn phím Space hoặc Enter sẽ kết thúc việc nhận số liệu của biến số Các ký tự do phím này tạo ra sẽ dành cho biến tiếp theo
Chú ý: Biến nguyên chỉ nhận được dãy ký tự biểu diễn các giá trị
nguyên trong phạm vi biểu diễn của nó Với biến kiểu số, máy chỉ ra khỏi lệnh này khi đã bấm một số ký tự đủ để cung cấp giá trị cho tất cả các biến và phải bấm thêm phím Enter Các ký tự thừa sẽ bị bỏ qua (không được xét đến trong các thủ tục Readln hay Read tiếp theo)
- Biến ký tự (char) chỉ nhận đúng một ký tự Các ký tự còn lại dành cho biến tiếp theo
- Biến chuỗi nhận được một số ký tự không vượt quá độ dài của
nó Các ký tự còn lại dành cho biến tiếp theo Phím Enter kết thúc việc nhận số liệu của một dãy liên tiếp các biến chuỗi Biến nào chưa kịp nhận gì sẽ chứa xâu rỗng Các ký tự do phím Enter phát ra sẽ dành cho biến số hoặc biến ký tự đứng ngay sau dãy các biến chuỗi nói trên
Trang 36Chương 4: Thủ tục nhập - xuất dữ liệu 35
Chú ý: Thủ tục Read(X1, X2, Xn) chỉ khác thủ tục Readln(X1,
X2, Xn) ở một điểm là: Các giá trị nạp từ bàn phím sau khi đã lần lượt gán cho các đối số X1, X2, Xn thì các ký tự dư thừa sẽ dành lại cho thủ tục Read hay Readln tiếp theo
Ghi chú: Việc dùng thủ tục Read(X1, X2, Xn) cũng như dùng
nhiều kiểu biến trong thủ tục Readln(X1, X2, Xn) thường dẫn tới những tình huống rắc rối Bởi vậy để việc nạp dữ liệu được chính xác chỉ nên dùng thủ tục Readln(X1, X2, Xn) Và trong một thủ tục chỉ nên dùng một biến kiểu String hoặc một biến kiểu Char, chỉ dùng nhiều biến với kiểu số nguyên và thực
Readln: Dừng chương trình, đợi phím Enter mới tiếp tục
Hàm ReadKey: Hàm này buộc máy tạm dừng để đợi nhận một ký
tự từ bàn phím Không cần bấm Enter trong trường hợp này để xác nhận, ký tự được nhập vào không hiển thị lên màn hình
Hàm Keypressed: Hàm này có kiểu Boolean, cho giá trị là True
nếu có một phím được bấm và False nếu ngược lại Ký tự được bấm không hiển thị lên màn hình nhưng có thể nhận được nhờ một hàm Readkey viết sau hàm Keypressed
Trang 37Bài tập chương 4
Bμi 1: Viết chương trình nhập họ và tên, bậc lương, ngày công trong
tháng, phụ cấp, hệ số trách nhiệm, tạm ứng In ra màn hình họ tên, tiền lương và tiền còn được lĩnh; biết rằng công thức được tính toán như sau:
Tiền lương = Bậc lương/30 * Ngày công * Hệ số trách nhiệm + Phụ cấp
Tiền còn được lĩnh = Tiền lương - Tạm ứng
Bμi 2: Viết chương trình nhập vào chu vi của một hình chữ nhật, sau
đó tính diện tích lớn nhất mà hình chữ nhật đó có thể có được; biết rằng trong các hình chữ nhật có chu vi bằng nhau thì hình vuông có diện tích lớn nhất
Bμi 3: Viết các chương trình nhập vào hai số nguyên không có 3 chữ
số, rồi in kết quả phép tính nhân hai số đó theo dạng:
Bμi 5: Viết chương trình nhập x từ bàn phím, tính và đưa ra màn hình
giá trị của biểu thức sau:
Trang 38Chương 5: Kiểu vô hướng liệt kê vμ kiểu khoảng con 37
Chương 5 KIỂU Vễ HƯỚNG LIỆT Kấ
VÀ KIỂU KHOẢNG CON
5.1 Kiểu vô hướng liệt kê (Enumerated scalar type)
Ngôn ngữ lập trình Turbo Pascal đã cung cấp các kiểu dữ liệu cơ
sở là Số nguyên, Số thực, Boolean, và Char Một kiểu dữ liệu vô hướng
có thể được định nghĩa như là một tập hợp các giá trị được sắp xếp theo một thứ tự tự nhiên Một biến khi được khai báo là kiểu vô hướng nào đó có thể nhận một giá trị trong tập các giá trị đó Ví dụ như kiểu Boolean có thể được định nghĩa như là một tập gồm hai giá trị là FALSE và TRUE, trong đó FALSE có thứ tự nhỏ hơn TRUE
Turbo Pascal còn cho phép người lập trình có thể tự định nghĩa ra các kiểu vô hướng mới bằng cách liệt kê các giá trị của kiểu vô hướng mới thông qua các tên do người lập trình đặt ra Danh sách các giá trị này được đặt trong ngoặc đơn và được mô tả bằng một tên kiểu trong phần mô tả kiểu (phần Type) Kiểu vô hướng định nghĩa theo cách này
được gọi là kiểu liệt kê
Kiểu liệt kê được định nghĩa bằng cách liệt kê tất cả các giá trị có thể có theo mẫu khai báo:
TYPE Tên_kiểu = (Tên1, Tên2, Tênk);
Ví dụ:
TYPE
Color = (Red, Blue, Green, White, Black);
Xedap = (Eska, Peugeot, Phuong_hoang, Thong_nhat);
Trang 39Một biến vô hướng có thể định nghĩa thông qua các kiểu đã được mô tả trong phần Type như sau:
Ngày: (Chủ nhật, Hai, Ba, Tư, Năm, Sáu, Bảy);
Do tính tương thích, một biến được định nghĩa là kiểu này sẽ không thể nhận giá trị của kiểu khác
Trong định nghĩa của kiểu vô hướng tồn tại một thứ tự tuyến tính theo thứ tự liệt kê và phần tử đầu tiên có số thứ tự là 0 Các hàm chuẩn sau đây được áp dụng cho kiểu vô hướng:
- Hàm thứ tự ORD(X): Cho ta số thứ tự của X trong kiểu vô hướng
đếm được Hàm ORD thực chất là hàm biến đổi một giá trị kiểu vô hướng đếm được sang giá trị kiểu số nguyên Thông qua hàm ORD có thể so sánh hai giá trị vô hướng đếm được có cùng kiểu: Giá trị có số thứ tự nhỏ sẽ nhỏ hơn giá trị có số thứ tự lớn hơn Nghĩa là thứ tự liệt
kê khi định nghĩa kiểu vô hướng cũng chính là thứ tự sắp xếp từ nhỏ
đến lớn
- Hàm PRED(X): Cho giá trị đứng trước X trong định nghĩa kiểu của X
- Hàm SUCC(X): Cho giá trị tiếp theo của X
Ví dụ: Ord(Green) = 2; Pred(Green) = Blue; Succ(Green) = White
là các phép so sánh đúng
Chú ý:
Thủ tục Write hoặc Writeln chỉ chấp nhận đưa ra các giá trị thuộc kiểu vô hướng chuẩn và không thể viết ra một giá trị vô hướng thuộc
Trang 40Chương 5: Kiểu vô hướng liệt kê vμ kiểu khoảng con 39
kiểu liệt kê Muốn viết tên giá trị của biến vô hướng liệt kê, ta có thể
áp dụng thủ thuật sau:
IF Mau = Black Then Writeln('Black');
Thủ tục Read và Readln cũng chỉ cho phép đọc vào từ bàn phím các giá trị của các biến có kiểu vô hướng chuẩn Chúng cũng không cho phép đọc trực tiếp các giá trị kiểu liệt kê Có thể dùng phương pháp sau:
Đọc số thứ tự của giá trị biến vô hướng rồi biến đổi kiểu dữ liệu
5.2 Kiểu khoảng con (Sub-range Type)
Trong Pascal kiểu vô hướng bao gồm: kiểu Real là kiểu không
đếm được, các kiểu còn lại là kiểu đếm được hay kiểu có thứ tự
Trong nhiều trường hợp một biến chỉ lấy giá trị trong một khoảng
được xác định bởi giá trị giới hạn dưới và giá trị giới hạn trên thuộc một kiểu vô hướng đếm được nào đó Chẳng hạn, tuổi thọ của người có thể được giới hạn từ 0 đến 200
Khi đó ta có thể định nghĩa ra kiểu khoảng con như sau: