Giáo trình Pascal
GIỚI THIỆU NGÔN NGỮ PASCAL VÀ BORLAND PASCAL 7.0
GIỚI THIỆU NGÔN NGỮ PASCAL
Giáo sư Niklaus Wirth tại Đại học Kỹ thuật Zurich, Thụy Sĩ, đã phát triển ngôn ngữ lập trình Pascal vào đầu những năm 1970 để phục vụ việc giảng dạy sinh viên, lấy tên để tưởng nhớ nhà toán học Blaise Pascal.
Pascal là một ngôn ngữ lập trình có cấu trúc thể hiện trên 3 phương diện.
Dữ liệu được phân loại thành kiểu đơn giản và kiểu dữ liệu có cấu trúc, cho phép xây dựng các kiểu dữ liệu phức tạp từ các kiểu dữ liệu đơn giản hơn.
- Về mặt câu lệnh: Từ các câu lệnh đơn giản và lệnh có cấu trúc ta có thể xây dựng các câu lệnh hợp thành.
- Về mặt chương trình: Một chương trình có thể chia làm nhiều chương trình con.
Standard Pascal, ban đầu là ngôn ngữ lập trình đơn giản phục vụ giảng dạy, đã phát triển thành ngôn ngữ mạnh mẽ nhờ những ưu điểm vượt trội.
Từ Pascal chuẩn ban đầu, đã được nhiều công ty phần mềm cải tiến với nhiều thêm bớt khác nhau.
TURBO PASCAL, sản phẩm của Borland, nổi tiếng toàn cầu nhờ tốc độ nhanh và những cải tiến vượt trội so với Pascal chuẩn, đáp ứng hiệu quả nhu cầu người dùng.
Turbo Pascal 4.0 và các phiên bản sau tích hợp Units, cho phép biên dịch sẵn các module, rút ngắn thời gian lập trình, tăng tính dễ hiểu và hiệu quả của mã nguồn.
Turbo Pascal 5.5 (1989) trở đi tích hợp kiểu dữ liệu Object, cho phép kết hợp mã lệnh và dữ liệu Ngôn ngữ này nổi bật với thư viện đồ họa mạnh mẽ và cú pháp tương tự được kế thừa bởi Delphi.
Turbo Pascal 7.0, phiên bản cuối cùng của Borland, hỗ trợ lập trình hướng đối tượng nhưng gặp lỗi "Divide by zero" trên máy có xung nhịp >300 MHz, khắc phục bằng cách cập nhật TURBO.TPL hoặc dùng Free Pascal Do chạy ở chế độ thực (real mode), Turbo Pascal trên Windows XP dễ gây khởi động lại máy; nên sử dụng Borland Pascal để chạy trong môi trường DOS giả lập, đảm bảo đa nhiệm.
1 Gói phần mềm này có thể download miễn phí từ Internet (từ khóa: Free Pascal) hoặc hỏi chép từ Tổ bộ môn CNTT.
SỬ DỤNG PASCAL 7.0
Để chạy chương trình Turbo Pascal, máy tính cần được cài đặt phần mềm này trước Sau khi cài đặt, bạn có thể khởi động Turbo Pascal để bắt đầu lập trình.
- Từ MS-DOS: Đảm bảo rằng thư mục hiện hành đúng vị trí cài đặt (hoặc dùng lệnh PATH) Turbo Pascal Ta đánh vào TURBO rồi Enter.
Để chạy Turbo Pascal trên Windows mà không bị thoát ra MS-DOS, hãy giả lập chế độ MS-DOS cho file TURBO.EXE hoặc shortcut của nó Truy cập thuộc tính file (nhấp chuột phải, chọn Properties), vào thẻ Program và tích chọn tùy chọn "Run in MS-DOS mode".
Chọn OK trên các hộp thoại, sau đó khởi động Turbo Pascal, màn hình soạn thảo sau khi khởi động TURBO PASCAL như dưới đây xuất hiện.
Click vào đây và chọn như hình dưới
Cài đặt và sử dụng Borland Pascal 7.0:
Cài đặt Borland Pascal từ thư mục BP70 bằng file INSTALL.EXE Sau cài đặt (thường tại C:\BP), cập nhật file Turbo.tpl trong thư mục C:\BP\BIN bằng file cùng tên từ \BP70\Huongdan\ Chạy Borland Pascal bằng file BP.exe (trong C:\BP\BIN) thay vì Turbo.exe; thao tác sử dụng tương tự Turbo Pascal.
2.Các Thao Tác Thường Sử Dụng Trên Turbo Pascal
Phím F3 trong Turbo Pascal dùng để tạo tập tin mới hoặc mở tập tin đã lưu Người dùng nhập tên và đường dẫn; nếu tập tin tồn tại, Turbo Pascal sẽ mở nó; ngược lại, Turbo Pascal sẽ tạo một tập tin mới với tên đã chỉ định.
Để lưu tập tin, nhấn F2 Thoát chương trình chưa lưu sẽ hiện cảnh báo; chọn Yes (Y) để lưu, No (N) để không lưu.
Một số phím thông dụng của TURBO PASCAL 7.0
Biểu tượng Tên phím Diễn giải
Enter Đưa con trỏ xuống dòng.
Up Đưa con trỏ lên 1 dòng.
Down Đưa con trỏ xuống 1 dòng.
Left Đưa con trỏ qua trái một ký tư.
Right Đưa con trỏ qua phải một ký tự.
Home Home Đưa con trỏ về đầu dòng.
End End Đưa con trỏ về cuối dòng.
Pg Up Page Up Lên một trang màn hình.
Pg Down Page Down Xuống một trang màn hình.
Del Delete Xoá ký tự tại vị trí con trỏ.
Back BackSpace Xoá ký tự trước con trỏ.
Insert Insert Thay đổi chế độ viết xen hay viết chồng.
F1 F1 Gọi chương trình giúp đở.
F3 F3 Tạo mới hoặc mở tập tin.
F4 F4 Thực thi chương trình đến dòng chứa con trỏ.
F6 F6 Chuyển đổi các cửa sổ.
F7 F7 Chạy từng dòng lệnh (hàm xem như một lệnh).
F8 F8 Chạy từng dòng lệnh đơn.
F9 F9 Kiểm tra lỗi chương trình.
Tổ hợp Alt + F9 Biên dịch chương trình.
Tổ hợp Ctrl + F9 Chạy chương trình.
Tổ hợp Ctrl + N Thêm 1 dòng trước con trỏ.
Tổ hợp Ctrl + Y Xoá một dòng tại con trỏ.
Tổ hợp Ctrl + K + B Đánh dấu đầu khối.
Tổ hợp Ctrl + K + K Đánh dấu cuối khối.
Tổ hợp Ctrl + K + C Sao chép khối.
Tổ hợp Ctrl + K + V Di chuyển khối.
Tổ hợp Ctrl + K + Y Xoá khối.
Trong Borland Pascal các thao tác khối đơn giản và dễ hơn như sau:
+ Đánh dấu khối: SHIFT + (phím mũi tên)
+ Copy khối vào clipboard: CTRL+ Ins (phím Insert)
+ Dán khối (đã copy vào clipboard) vào vị trí mới: SHIFT+ Ins
Tổ hợp Ctrl + K + W Ghi khối lên đĩa thành một tập tin (nội dung của tập tin là khối đã chọn).
Tổ hợp Ctrl + K + R Xen nội dung một tập tin (từ đĩa) vào sau vị trí con trỏ.
Tổ hợp Ctrl + K + H Tắt/Mở đánh dấu khối.
Tổ hợp Ctrl + F4 Kiểm tra giá trị biến khi chạy chương trình.
Tổ hợp Alt + X Thoát khỏi chương trình.
CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ PASCAL
1.Bộ Chữ Viết – Từ Khoá – Tên a Bộ chữ viết
Bộ chữ trong Pascal bao gồm 26 chữ cái Latin in hoa (A-Z), 26 chữ cái Latin thường (a-z), dấu gạch dưới (_), chữ số 0-9, các ký hiệu toán học (+, -, *, /, =, , (), các ký hiệu đặc biệt ( , : ; [ ] ? % @ \ | ! # $ { }), và dấu khoảng trắng.
Từ khóa Pascal là những từ dành riêng, không được dùng làm tên biến, kiểu dữ liệu hay hàm Một số từ khóa Pascal bao gồm: (nêu ví dụ từ khóa nếu có).
External File For Forward Function Goto
Mod Nil Not Object Of Or
ShrStringThenToTypeUnit
Packed Procedure Program Record Repeat Set Shl
Until Uses Var Virtual While With Xor c Tên
Tên hay còn gọi là danh biểu (identifier) dùng để đặt cho tên chương trình, hằng, kiểu, biến, chương trình con…tên được chia thành 2 loại.
- Tên chuẩn đã được PASCAL đặt trước, chẳng hạn các hàm số SIN, COS, LN,… hằng số PI, kiểu INTEGER, BYTE, REAL…
Tên người dùng tùy chỉnh, sử dụng chữ cái, số và dấu gạch dưới Tên bắt đầu bằng chữ cái hoặc dấu gạch dưới, tiếp theo là chữ cái hoặc số.
Không có khoảng trống ở giữa tên.
Không được trùng với từ khoá.
Độ dài tối đa của tên là 127 ký tự, tuy nhiên cần đặt sao cho tên gọn và có ý nghĩa.
Pascal không bắt lỗi việc đặt tên trùng với tên chuẩn, nhưng khi đó ý nghĩa của tên chuẩn không còn giá trị nữa.
Pascal không phân biệt chữ hoa chữ thường trong từ khóa, tên chuẩn hay tên biến Viết thống nhất tên trong chương trình giúp tránh nhầm lẫn khi chuyển sang ngôn ngữ lập trình phân biệt chữ hoa chữ thường như C.
2.Hằng – Kiểu – Biến a Hằng (Constant)
Hằng là một đại lượng không đổi trong quá trình thực hiện chương trình Có hai loại hằng là hằng chuẩn và hằng do người dùng định nghĩa.
Pascal cung cấp các hằng số định sẵn như PI, RED (mã màu), nằm trong các Unit Người dùng có thể sử dụng trực tiếp mà không cần khai báo lại, tham khảo hướng dẫn (help) của từng Unit để biết danh sách hằng số.
- Hằng do người dùng định nghĩa thông qua việc khai báo Cú pháp:
CONST = ;
[ = ;]
Kiểu dữ liệu xác định tập giá trị của biến và phép toán áp dụng lên chúng Có hai loại kiểu dữ liệu chính: kiểu chuẩn và kiểu do người dùng định nghĩa.
- Kiểu chuẩn là kiểu Pascal định nghĩa sẵn: REAL, INTEGER, CHAR…
- Kiểu do người lập trình định nghĩa thông qua việc khai báo kiểu Cú pháp:
Ví dụ: TYPE NguyenDuong = 1 MaxInt;
Biến là ô nhớ trong máy tính, lưu trữ giá trị thay đổi trong quá trình thực hiện chương trình và được giải phóng khi chương trình kết thúc.
Chương trình quản lý biến thông qua tên biến và mỗi biến tương ứng với một kiểu dữ liệu nhất định.
Biến trước khi sử dụng phải được khai báo Cú pháp:
I, J: NguyenDuong; {Đã định nghĩa trước}
3.Biểu Thức – Dấu Chấm Phẩy – Lời Giải Thích a Biểu thức
Là một phần của câu lệnh bao gồm hằng, biến, hàm được liên kết với nhau bằng các phép toán và các dấu ngoặc đơn ( ).
Thứ tự tính toán trong biểu thức: ngoặc trong trước, ngoặc ngoài sau; nhân chia trước, cộng trừ sau; cùng mức ưu tiên, tính từ trái sang phải.
2 Lưu ý: Trong lập trình hai biểu thức (x*y/z) và (x/z*y) không phải bao giờ cũng cho cùng kết quả.
VAR []: ;
[[]: ;] o Riêng đối với biểu thức gán thì thứ tự thực hiện là từ phải qua trái. b Dấu chấm phẩy
Dấu chấm phẩy (;) dùng để ngăn cách giữa các câu lệnh Sau một câu lệnh phải có dấu chấm phẩy (trừ một vài trường hợp đặt biệt).
Ví dụ: Write(‘Nhap so a:’); Readln(a); c Lời giải thích
Viết chú thích trong lập trình giúp người đọc hiểu rõ hơn chức năng của đoạn mã mà không ảnh hưởng đến quá trình thực thi Chú thích được đặt trong cặp dấu `{}` hoặc `(* *)`.
Ví dụ: {Day la phan giai thich}
4.Cấu Trúc Của Một Chương Trình Pascal
Chương trình Pascal cấu trúc gồm hai phần: khai báo và thân chương trình Thân chương trình được thực thi tuần tự từ trên xuống, trừ khi gặp câu lệnh điều khiển (rẽ nhánh hoặc lặp).
Phần khai báo chương trình Pascal bao gồm: tên chương trình (PROGRAM), khai báo sử dụng unit (USES), khai báo nhãn (LABEL), khai báo hằng (CONST), khai báo kiểu dữ liệu (TYPE), khai báo biến (VAR) và khai báo chương trình con (được trình bày sau) Tiếp theo là phần thân chương trình.
Bắt đầu bằng từ khoá BEGIN và kết thúc bằng từ khoá END (end và dấu chấm) Giữa BEGIN và END là các câu lệnh.
{Các câu lệnh viết ở đây}
CÁC KIỂU VÔ HƯỚNG CHUẨN VÀ CÁC CÂU LỆNH ĐƠN
CÁC KIỂU VÔ HƯỚNG CHUẨN
1.Các Kiểu Vô Hướng Chuẩn (Standard scalar types)
Kiểu vô hướng (scalar) trong Pascal là kiểu dữ liệu có tập giá trị sắp xếp tuyến tính Các kiểu vô hướng chuẩn có miền giá trị và kích thước bộ nhớ được định nghĩa sẵn.
Stt Kiểu Kích thước Miền xác định
2 Char 1 byte 256 ký tự của bảng mã ASCII.
Trong đó 7 kiểu đầu gọi là kiểu đếm được (ordinal type), còn các kiểu sau là không đếm được.
2.Một Số Phép Toán Trên Các Kiểu a Các phép toán trên kiểu số
Các phép toán này rất gần gũi với chúng ta, do chúng ta sử dụng chúng hằng ngày trong đời sống.
Phép toán Ý nghĩa Kiểu đối số Kiểu trả về Ví dụ
− Lấy đối số Số nguyên, số thực Giống đối số Đối số của 2 là -2 + Cộng Số nguyên, số thực Giống đối số 10 + 9 19
− Trừ Số nguyên, số thực Giống đối số 10 - 9 1
* Nhân Số nguyên, số thực Giống đối số 10*9 90
/ Chia Số nguyên, số thực Số thực 10 / 4 2.5
Div Chia lấy phần nguyên Số nguyên Số nguyên 10 div 3 3
Mod Chia lấy phần dư Số nguyên Số nguyên 10 mod 3 1 b Một Số Hàm Số
Pascal cung cấp nhiều hàm tích hợp sẵn, người dùng có thể trực tiếp sử dụng mà không cần khai báo unit.
Hàm Ý nghĩa Kiểu đối số Kiểu trả về Ví dụ
ABS(x) Trị tuyệt đối x Số nguyên, số thực Giống đối số Abs(-2) 2 SQR(x) Bình phương x Số nguyên, số thực Giống đối số Sqr(2) 4
SQRT(x) Căn bậc hai x Số nguyên, số thực Số thực Sqrt(9) 3 EXP(x) Hàm e x Số nguyên, số thực Số thực Exp(3) e 3
LN(x) Hàm log e x Số nguyên, số thực Số thực Ln(2) log 2 e
Các hàm lượng giác sin(x), cos(x) và arctan(x) nhận giá trị số thực khi đầu vào là số nguyên hoặc số thực Cụ thể, sin(π) = 0, cos(π) = -1 và arctan(1) = π/4.
SUCC(x) Succ(x) x + 1 Số nguyên Số nguyên
PRED(x) Pred(x) x −1 Số nguyên Số nguyên
ROUND(x) Làm tròn Số thực Số nguyên Round(8.6) 9
TRUNC(x) Làm tròn Số thực Số nguyên Trunc(8.6) 8
ORD(x) Lấy mã ASCII Ký tự Số nguyên Ord(‘a’) 97
CHR(x) ký tự mã ASCII Số nguyên Ký tự Chr(65) ‘A’
ODD(x) Kiểm chẳn lẽ Số nguyên Logic Odd(5) True c Các phép toán logic
Phép toán logic chỉ hoạt động với toán hạng kiểu Boolean, cho kết quả là TRUE hoặc FALSE.
Toán tử logic (AND, OR, XOR, NOT) hoạt động trên kiểu dữ liệu Boolean và trả về kết quả kiểu Boolean Bảng chân trị minh họa rõ ràng hoạt động của các toán tử này.
Các phép toán logic áp dụng được cho số nguyên, dựa trên biểu diễn nhị phân Ví dụ, với X=10 (0000 1010) và Y=22 (0001 0110), phép toán thực hiện từng bit.
3 Thật ra chúng thuộc về Unit SYSTEM.TPU
X Toán hạng Y X OR Y X AND Y X XOR Y NOT X
FALSE FALSE FALSE FALSE FALSE TRUE
FALSE TRUE TRUE FALSE TRUE TRUE
TRUE FALSE TRUE FALSE TRUE FALSE
TRUE TRUE TRUE TRUE FALSE FALSE
Vậy (10 AND 22) cho kết quả là 2
Vậy (10 OR 22) cho kết quả là 30
Vậy (10 XOR 22) cho kết quả là 28
Hai phép toán bit quan trọng khác là SHIFT LEFT (SHL) và SHIFT RIGHT (SHR) SHL dịch trái các bit, thêm giá trị vào bên phải SHR dịch phải các bit.
0 vào các bit tận cùng bên phải Cú pháp:
SHL
X SHL 1 0 0 0 1 0 1 0 0 {Đẩy về bên trái 1 bit}
X SHL 2 0 0 1 0 1 0 0 0 {Đẩy về bên trái 2 bit}
Vậy (10 SHL 1) cho kết quả 20
(10 SHL 2) cho kết quả 40Thực hiện tương tự đối với phép toán SHR
CÂU LỆNH
1.Khái Niệm Về Một Câu Lệnh
Câu lệnh trong lập trình chỉ định tác vụ xử lý dữ liệu đã được khai báo, các câu lệnh được phân tách bằng dấu chấm phẩy (;) Dấu chấm phẩy là dấu phân cách, không phải thành phần của câu lệnh.
Writeln(‘Nhap vao day mot so nguyen:’); {Thông báo nhập liệu}
Readln(SoNguyen); {Chờ nhập liệu}
Writeln(‘Binh phuong cua no la: ’,SoNguyen*SoNguyen); {Kết xuất}
Trong Pascal, nhóm nhiều câu lệnh thành một khối duy nhất bằng cách đặt chúng giữa `BEGIN` và `END`, giúp xử lý chúng như một câu lệnh đơn.
Câu lệnh có cấu trúc gồm các loại: rẽ nhánh, điều kiện chọn lựa và lặp Mỗi câu lệnh có cấu trúc tương đương một câu lệnh đơn nhưng có thể chứa nhiều câu lệnh hợp thành bên trong.
Writeln(‘Cho biet so tuoi:’); Câu lệnh đơn.
Readln(Tuoi); Câu lệnh đơn
Writeln(‘Ban con be qua Chua phuc vu duoc’)
Write(‘ Ban chon mon an nao:’);
Câu lệnh hợp thành từ hai câu lệnh đơn Câu lệnh có cấu trúc, xem như một câu lệnh đơn.
Writeln(‘Xin cho doi it phut!’); Câu lệnh đơn.
2.Một Số Lệnh Đơn a Lệnh gán
Lệnh gán trong lập trình dùng để gán giá trị của biểu thức cho biến, thực hiện từ phải sang trái Cú pháp và ví dụ minh họa cho lệnh gán được trình bày tiếp theo.
Cú pháp: :=
Tại vị trí này, x = 1; y ban đầu bằng 2 và sau khi gán y = 3.
Z có giá trị là 4 sau khi thực hiện phép gán
- Khi một giá trị gán cho biến, nó sẽ thay thế giá trị cũ mà biến đã lưu giữ trước đó (biến sẽ nhận giá trị mới).
Trong Pascal, lệnh gán yêu cầu kiểu dữ liệu hai vế phải trùng khớp; nếu không, lỗi "Type Mismatch" xuất hiện Để hiển thị dữ liệu, Pascal dùng `Write`, `Writeln` (xuất dữ liệu kèm xuống dòng), và `Writeln` (xuất dòng trống).
Hàm `Write` hỗ trợ hiển thị nhiều kiểu dữ liệu: biến (ví dụ: `Write(i, j)`), biểu thức (`Write(-c / (2*a))`), hằng số (`Write(PI)`), giá trị kiểu dữ liệu chuẩn (`Write(19, 29, True, 'a')`), và chuỗi văn bản (`Write('How are you?')`) Các mục cần hiển thị (Mục1, Mục2,…,MụcN) có thể là một trong các kiểu dữ liệu này.
`Writeln` là lệnh xuống dòng trong Pascal `Writeln(Mục1, Mục2,…,Mụcn)` di chuyển con trỏ đến đầu dòng kế tiếp, tương đương với `Begin Write(Mục1, Mục2,…,Mụcn); Writeln; End;`
- Viết kiểu số nguyên ã Viết khụng qui cỏch : Cỏc số nguyờn sẽ được viết ra với số chỗ đỳng bằng với số chữ số mà nó cần có.
Để định dạng số nguyên, ta sử dụng cú pháp `:số_chỗ`, trong đó số nguyên sẽ được căn chỉnh phải, chỗ trống bên trái nếu cần.
Ép kiểu dữ liệu (type casting) có thể xảy ra; ví dụ, nếu biến `z` có kiểu `Real`, phép gán `z:=x+y;` vẫn được chấp nhận, không nhất thiết phải tuân theo kiểu dữ liệu chính xác của `x` và `y`.
Kết quả trên màn hình
Kết quả trên màn hình
123-234567 ã Viết khụng qui cỏch : Số viết ra sẽ biểu diễn theo dạng dấu chấm động Trong ví dụ dưới đây 2.7000000000E+01 chính là 2.7* 10 +01
Bài viết hướng dẫn cách định dạng số: số nguyên được căn lề phải, viết từ phải sang trái; phần thập phân có vị trí cố định Nếu số nguyên ít hơn số chỗ quy định, phần còn lại sẽ được để trống.
End. c Lệnh đọc dữ liệu từ bàn phím
Trong Pascal, lệnh `Read` và `Readln` dùng để gán giá trị nhập từ bàn phím cho biến Cú pháp gồm: `Read(Biến1, Biến2,…, BiếnN);`, `Readln(Biến1, Biến2,…, BiếnN);` và `Readln;`.
Dữ liệu gán cho biến được phân tách bằng ít nhất một dấu cách (Space Bar) hoặc Enter Việc gán kết thúc bằng phím Enter.
Read 5 và Readln khác nhau ở chỗ là đối với Readln sau khi gõ Enter thì con trỏ xuống dòng tiếp theo, còn Read thì không Nên dùng Readln đọc dữ liệu để dễ phân biệt trên màn hình.
`Readln;` là lệnh tạm dừng chương trình, chờ người dùng nhấn Enter để tiếp tục Thường dùng `Readln;` cuối chương trình trước `End;` để giữ màn hình kết quả Kết hợp `Write` và `Readln` giúp quá trình nhập liệu và hiển thị rõ ràng hơn.
CÁC LỆNH CÓ CẤU TRÚC
LỆNH CẤU TRÚC RẼ NHÁNH
Nếu điều kiện là đúng thì thực hiện công việc (ngược lại là điều kiện sai thì không thực thi công việc).
Lưu đồ cú pháp (hình bên)
If b 0 then Write( ‘Thương hai số vừa nhập: ’,a/b:5:2);
Nếu điều kiện là đúng thì thực hiện công việc 1, ngược lại là điều kiện sai thì thực thi công việc 2 Chú ý trước ELSE không có dấu ; (chấm phẩy).
If b0 then Write( ‘Thương hai số vừa nhập: ’,a/b:5:2);
Else Write( ‘Không thể chia cho 0’ );
Cú pháp : IF THEN ; ĐK
Cú pháp : IF THEN
LỆNH CẤU TRÚC LỰA CHỌN
1.Dạng Không Đầy Đủ Ý nghĩa: Trước hết kiểm tra giá trị của biến có bằng một trong các hằng 1a, 1b,
Lệnh CASE kiểm tra giá trị của biến: nếu bằng 1a, thực hiện công việc 1 và kết thúc; nếu bằng 2a, 2b, 2x, thực hiện công việc 2 và kết thúc; nếu không khớp với hằng nào từ 1a đến nx thì lệnh CASE kết thúc mà không thực hiện gì.
Ví dụ: Viết chương trình nhập vào một tháng, sau đó in lên màn hình tháng đó có bao nhiêu ngày.
Write( ‘Nhập vào một tháng: ’); Readln(T);
2: Write( ‘Tháng có 28 ( nhuần 29 ) ngày.’); End;
Câu lệnh CASE đầy đủ xử lý trường hợp giá trị biến không khớp với bất kỳ hằng nào từ 1a đến nx bằng cách thực thi công việc N+1.
Ví dụ: Viết chương trình nhập vào một tháng, sau đó in lên màn hình tháng đó có bao nhiêu ngày.
Cú pháp : CASE OF
Hằng na, nb,…, nx: ;
Cú pháp : CASE OF
Hằng na, nb,…, nx: ;
Write( ‘Nhập vào một tháng: ’); Readln(T);
2: Write( ‘Tháng có 28 ( năm nhuần 29 ) ngày.’ );
ELSE Write( ‘Tháng sai Phải nhập số từ 1 đến 12.’ );
Chú ý : Biến sau từ khoá CASE phải là biến đếm được.
CÁC LỆNH VÒNG LẶP
1.Lệnh Lặp Với Số Lần Xác Định a Dạng 1 Ý nghĩa các bước thực hiện như sau:
Kiểm tra điều kiện giá trị đầu nhỏ hơn hoặc bằng giá trị cuối Nếu đúng, gán giá trị đầu vào biến và thực hiện công việc.
- Bước 2: Kiểm tra giá trị biến (khác) giá trị cuối hay không Nếu đúng thì tăng thêm biến một đơn vị ( biến:=SUCC ( biến ) ) rồi thực hiện công việc.
- Lập lại bước 2, cho đến khi giá trị biến bằng giá trị cuối thì kết thúc câu lệnh.
Lệnh FOR yêu cầu biến đếm phải đếm được, giá trị bắt đầu nhỏ hơn hoặc bằng giá trị kết thúc Không được thay đổi giá trị biến đếm trong vòng lặp Vòng lặp kết thúc khi biến đếm đạt giá trị cuối.
Ví dụ: Để in lên màn hình dãy số từ 1, 2, 3, …, n ta có thể làm như sau:
Write( ‘Nhập vào một số: ’); Readln(n);
Wrtieln( ‘Dưới đây là dãy số từ 1 đến số bạn vừa nhập’ ); For i := 1 To n Do
Cú pháp : FOR := TO DO
b Dạng 2 Ý nghĩa tương tự như dạng 1, nhưng sau mỗi lần lặp thì biến giảm đi một đơn vị ( biến:=PRED ( biến ) )
Ví dụ: Liệt kê các số nguyên dương là ước số của một số cho trước.
Write( ‘Nhập vào một số: ’); Readln(n);
Wrtieln( ‘Dưới đây liệt kê các ước số của số bạn vừa nhập’ ); For i := n Downto 1 Do
Vòng lặp `FOR TO DO` trong Pascal kết thúc khi biến đếm bằng giá trị cuối, không phải lớn hơn giá trị cuối như nhiều ngôn ngữ khác Do đó, thay đổi giá trị biến đếm trong vòng lặp có thể dẫn đến lỗi.
“vòng lặp vô tận” Ví dụ sau đây cho thấy rõ điều đó:
Var Bien:byte; CtrlBreak: Boolean;
IF (CtrlBreakSE) THEN CtrlBreak:=not CtrlBreak;
Writeln(‘ Phai go CTRL-Break moi cham dut dược!’);
Writeln(‘Gia tri hien nay cua bien la: ‘, bien,#7);
To use the `GetCBreak(Boolean)` and `SetCBreak(Boolean)` procedures from the DOS unit, and the `Delay(Word)` procedure from the CRT unit in your Pascal program, you must include the declaration `USES DOS, CRT;`.
Hàm `GetCBreak(CtrlBreak)` kiểm tra trạng thái CTRL+BREAK, trả về giá trị vào biến `CtrlBreak` Hàm `SetCBreak(TRUE)` kích hoạt khả năng ngắt chương trình bằng CTRL+BREAK.
- #7 (Kí tự số 7) là mã ASCII làm xuất ra tiếng Beep của loa bên trong máy.
Cú pháp : FOR := DOWNTO DO
Vòng lặp Pascal không kết thúc khi `biến` đạt 250 vì khi `biến` bằng 245, nó bị gán lại thành 252 Thậm chí khi vượt quá giá trị tối đa 255 của kiểu dữ liệu, `biến` trở về 0 và vòng lặp tiếp diễn, chỉ dừng khi người dùng ngắt bằng Ctrl-Break.
Lệnh lặp với số lần lặp không xác định kiểm tra điều kiện; nếu đúng, thực thi công việc và quay lại kiểm tra điều kiện; quá trình này tiếp diễn đến khi điều kiện sai thì dừng.
Ví dụ: Tính tiền gởi ngân hàng Lãi suất hàng tháng là
Bài toán tính thời gian cần để số tiền 1 triệu đồng đạt 1 tỷ đồng với lãi suất 1.7%/tháng, lãi kép được tính như sau: Số tiền ban đầu là 1.000.000 đồng, lãi suất hàng tháng là 1.7%, và lãi được cộng dồn vào gốc mỗi tháng Câu hỏi đặt ra là: Sau bao nhiêu tháng số tiền sẽ đạt 1 tỷ đồng? Việc giải quyết bài toán này đòi hỏi sử dụng công thức tính lãi kép.
Writeln('CHUONG TINH TINH TIEN GOI NGAN HANG');
Vn := 1000000; {Số vốn ban đầu - 1 triệu}
Mm := 1000000000; {Số tiền mong muốn - 1 tỷ} sothang := 0; tam := Vn;
While (tam Compiler hoặc chỉ thị biên dịch {$X+} Tuy nhiên, thiếu {$X+}, biên dịch (F9) báo lỗi 122, nhưng chạy (CTRL+F9) vẫn bình thường.
Program TestExtendSyntax; uses crt; var i,j:byte;
HÀM (FUNCTION)
Hàm là một chương trình con tính toán trả về cho ta một giá trị kiểu vô hướng Cấu trúc hàm như sau:
FUNCTION [(:[;: ])]: ; (Header)
[VAR :[;: ]] Khai báo các biến cục bộ nếu có.
Thân hàm tuân thủ quy tắc đặt tên hàm (Chương I) Hàm có thể không có tham số, hoặc có một hoặc nhiều tham số Các tham số cùng kiểu dữ liệu cách nhau bởi dấu phẩy, khác kiểu dữ liệu cách nhau bởi dấu chấm phẩy KiểuKQ chỉ rõ kiểu dữ liệu hàm trả về.
Hàm TEST(x, y: Integer; z: Real): Real nhận ba tham số nguyên x, y và số thực z, trả về giá trị thực Hàm có thể chứa hằng số, kiểu dữ liệu và biến cục bộ Kết quả tính toán cần được gán cho tên hàm trước khi kết thúc.
Ví dụ 1: Ta xây dựng hàm DT truyền tham số vào là bán kính của hình tròn, hàm này sẽ trả về diện tích của hình tròn đó.
VAR BanKinh: real; Ch: Char;
Function DT(Radius:Real):Real;
Phép gán để trả về giá trị cho tên hàm
Repeat Write(‘Nhập bán kính: ’); Readln(BanKinh);
Writeln(‘Diện tích hinh tron tuong ung: ‘ ,DT(Bankinh):0:2);
Until UpCase(Ch) = ‘K’; {Lưu ý: ‘K’ in hoa}
Var Num:longint; Ch:char; X,Y:byte;
Write(‘Khong tinh duoc’); HALT(1);
For Dem:=1 to m do Tam:=Tam*Dem;
Writeln(‘CHUONG TRINH TINH GIAI THUA.’);
Write(‘Cho so nguyen muon tinh giai thua M= ‘);
REPEAT Gotoxy(X,Y); CLREOL; Readln(Num);
REPEAT Write(‘Tinh nua khong ? (C/K) :’); CH:=READKEY;
THỦ TỤC (PROCEDURE)
Cấu trúc của một thủ tục như sau:
PROCEDURE (:[;: ]): ; (Header)
[VAR :[;: ] Khai báo các biến cục bộ nếu có.
Như vậy cấu trúc của một thủ tục cũng tương tự như cấu trúc của một hàm Chỉ có hai điều khác:
- Header bắt đầu bằng từ khóa Procedure thay vì Function.
- Không có câu lệnh gán trong thân Procedure.
Thủ tục INSO sau sẽ in các số từ 1 đến giá trị biến truyền vào Với n là tham số thực tế, So là tham số hình thức.
For i := 1 to So do Write( i:10 );
Write(‘Nhập một số bất kỳ lớn hơn không: ’); Readln(n);
LỜI GỌI CHƯƠNG TRÌNH CON VÀ VẤN ĐỀ TRUYỀN THAM SỐ
Chương trình gồm chương trình chính và nhiều chương trình con, cùng các biến, tham số khai báo ở nhiều vị trí Khả năng truy cập (tầm vực) các chương trình con và biến là rất quan trọng, đặc biệt khi lập trình nhóm dễ dẫn đến xung đột tên Vì vậy, cơ chế che khuất biến (tầm vực) cần thiết để tránh xung đột và hiểu rõ hiệu ứng lề Bài viết này nghiên cứu tầm vực biến, chương trình con và hiệu ứng lề.
Khối mã (block) trong lập trình bắt đầu từ từ khóa `PROGRAM`, `FUNCTION` hoặc `PROCEDURE` và kết thúc bằng `END.` hoặc `END;`.
Bài viết minh họa cấu trúc chương trình gồm khối chính, thủ tục con Proc1 và Proc2 (cùng cấp), và hàm func1 (nằm trong Proc2).
Tầm vực (scope) của biến hay chương trình con là phạm vi mà chúng có thể được truy cập và sử dụng trong chương trình Nói cách khác, tầm vực xác định vùng khả kiến của biến hoặc chương trình con.
PROCEDURE Proc1(t,h:type1; Var k:type2);
Tầm vực của biến và chương trình con giới hạn trong khối khai báo, kéo dài đến hết khối đó và các khối con, trừ khi bị khai báo lại trong khối con.
Theo qui định trên, Và áp dụng cho hình minh họa trước ta thấy:
- Các biến a,b là các biến toàn cục có thể gọi được ở bất cứ nới đâu trong chương trình.
Biến toàn cục `x` trong chương trình chính truy cập được mọi nơi trừ trong `PROCEDURE Proc1` và `FUNCTION func1`, nơi biến `x` được khai báo lại, tạo ra biến cục bộ che khuất biến toàn cục.
- Các biến t,h,k và y chỉ có thể gọi được trong Proc1 mà thôi.
- Biến x nếu gọi trong Proc1 là biến cục bộ của riêng nó mà thôi.
`Proc2` và `func1` có thể truy cập biến `q` Chỉ riêng `func1` truy cập được biến `r` Biến `x` trong `func1` là biến cục bộ, khác biệt với biến `x` được khai báo trong chương trình chính và `Proc1`.
Procedure Proc1 có thể gọi từ Proc2, Func1 và chương trình chính; Proc1 cũng có khả năng tự gọi chính mình (đệ quy).
- Proc2 có thể gọi được trong chương trình chính, trong Func1 và trong chính nó Proc1 không thể gọi được Proc2.
- Func1 chỉ có thể gọi được bới Proc2.
- Proc1 và chương trình chính không thể gọi được Func1.
- Có một ngoại lệ: Chương trình chính không thể gọi chính nó.
HOẠT ĐỘNG CỦA CHƯƠNG TRÌNH CON KHI ĐƯỢC GỌI VÀ SỰ BỐ TRÍ BIẾN
Stack là vùng nhớ lưu trữ biến khi gọi chương trình/hàm con Biến toàn cục nằm trong stack suốt quá trình chạy chương trình chính Biến cục bộ (tham số hoặc khai báo sau `VAR`) được cấp phát và giải phóng trên stack khi hàm con kết thúc, tối ưu hóa sử dụng bộ nhớ Hạn chế biến toàn cục giúp tránh lỗi tràn stack.
VI VẤN ĐỀ TRUYỀN THAM SỐ KHI GỌI CHƯƠNG TRÌNH CON
Khi gọi thủ tục hoặc hàm Pascal, phải truyền đủ tham số đúng kiểu dữ liệu và thứ tự khai báo Nếu chương trình con có tham số, phải truyền giá trị hoặc biến tương ứng Ví dụ minh họa sẽ giúp hiểu rõ cách Pascal xử lý truyền tham số.
Tầm vực từ vựng khác nhau giữa các ngôn ngữ Sinh viên cần tham khảo quy định về tầm vực của từng ngôn ngữ khi học.
Pascal gây khó chịu khi cho phép quá tải tham số trong các thủ tục như Write, Writeln, nhưng lại không cho phép điều này với các chương trình con do người dùng tự định nghĩa Sự khác biệt này cần được lưu ý khi lập trình Pascal.
Procedure TestVar (x,y,z: byte; Var t: integer);
Writeln(‘Ben trong thu tuc:’);
Writeln(‘Truoc khi goi thu tuc:’);
Writeln(‘Sau khi goi thu tuc:’);
- Quá trình chạy chương trình trên và diễn biến trong bộ nhớ như sau:
- * Trước khi gọi thủ tục:
- Cấp vùng nhớ cho các biến toàn cục a,b,c.
Kết xuất của chương trình:
Truoc khi goi thu tuc:
- * Trong khi thực hiện thủ tục : ã Cấp vựng nhớ cho cỏc biến cục bộ x,y,z,t,d. ã Chuyển giao tham số: TestVar(a,5,c,c);
Trong hàm, x, y, z là các tham trị Giá trị (3, 5, 8) được sao chép vào các ô nhớ tương ứng của x, y, z.
Trong Pascal, tham số T khai báo sau từ khóa VAR là tham biến Chỉ biến mới có thể truyền làm tham biến, như ví dụ truyền biến C cho tham số T Pascal không sao chép giá trị mà tạo con trỏ trỏ đến biến C, nằm trên vùng nhớ STACK.
A=3 B=5 C=8 mọi thao tác đối với T sẽ được thực hiện ở ô nhớ của C Biến D sẽ được khởi tạo (lần đầu) bằng 0.
Sau dòng lệnh {1} và {2} của thủ tục trong bộ nhớ sẽ là:
Kết xuất của chương trình khi chạy đến câu lệnh cuối của thủ tục là:
Truoc khi goi thu tuc:
- * Sau khi thực hiện thủ tục :
- Thu hồi các vùng nhớ đã được cấp cho thủ tục:
Kết xuất của chương trình khi chạy đến câu lệnh cuối là:
Truoc khi goi thu tuc:
Sau khi goi thu tuc:
Khi truyền tham trị, giá trị được sao chép vào biến nhận Ngược lại, truyền tham biến sử dụng con trỏ trỏ đến biến gốc, thay đổi trực tiếp trên biến đó.
♥ Và kết luận quan trọng:
Tham biến trong thủ tục có thể thay đổi giá trị biến truyền vào (ví dụ biến C) Ngược lại, tham trị (như biến A) giữ nguyên giá trị ban đầu, không bị ảnh hưởng bởi thay đổi nội bộ thủ tục.
Hiệu ứng lề (Side effect) là sự thay đổi ngoài ý muốn của biến toàn cục khi gọi một hàm có tham biến Việc phòng ngừa hiệu ứng lề này rất quan trọng đối với lập trình viên.
TÍNH ĐỆ QUI CỦA CHƯƠNG TRÌNH CON
Trong Pascal, chương trình con có thể tự gọi chính mình, gọi là đệ quy – một kỹ thuật lập trình quan trọng, thường ngắn gọn và phù hợp với tư duy giải quyết nhiều bài toán, thậm chí một số bài toán chỉ giải quyết được bằng đệ quy Tuy nhiên, đệ quy thường kém hiệu quả về tốc độ và sử dụng bộ nhớ, việc tối ưu bằng vòng lặp và stack không hề đơn giản.
Ví dụ 1: Định nghĩa giai thừa của một số nguyên không âm m như sau:
Lập trình để tính giai thừa của một số nguyên không âm nhập từ bàn phím.
Đệ quy là cách thức tự nhiên để biểu diễn hàm giai thừa Quá trình thực thi đệ quy diễn ra như sau:
Ví dụ ta truyền vào giá trị m = 4, tức gọi GT(4)
GT(4) m = 4 Tính 4 * GT(4-1) gọi GT(3)
GT(3) m = 3 Tính 3 * GT(3-1) gọi GT(2)
GT(2) m = 2 Tính 2 * GT(2-1) gọi GT(1)
Cuối cùng một quá trình “tính ngược” sẽ cho phép trả về giá trị của GT(4):
Write(‘Khong tinh duoc’); HALT(1);
For Dem:=1 to m do Tam:=Tam*Dem;
Lưu ý: Một chương trình con đệ qui bao giờ cũng có ít nhất hai phần:
- Phần gọi đệ qui Trong ví dụ trên là GT:=m*GT(m-1).
Phần "neo" (ví dụ: IF (m=0) or (m=1) THEN GT:=1) trong đệ quy rất quan trọng, đảm bảo quá trình dừng sau hữu hạn bước và tránh lỗi tràn bộ nhớ stack (stack overflow).
Số Fibonacci được định nghĩa như sau:
Hàm số Fibonacci được định nghĩa bởi công thức truy hồi, tự nhiên dẫn đến việc triển khai đệ quy trong lập trình Việc xây dựng hàm tính số Fibonacci dựa trên nguyên lý này rất trực quan.
Xây dựng hàm tính số Fibonacci theo đệ quy rất đơn giản, phản ánh trực tiếp định nghĩa toán học Tuy nhiên, phương pháp này trở nên phức tạp hơn khi lời gọi đệ quy phân nhánh.
Cách 2: (Dùng chỗ lưu trữ tạm)
FOR Counter:=3 TO n DO Begin
Trong cách 2 này việc khử đệ qui không còn dễ dàng nữa vì cách đó không chứa rõ ràng một qui tắc tổng quát cho phép xử lí
Bài toán tháp Hà Nội:
Có 3 cái cọc, đánh dấu A, B, C, và N cái đĩa Mỗi đĩa đều có một lỗ chính giữa để đặt xuyên qua cọc, các đĩa đều có kích thước khác nhau Ban đầu tất cả đĩa đều được đặt ở cọc thứ nhất theo thứ tự đĩa nhỏ hơn ở trên.
Yêu cầu: Chuyển tất cả các đĩa từ cọc A qua cọc C với ba ràng buộc như sau:
1 Mỗi lần chỉ chuyển được một đĩa.
2 Trong quá trình chuyển đĩa có thể dùng cọc còn lại để làm cọc trung gian.
3 Chỉ cho phép đặt đĩa có bán kính nhỏ hơn lên đĩa có bán kính lớn hơn.
Bài toán tháp Hà Nội với N đĩa phức tạp Khởi đầu với các trường hợp đơn giản hơn để tìm lời giải tổng quát.
N = 1 Lời giải trở thành tầm thường (nhưng không kém phần quan trọng đâu!) Đơn giản là chuyển đĩa này từ cọc A qua cọc C là xong.
Với N=2, giải pháp tối ưu là: chuyển đĩa trên cùng từ cọc A sang cọc B; sau đó, chuyển đĩa còn lại từ cọc A sang cọc C; cuối cùng, chuyển đĩa trên cọc B sang cọc C.
N=3 Ta phải thực hiện 7 bước như sau:
Bước 1: Chuyển một đĩa từ A qua C -
Bước 2: Chuyển một đĩa từ A qua B -
Bước 3: Chuyển một đĩa từ C qua B -
Bước 4: Chuyển một đĩa từ A qua C -
Bước 5: Chuyển một đĩa từ B qua A -
Bước 6: Chuyển một đĩa từ B qua C -
Bước 7: Chuyển một đĩa từ A qua C -
Bước thứ ba cho kết quả quan trọng: bài toán tháp Hà Nội với N=3 đĩa được chia thành hai bài toán nhỏ hơn, gồm chuyển 1 đĩa từ A sang C (qua B) và chuyển 2 đĩa từ A sang C (qua B).
B sang cọc C lấy cọc A làm trung gian Hai bài toán con này đã biết cách giải (trường hợp N=1 và trường hợp N=2).
Nhận xét đó cho ta gợi ý trong trường hợp tổng quát:
• Bước 1: Dời (N-1) đĩa trên cùng từ cọc A sang cọc B lấy cọc C làm trung gian.
• Bước 2: Chuyển 1 đĩa dưới cùng từ cọc A sang cọc C.
• Bước 3: Dời (N-1) đĩa đang ở cọc B sang cọc C lấy cọc A làm trung gian.
Bài toán tháp Hà Nội với N đĩa được giải quyết bằng đệ quy, chia thành hai bài toán con: chuyển N-1 đĩa và chuyển 1 đĩa Quá trình đệ quy kết thúc khi N=0.
Chương trình sẽ như sau:
{Dời N đĩa từ cọc A sang cọc C lấy cọc B làm trung gian}
Doi(N-1,A,C,B); {Dời N-1 đĩa từ cọc A sang cọc B lấy cọc C làm trung gian} Chuyen(A,C);
Doi(N-1,B,A,C); {Dời N-1 đĩa từ cọc B sang cọc C lấy cọc A làm trung gian} End;
Write(‘Cho biet so dia :’); Readln(Sodia); Writeln(‘Cac buoc thuc hien:’);
Writeln; Writeln(‘Thuc hien xong!’); READLN;
Nếu áp dụng chương trình này cho trường hợp N=3 ta có quá trình gọi đệ qui như sau:
Kết xuất trong câu lệnh `Chuyen(X,Y)` chỉ diễn ra sau khi tất cả các đệ quy hoàn thành, thể hiện thứ tự đệ quy cuối cùng Hiểu rõ thứ tự này rất quan trọng khi lập trình đệ quy, đặc biệt với nhiều nhánh.
UNIT
Việc lập trình trở nên dễ dàng hơn nhờ chương trình con, nhưng việc tái sử dụng chúng giữa các chương trình khác nhau rất tốn thời gian Để giải quyết vấn đề này, các chương trình con thường dùng được gom thành module độc lập (UNIT), biên dịch sẵn và có thể sử dụng lại trong nhiều chương trình khác nhau Khái niệm Unit xuất hiện từ Turbo Pascal 4.0.
Có hai loại UNIT là Unit chuẩn của Pascal tạo ra và Unit do người lập trình tự tạo để phục vụ riêng cho mình.
2.Các Unit Chuẩn a Giới thiệu một số Unit chuẩn
- Unit CRT: Gồm các hằng, kiểu, biến, hàm, thủ tục liên quan đến chế độ màn hình văn bản (TEXT mode).
- Unit PRINTER: Gồm các hằng, kiểu, biến, hàm, thủ tục liên quan đến chế độ in ấn qua cổng LPT1 (Connector DB25).
- Unit GRAPH: Gồm các hằng, kiểu, biến, hàm, thủ tục liên quan đến chế độ đồ họa.
Unit DOS cung cấp các hằng số, kiểu dữ liệu, biến, hàm và thủ tục để tương tác trực tiếp với thanh ghi, ngắt và gọi hàm hệ điều hành MS-DOS.
Unit OVERLAY quản lý hằng, kiểu dữ liệu, biến, hàm và thủ tục, cho phép nạp/giải phóng mã từ đĩa cứng khi cần thiết thay vì tải toàn bộ chương trình vào bộ nhớ RAM cùng lúc, tối ưu hóa việc sử dụng tài nguyên hệ thống.
- Các Unit khác: SYSTEM, TURBO3, GRAPH 3… là các Unit phiên bản 3.0 sử dụng.
Để sử dụng Unit trong Pascal, cần khai báo tên Unit ở đầu chương trình (trừ unit SYSTEM) Unit CRT cung cấp nhiều hàm và thủ tục hữu ích.
- ClrScr: Thủ tục xoá màn hình.
- GotoXY( x , y : Byte): Dời con trỏ tới vị trí cột x , dòng y trên màn hình Thông thường, màn hình trong TextMode(Co80) có 25 dòng (từ dòng 1 đến dòng 25) và
Cú pháp : USES [, ];
80 cột (cột 1 đến cột 80) Vậy toạ độ góc trên trái của màn hình là (1, 1), toạ độ góc dưới phải là (80, 25) 10
- Delay( ms : Word): Thủ tục trì hoãn chương trình trong ms mili-giây.
- Sound( hz : Word): Thủ tục phát ra âm thanh qua loa bên trong (internal speaker) với tần số hz
- Nosound: Thủ tục ngừng phát ra âm thanh.
- Keypressed: Hàm cho kết quả là TRUE nếu có một phím được ấn.
- Readkey: Hàm cho kết quả là mã ASCII của ký tự khi phím được ấn.
- TextBackGround(color: Byte): Thủ tục chọn màu nền Ta có thể đặt màu nền cho toàn màn hình bằng cách đặt lệnh này vừa trước lệnh ClrScr.
- TextColor(color: Byte): Thủ tục chọn màu cho chữ
Pascal predefines color constants: Black (0), Blue (1), Green (2), Cyan (3), Red (4), Magenta (5), Brown (6), LightGray (7), DarkGray (8), LightBlue (9), LightGreen (10), LightCyan (11), LightRed (12), LightMagenta (13), Yellow (14), and White (15).
(8 hằng trị đầu tiên từ Black đến LightGray áp dụng cho cả màu chữ lẫn màu nền Các hằng trị còn lại chỉ áp dụng cho màu chữ).
Unit CRT thiết lập biến hệ thống TextAttr để xác định màu màn hình văn bản Để hiển thị chữ xanh lục sáng trên nền xanh da trời, ta gán giá trị tương ứng cho biến TextAttr.
1.Các Bước Tạo Một Unit a Bước 1
Tạo ra một tập tin Pascal có đuôi PAS và có cấu trúc như trình bày dưới đây, lưu ý là tên của unit phải trùng với tên tập tin.
Màn hình TextMode giả lập của Windows khi chạy Borland Pascal mặc định là 80 cột x 50 dòng, tuy nhiên màn hình LCD rộng có thể hiển thị nhiều cột hơn Máy chiếu thường hỗ trợ kém chế độ văn bản, cần lưu ý khi lập trình để đảm bảo hiển thị chính xác trên máy chiếu.
UNIT ; {Tên unit bắt buộc phải trùng với tên tập tin}
INTERFACE {Không có dấu ; ở đây}
Phần giao diện Unit khai báo các unit, hằng, kiểu dữ liệu, biến, và nguyên mẫu hàm/thủ tục mà các chương trình khác sẽ sử dụng Chỉ khai báo tên, tham số, kiểu kết quả; các hàm/thủ tục không khai báo ở đây sẽ không thể được gọi từ chương trình khác.
IMPLEMENTATION {Không có dấu ; ở đây}
Phần hiện thực unit chứa các hàm, thủ tục đã khai báo trong interface Chỉ các chương trình con khai báo trong interface mới được truy cập từ bên ngoài unit.
Phần mã này được thực thi trước câu lệnh đầu tiên của chương trình gọi Unit Việc sử dụng phần này không bắt buộc, nhưng từ khóa "END." vẫn cần giữ lại nếu bỏ qua.
Unit không được thiết kế để chạy mà để biên dịch đặt lên đĩa nên ta không thể nhấn CTRL+F9 mà làm theo trình tự sau:
Tiếp tục chọn Destination để chuyển thành Disk Lưu ý: Destination Disk là tạo unit lên đĩa, Memory là tạo unit lên bộ nhớ RAM.
Để tạo tập tin TPU, chọn menu Compile, sau đó chọn lại chức năng Compile (Alt + F9) Tập tin TPU sẽ được tạo trên đĩa, mang tên unit đã tạo.
Kể từ đây, ta có thể sử dụng unit này bằng cách gọi nó trong câu lệnh USES như đã nói trên.
Bài viết này trình bày chương trình gồm 3 hàm: `HamMu` tính a mũ n (aⁿ), `GiaiThua` tính n giai thừa (n!), và `USCLN` tính ước số chung lớn nhất của hai số nguyên không âm.
Unit MyUnit; {Trùng tên với tập tin MyUnit.pas}
Function HamMu(a: Real; n: Integer): Real;
Function HamMu(a: Real; n: Integer): Real;
For i:=1 to n do tam := tam * a;
For i:=1 to n do tam := tam * i;
Tệp tin MyUnit.TPU chứa unit đã biên dịch Người dùng chỉ truy cập được các hàm khai báo trong phần INTERFACE, không thể gọi procedure HoanChuyen.
III TẬP TIN TURBO.TPL
Tệp `BP\BIN\TURBO.TPL` (Turbo Pascal Library) là thư viện chứa các Unit thường dùng, được nạp vào bộ nhớ khi khởi động Pascal, giúp lập trình viên truy cập nhanh chóng các Unit này.