Bài giảng ngôn ngữ lập trình Pascal
LỜI MỞ ĐẦU
Theo khung chương trình của Bộ Giáo Dục và Đào Tạo, Ngôn ngữ Lập trình Pascal
là một phần quan trọng trong học phần Tin học Đại cương thuộc các khối ngành Khoa học
Tự nhiên, đặc biệt là ngành Công nghệ Thông tin.
Nhằm đáp ứng yêu cầu học tập của học sinh, sinh viên bước đầu làm quen với công việc
lập trình, chúng tôi đã biên soạn Bài Giảng ngôn ngữ lập trinh Pascal nhằm giúp cho
sinh viên có một tài liệu học tập, rèn luyện tốt khả năng lập trình, tạo nền tảng vững chắc
cho các môn học tiếp theo trong chương trình đào tạo Cử nhân Công nghệ Thông tin
Giáo trình bai gồm rất nhiều bài tập từ đơn giản đến phức tạp. Các bài tập này được
biên soạn dựa trên khung chương trình giảng dạy môn Tin học Đại cương. Bên cạch đó,
chúng tôi cũng bổ sung một số bài tập dựa trên cơ sở một số thuật toán chuẩn với các cấu
trúc dữ liệu được mở rộng nhằm nâng cao kỹ năng, phương pháp lập trình cho sinh viên.
Nội dung trong mỗi chương đều có phần lý thuyết, phần bài tập mẫu và cuối cùng là
phần bài tập tự giải để bạn đọc tự mình kiểm tra những kiến thức và kinh nghiệm đã học.
Chúng tôi hy vọng sớm nhận được những ý kiến đóng góp, phê bình của bạn đọc về nội
dung, chất lượng và hình thức trình bày để giáo trình này ngày một hoàn thiện hơn.
QB, Tháng 11 Năm 2006
TÁC GIẢ
Người soạn: Đinh Văn Thái
1
Bài giảng ngôn ngữ lập trình Pascal
CHƯƠNG I
THUẬT TOÁN
I. Khái niệm thuật toán
1. Khái niệm: Thuật toán là một dãy hữu hạn các thao tác, được sắp xếp theo một trình
tự xác định, sao cho từ Input của bài toán ta xác định được Output cần tìm.
2. Ví dụ: Một hộp kín chứa hữu hạn các viên bi có kích thước khác nhau. Hãy tìm thuật
toán tìm ra viên bi lớn nhất, biết rằng mỗi lần chỉ được bốc một viên.
Thuật toán được trình bày như sau:
Bước 1: Bốc một viên bất kỳ.
Bước 2: Kiểm tra xem hộp đã rỗng chưa?
Nếu đúng chuyển qua bước 4.
Nếu sai chuyển qua bước 3.
Bước 3: Bốc tiếp một viên bi khác, so sánh hai viên và giữ lại viên lớn rồi chuyễn qua
bước 2.
Bước 4: Viên bi hiện tại là viên bi lớn nhất, kết thúc.
II. Các tính chất của thuật toán.
1. Tính phổ dụng: Thuật toán không chỉ để giải quyết một bài toán riêng lẽ mà được
dùng để giải quyết một lớp các bài toán (có thể la vô hạn), các bài toán cùng loại.
2. Tính hữu hạn: Thuật toán phải được kết thúc sau một số hữu hạn bước thực hiện
các thao tác.Một thuật toán không có tính hữu hạn là không khả thi.
3. Tính xác định: Thuật toán đòi hỏi mỗi bước thao tác phải rõ ràng và xác định một
cách đơn trị bước tiếp theo.
4. Tính hiệu quả: Thể hiện ở các yêu cầu sau:
- Tính đúng đắn.
- Tính tối ưu: Tiết kiệm thời gian thực hiện, tiết kiệm bộ nhớ.
III. Các đại lượng của thuật toán.
1. Đại lượng vào: Là những đại lượng cho trước làm cơ sở cho việc hình thành nên
bài toán.
2. Đại lượng ra: Thường là kết quả sau khi đã thực hiện xong thuật toán và đó cũng
chính là yêu cầu của bài toán.
3. Đại lượng trung gian: Là các đại lượng tham gia vào quá trình để giải bài toán
nhưng không phải là đại lượng vào mà cũng chẳng phải là đại lượng ra.
Ví dụ: Bài toán giải phương trình bậc hai: ax
2
+ bx + c = 0 (a ≠ 0).
Đại lượng vào là các hệ số a,b,c.
Đại lượng ra là: hoặc là nghiệm kép, hoặc là hai nghiệm phân biệt nhưng cũng có khi
là một câu thông báo vô nghiệm.
Đại lượng trung gian: delta = b
2
– 4ac.
Người soạn: Đinh Văn Thái
2
Bài giảng ngôn ngữ lập trình Pascal
4. Hằng, biến, kiểu:
Để biểu diễn các đại lượng nêu trên của thuật toán ta sử dụng các hằng, biến và phải
có kiểu dữ liệu nhất định.
- Hăng: Là đại lượng không thay đổi trong quá trình thực hiện thuật toán.
- Biến: Là đại lượng có thể thay đổi giá trị trong quá trình thực hiện thuật
toán.
- Kiểu: Là tập hợp các giá trị (miền trị) mà các đại lượng cóthể nhận, đồng
thời với việc quy định các phép toán tác động trên đó.
IV. Biểu diễn của thuật toán
1. Các dạng biểu diễn của thuật toán: Có thể biểu diễn thuật toán bằng 3 dạng sau:
- Liệt kê các bước (như ở ví dụ 1).
- Cấu trúc theo ngôn ngữ quy ước của thuật toán.
- Sơ đồ khối.
2. Biểu diễn thuật toán bằng sơ đồ khối: Đây là dạng biểu diễn có cấu trúc trực quan,
rõ ràng.
a. Các kí hiệu dùng để biểu diễn thuật toán:
Dùng để chỉ sự bắt đầu và kết thúc của thuật toán
Dùng để chỉ việc nhập dữ liệu và ghi dữ liệu ra màn hình
Dùng để biểu diễn các thao tác của thuật toán
Dùng để kiểm tra điều kiện.
Dùng để hướng đi của thuật toán.
Ngoài ra ta còn sử dụng ký hiệu := để biểu diễn cho việc gán giá trị cho các biến.
b. Các ví dụ:
Ví dụ 1: Vẽ sơ đồ thuật toán để giải phương trình: ax + b = 0;
- Dữ liệu vào là a, b.
- Dữ liệu ra là nghịêm hoặc một câu thông báo.
Người soạn: Đinh Văn Thái
3
Bài giảng ngôn ngữ lập trình Pascal
Ví dụ 2: Sơ đồ thuật toán để giải bài toán tính tổng:
S = 1 + 2 + 3 + … + n
(Với N nguyên dương bất kỳ và không dùng công thức S = n(n+1)/2).
Người soạn: Đinh Văn Thái
4
Begin
Nhập a,b
a=0
x=-b/a
b=0
moi x
Vô nghiệm
End.
F
F
T
T
Bài giảng ngôn ngữ lập trình Pascal
BÀI TẬP CHƯƠNG I
Bằng phương pháp dùng sơ đồ khối, trình bày thuật toán giải các bài toán sau đây:
1. Tính S = 1 + 2 + 3 + … + n.
2. Tính S = 1 – 2 + 3 - … + (-1)
n-1
n.
3. Giải phương trình bậc 2: ax
2
+ bx + c = 0 (a ≠ 0).
4. Tìm ước chung lớn nhất của hai số nguyên dương.
5. Tìm bội chung nhỏ nhất của hai số nguyên dương.
6. Kiểm tra một số nguyên dương có phải là một số nguyên tố hay không
CHƯƠNG II
Người soạn: Đinh Văn Thái
5
Begi
n
Nhâp n
S:=0; i:=1
i> n
S:=S+i;
i=i+1
S
End.
T
F
Bài giảng ngôn ngữ lập trình Pascal
CÁC KIẾN THỨC CHUNG VỀ
NGÔN NGỮ LẬP TRÌNH PASCAL
Pascal là một ngôn ngữ lập trình bậc cao do Niklaus Wirth, giáo sư điện toán trường Đại
học kỹ thuật Zurich (Thụy Sĩ) đề xuất năm 1970. Ông lấy tên Pascal để kỷ niệm nhà toán
học và nhà triết học người Pháp nổi tiếng Blaise Pascal.
I. Các tập tin cần thiết khi lập trình với Turbo Pascal
Để lập trình được với Turbo Pascal, tối thiểu cần 2 file sau:
• TURBO.EXE: Dùng để soạn thảo và dịch chương trình.
• TURBO.TPL: Thư viện chứa các đơn vị chuẩn để chạy với TURBO.EXE.
Ngoài ra, muốn lập trình đồ hoạ thì phải cần thêm các tập tin:
• GRAPH.TPU: Thư viện đồ hoạ.
• *.BGI: Các file điều khiển các loại màn hình tương ứng khi dùng đồ hoạ.
• *.CHR: Các file chứa các font chữ đồ họa.
II. Các bước cơ bản khi lập một chương trình Pascal
1. Các bước lập trình tổng quát:
Bước 1: Phân tích bài toán; Xác định dữ liệu vào, dữ liệu ra làm cơ sở cho việc hình
thành giải thuật.
Bước 2: Xây dựng thuật toán: Trên cơ sở xác định dữ liệu vào, ra; các giả thiết của bài
toán, các mối liên hệ giữa chúng và những kiến thức liên quan ta cần đưa ra thuật toán
tương ứng.
Bước 3: Tổ chức dữ liệu và lập chương trình theo thuật toán đã đè ra.
2. Các bước lập trình và thực hiện (với Turbo Pascal):
Bước 1: Khởi động Turbo Pascal (Turbo. exe)
Bước 2: Soạn thảo chương trình.
Bước 3: Biên dịch (Nhấn tổ hợp phím ALT – F9).
+ Nếu thành công thì chuyễn qua bước 4.
+ Nếu không thành công chuyễn qua bước 2.
Bước 4: Chạy thử chương trình.
+ Nếu tốt chuyễn qua bước 5.
+ Nếu chưa tốt thì quay về bước 2.
Bước 5: Ghi vào đĩa, dịch thành file *.exe.
Bước 6: Kết thúc.
III. Một số phím chức năng thường dùng
• F2: Lưu chương trình đang soạn thảo vào đĩa.
• F3: Mở file mới hoặc file đã tồn tại trên đĩa để soạn thảo.
• Alt-F3: Đóng file đang soạn thảo.
Người soạn: Đinh Văn Thái
6
Bài giảng ngôn ngữ lập trình Pascal
• Alt-F5: Xem kết quả chạy chương trình.
• F8: Chạy từng câu lệnh một trong chương trình.
• Alt-X: Thoát khỏi Turbo Pascal.
• Alt-<Số thứ tự của file đang mở>: Dịch chuyển qua lại giữa các file đang mở.
• F10: Vào hệ thống Menu của Pascal.
IV.Các thao tác cơ bản khi soạn thảo chương trình
IV.1. Các phím thông dụng
• Insert: Chuyển qua lại giữa chế độ đè và chế độ chèn.
• Home: Đưa con trỏ về đầu dòng.
• End: Đưa con trỏ về cuối dòng.
• Page Up: Đưa con trỏ lên một trang màn hình.
• Page Down: Đưa con trỏ xuống một trang màn hình.
• Del: Xoá ký tự ngay tại vị trí con trỏ.
• Back Space (): Xóa ký tự bên trái con trỏ.
• Ctrl-PgUp: Đưa con trỏ về đầu văn bản.
• Ctrl-PgDn: Đưa con trỏ về cuối văn bản.
• Ctrl-Y: Xóa dòng tại vị trí con trỏ.
IV.2. Các thao tác trên khối văn bản
• Chọn khối văn bản: Shift + <Các phím ←↑→↓ >
• Ctrl-KY: Xoá khối văn bản đang chọn
• Ctrl-Insert: Đưa khối văn bản đang chọn vào Clipboard
• Shift-Insert: Dán khối văn từ Clipboard xuống vị trí con trỏ.
V. Các khái niệm và các thành phần cơ bản
1. Bộ ký tự (Dùng để soạn thảo chương trình)
Bao gồm các loại ký tự sau đây:
Các chữ cái: a..z; A..Z (Khi soạn thảo chương trình, Turbo Pascal không phân
biệt chữ hoa hay chữ thường).
Các ký tự số: 0..9.
- Các dấu toán: + - * / ^ = > < .
- Các ký tự đặc biệt: ? ; . : ! [ ] { } # $ @.
Dấu gạch nối:
- Các ký tự điều khiển.
2. Từ và từ khoá
a. Từ: Là một dãy liên tiếp các ký tự không chứa ký tự trắng và ký tự điều khiển.
b. Từ khoá: Là từ dành riêng của Pascal với chức năng và cú pháp được quy định sẵn.
Vì vậy khi sử dụng phải theo đúng quy định và không được sử dụng các từ khoá vào các
công việc khác.
Ví dụ: Begin, end, if, then, const, var, function,…
3. Tên và tên chuẩn.
Người soạn: Đinh Văn Thái
7
Bài giảng ngôn ngữ lập trình Pascal
a. Tên: Là một từ bao gồm tối đa 255 ký tự, chỉ được lấy trong các chử cái, chử số và
dấu gạch nối, nhưng không được bắt đầu bằng số. Tên dùng để đặt cho các đối tượng trong
chương trình như hằng, biến, hàm, thủ tục, kiểu dữ liệu,…
b.Tên chuẩn: Là tên mà Turbo Pascal đã định sẵn để chỉ các hàm, hằng, biến, thủ tục thư
viện của nó.
VI. Cấu trúc chung của một chương trình Pascal
{ Phần tiêu đề }
PROGRAM Tên_chương_trình;
{ Phần khai báo và định nghĩa}
USES ......;
CONST .....;
TYPE .......;
VAR ........;
PROCEDURE ............;
FUNCTION ..............;
...............
{ Phần thân chương trình }
BEGIN
...........
END.
1. Phần tiêu đề:
Từ khoá để khai báo là Program tiếp đến là tên của chương trình do người dùng tự đặt.
Phần này không bắt buộc phải có.
2. Phần khai báo và định nghĩa:
Uses: Dùng để khai báo các Unit (đơn vị chương trình) của Turbo Pascal. Nếu có nhiều
Unit thì sử dụng dấu phẩy “,” để ngăn cách.
Const: Dùng để khai báo các hằng.
Cú pháp: Tên_hằng = Giá trị.
Type: Dùng để định nghĩa các kiểu dữ liệu của người dùng.
Cú pháp: Tên_kiểu = định nghĩa cụ thể cho từng kiểu.
Var: Khai báo biến.
Cú pháp: Tên_biến: Kiểu_dữ liệu;
(Hoặc khai báo trực tiếp không thông qua kiểu.).
Nếu có nhiều biến cùng kiểu thì sử dụng dấu phẩy “,” để ngăn cách.
Procedure: Định nghĩa chương trình con dạng thủ tục.
Function: Định nghĩa chương trình con dạng hàm.
3. Phần thân chương trình: Được bắt đầu bằng từ khoá “Begin” và kết thúc bởi từ khoá
“End”. Giữa cặp từ khoá này có các câu lệnh của chương trình.
Chú ý:
- Turbo Pascal cũng sử dụng dấu “;” để kết thúc phần này chuyển qua phần
khác cũng như giữa khai báo này qua khai báo khác của chương trình.
Người soạn: Đinh Văn Thái
8
Bài giảng ngôn ngữ lập trình Pascal
- Khi soạn thảo chương trình cho phép đưa vào các câu chú thích nhưng phải
được đặt trong cặp dấu móc {…} hoặc (*…*).
Ví dụ 1: Chương trình Pascal đơn giản nhất
BEGIN
Write(‘Hello World!’);
END.
Ví dụ 2:
Program Vidu2;
Const PI=3.14;
Var R,S:Real;
Begin
R:=10; {Bán kính đường tròn}
S:=R*R*PI; {Diện tích hình tròn}
Writeln(‘Dien tich hinh tron = ‘, S:0:2); { In ra màn hình }
Readln;
End.
CHƯƠNG III
CÁC KIỂU DỮ LIỆU ĐƠN GIẢN
Người soạn: Đinh Văn Thái
9
Bài giảng ngôn ngữ lập trình Pascal
I. Tổng quan về các kiểu dữ liệu trong Turbo Pascal
Các kiểu dữ liệu trong Turbo Pascal được chia làm hai loại:
- Các kiểu dữ liệu đơn gian.
- Các kiểu dữ liệu co cấu trúc.
1. Các kiểu dữ liệu đơn giản gồm:
Kiểu chuẩn:
- Logic.
- Số nguyên.
- Số thực.
- Ký tự.
- Xâu.
Kiểu do người dung định nghĩa:
- Kiểu đoạn con.
- Kiểu liệt kê.
2. Các kiểu dữ liệu có cấu trúc:
- Mảng.
- Tập hợp.
- Bản ghi.
- File
II. Các kiểu dữ liệu đơn giản chuẩn
1. Kiểu logic:
Từ khoá: Boolean.
Miền trị: Chỉ có hai giá trị là True và False.
Các phép toán: AND, OR, NOT, XOR.(Xem bảng dưới đây)
Các phép toán: phép so sánh (=, <, >)
Trong Pascal, khi so sánh các giá trị boolean ta tuân theo qui tắc: FALSE < TRUE.
Giả sử A và B là hai giá trị kiểu Boolean. Kết quả của các phép toán được thể hiện qua
bảng dưới đây:
A B A AND B A OR B A XOR B NOT A
TRUE TRUE TRUE TRUE FALSE FALSE
TRUE FALSE FALSE TRUE TRUE FALSE
FALSE TRUE FALSE TRUE TRUE TRUE
FALSE FALSE FALSE FALSE FALSE TRUE
2. Kiểu số nguyên
2.1. Các kiểu số nguyên
• Có 5 kiểu số nguyên:
Miền trị của các kiểu đó như sau:
Người soạn: Đinh Văn Thái
10
Bài giảng ngôn ngữ lập trình Pascal
Tên kiểu Phạm vi Dung lượng
Shortint
-128 → 127
1 byte
Byte
0 → 255
1 byte
Integer
-32768 → 32767
2 byte
Word
0 → 65535
2 byte
LongInt
-2147483648 → 2147483647
4 byte
2.2. Các phép toán trên kiểu số nguyên
2.2.1. Các phép toán số học:
+, -, *, / (phép chia cho ra kết quả là số thực).
Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6).
Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4).
2.2.2. Các phép toán xử lý bit:
Trên các kiểu ShortInt, Integer, Byte, Word có các phép toán:
• NOT, AND, OR, XOR.
A B A AND B A OR B A XOR B NOT A
1 1 1 1 0 0
1 0 0 1 1 0
0 1 0 1 1 1
0 0 0 0 0 1
• SHL (phép dịch trái): a SHL n ⇔ a × 2
n
• SHR (phép dịch phải): a SHR n ⇔ a DIV 2
n
3. Kiểu số thực
Có 5 kiểu số thực:
Miền trị của các kiểu đó như sau:
3.1. Các kiểu số thực:
Tên kiểu Phạm vi Dung lượng
Single
1.5×10
-45
→ 3.4×10
+38
4 byte
Real
2.9×10
-39
→ 1.7×10
+38
6 byte
Double
5.0×10
-324
→ 1.7×10
+308
8 byte
Extended
3.4×10
-4932
→ 1.1×10
+4932
10 byte
Comp
-9.2*10
18
→ 9.2*10
18
4 byte
Chú ý: Các kiểu số thực Single, Double và Extended yêu cầu phải sử dụng chung với bộ
đồng xử lý số hoặc phải biên dich chương trình với chỉ thị {$N+} để liên kết bộ giả lập số.
3.2. Các phép toán trên kiểu số thực: +, -, *, /
• Chú ý:
(1). Miền trị của các kiểu dữ liệu (trừ comp) được hiểu là lấy trong các đoạn:
[-max, -min]
Người soạn: Đinh Văn Thái
11
Bài giảng ngôn ngữ lập trình Pascal
[max, min]
số 0.
Nếu một số < -max hoặc > max thì sẽ không biểu diễn được và xem như là tràn số.
Nếu một số <-min nhỏ hơn 0 hoặc lớn hơn 0 nhỏ hơn min thì được xem như là 0
(2). Chế độ mặc định của TurboPascal là chỉ cho phép làm việc với kiểu số thực REAL.
Muốn sử dụng các kiểu khác ta vào bảng chọn OPTION -> COMPILER-> NUMERIC
PROCESING rồi đánh dấu [x] vào mục 8087/80287.
(3). Trong máy tính số thực được biểu diễn dưới hai dạng:
Dấu chấm tĩnh, ví dụ: 3.14, 123.456…
Dấu chấm động (chế độ mặc định), ví dụ: 3.1400000000E+02 (tức là 3.14*10
2
).
(4)Trên kiểu số thực không tồn tại các phép toán DIV và MOD.
4. Kiểu ký tự (CHAR. )
- Từ khoá: CHAR.
- Miền trị: Các ký tự trong bảng mã ASCII bao gồm:
0..31 : Các ký tự điều khiển.
32..127 : Các ký tự thông dụng.
128..255 : Các ký tự đặc biệt (đồ hoạ).
Ví dụ: kí tự ‘A’ có mã là 65; Ký tự a có mã là 97.
- Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau đây:
• Đặt ký tự trong cặp dấu nháy đơn. Ví dụ 'A', '0'.
• Dùng hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn). Ví dụ
CHR(65) biễu diễn ký tự 'A'.
• Dùng ký hiệu #n (trong đó n là mã ASCII của ký tự cần biểu diễn). Ví dụ #65.
- Phép so sánh: Muốn so sánh hai ký tự ta so sánh các mã ASCII tương ứng của chúng, ký
hiệu nào có mã ASCII lớn hơn được xem là lớn hơn. Ví dụ: ‘a’ > ’A’. Vì 97 > 65.
Chú ý: Một kiểu dữ liệu được gọi là vô hướng đếm được nếu miền trị của nó là một tập
hợp đếm được và trên đó tồn tại quan hệ thứ tự. Ví dụ: Kiểu Byte; kiểu Integer; kiểu Char;
kiểu Boolean…
III. Kiểu liệt kê và kiểu đoạn con
1. Kiểu liệt kê:
a. Định nghĩa kiểu và khai báo biến:
Định nghĩa kiểu:
Type ten_kieu = (Danh sách các giá trị);
Giải thích:
Ten_ kieu ký hiệu cho tên kiểu do người dung tự đặt
Danh sách các giá trị là tập hợp các giá trị được phân cách bởi dấu phẩy “,”.
Người soạn: Đinh Văn Thái
12
Bài giảng ngôn ngữ lập trình Pascal
Khai báo biến:
Var ten_bien : ten_kieu;
Giải thích:
ten_bien ký hiệu cho tên biến do người dùng tự đặt
ten_kieu đã được khai báo;
Ví dụ:
Type ngay = (sun, mon, tue, wed, thu, fri, sat);
Cviec = (dihoc, dilam, thuchanh, nghi);
Var hqua, hnay: ngay;
Viec: cviec;
Cũng có thể khai báo biến kiểu liệt kê trực tiếp mà không cần khai báo kiểu.
Ví dụ: var gioitinh: (nam, nu);
Mau: (xanh, do, tim, vang);
b. Các tác động lên dữ liệu kiểu liệt kê:
• Có thể thực hiện phép gán giá trị cho biến.
•
• Phép so sánh: Giá trị liệt kê trong danh sách đi trước được xem là bé hơn giá trị
sau.
c. Chú ý:
- Không thể nhập, xuất với dữ liệu kiểu liệt kê.
Người soạn: Đinh Văn Thái
13
Bài giảng ngôn ngữ lập trình Pascal
- Giá trị kiểu liệt kê thường được dùng để làm chỉ số cho lệnh lặp for, các trường
hợp chọn lựa trong lệnh Case, hoặc chỉ số cho mảng.
2. Kiểu đoạn con:
a. Định nghĩa kiểu và khai báo biến:
Định nghĩa kiểu:
Type ten_kieu = hang duoi..hang tren;
Giải thích:
Ten_ kieu ký hiệu cho tên kiểu do người dung tự đặt
Hang_duoi tức là ký hiệu giá trị hằng cận dưới, hang tren tức là ký hiệu giá trị
hằng cận trên tất nhiên là hang tren >= hang duoi và phải có cùng kiểu vô hướng đếm
được.
Khai báo biến:
Var ten_bien : ten_kieu;( Tên kiểu đã được khai báo)
Ví dụ: Type Ky_tu_so: ‘0’..’9’;
Chu_cai : ‘a’..’z’
Var a,b : Ky_tu_so;
Ch : Chu_cai ;
IV. Các hàm chuẩn
1. Các hàm số học sử dụng cho kiểu số nguyên và số thực:
SQR(x): Trả về x
2
SQRT(x): Trả về căn bậc hai của x (x≥0)
ABS(x): Trả về |x|
SIN(x): Trả về sin(x) theo radian
COS(x): Trả về cos(x) theo radian
ARCTAN(x): Trả về arctang(x) theo radian
LN(x): Trả về ln(x)
EXP(x): Trả về e
x
TRUNC(x): Trả về số nguyên gần với x nhất nhưng bé hơn x.
INT(x): Trả về phần nguyên của x
FRAC(x): Trả về phần thập phân của x
ROUND(x): Làm tròn số nguyên x
PRED(n): Trả về giá trị đứng trước n
SUCC(n): Trả về giá trị đứng sau n
ODD(n): Cho giá trị TRUE nếu n là số lẻ.
INC(n): Tăng n thêm 1 đơn vị (n:=n+1).
DEC(n): Giảm n đi 1 đơn vị (n:=n-1).
2.Các hàm trên kiểu ký tự:
- UPCASE(ch): Trả về ký tự in hoa tương ứng với ký tự ch. Ví dụ: UPCASE('a') = 'A'.
- ORD(ch): Trả về số thứ tự trong bảng mã ASCII của ký tự ch. Ví dụ ORD('A')=65.
- CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n. Ví dụ:
CHR(65)='A'.
- PRED(ch): cho ký tự đứng trước ký tự ch. Ví dụ: PRED('B')='A'.
Người soạn: Đinh Văn Thái
14
Bài giảng ngôn ngữ lập trình Pascal
- SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: SUCC('A')='B'.
Chú ý: Một kiểu dữ liệu gọi là vô hướng đếm được nếu miền trị của nó là một tập hợp
đếm được và trên đó tồn tại quan hệ thứ tự. Ví dụ: Kiểu Byte, Kiểu Integer; Kiểu Char,
Kiểu Boolean…
BÀI TẬP CHƯƠNG III
1. Tìm công thức để đổi một ký tự là chữ hoa thành chữ thường
2. Dùng các hàm và các phép toán để biểu diễn các công thức sau:
a.
n
x
, x>0.
b.
x y
x
y
+
+
2
c.
( )( )
( )
a b c
r
h
a
+ − +
− −
4 2 3
2
9 1
d.
|)(sin|
2
xxa
−+
3. So sánh các ký tự và các xâu sau đây:
a. Chữ ‘A’ và chữ ‘a’.
b. Chữ ‘A’ và chữ số ‘1’.
c. Ký tự trắng và chữ ‘a’.
CHƯƠNG IV
BIỂU THỨC VÀ CÂU LỆNH ĐƠN GIẢN
I. Biểu thức
Người soạn: Đinh Văn Thái
15
Bài giảng ngôn ngữ lập trình Pascal
1. Hằng: Hằng là một đại lượng có giá trị không thay đổi trong suốt chương trình. Có
các loại hằng: hằng số, hằng ký tự, hằng xâu, hằng logic… Từ khoá để khai báo hằng là
CONST.
- Cú pháp:
CONST <Tên hằng> = <Giá trị>;
hoặc:
CONST <Tên hằng>: = <Biểu thức hằng>;
Ví dụ:
CONSTMax = 100;
Name = 'Tran Van Hung';
Continue = FALSE;
Logic = ODD(5); {Logic =TRUE}
Chú ý: Chỉ các hàm chuẩn dưới đây mới được cho phép sử dụng trong một biểu thức
hằng:
ABS CHR HI LO LENGTH ODD ORD
PTR ROUND PRED SUCC SIZEOF SWAP TRUNC
2. Biến: Biến là một đại lượng mà giá trị của nó có thể thay đổi trong quá trình thực
hiện chương trình. Biến dùng để lưu trữ dữ liệu, biến được khai báo sau từ khoá VAR.
Việc khai báo các biến là nhằm cung cấp các vùng nhỡ để lưu trữ dữ liệu trong quá trình
thực hiện chương trình.
3. Cú pháp:
VAR <Tên biến>[,<Tên biến 2>,…] : <Kiểu dữ liệu>;
Ví dụ:
VAR x, y: Real; {Khai báo hai biến x, y có kiểu là Real}
a, b: Integer; {Khai báo hai biến a, b có kiểu integer}
Chú ý: Ta có thể vừa khai báo biến, vừa gán giá trị khởi đầu cho biến bằng cách sử dụng
cú pháp như sau:
CONST <Tên biến>: <Kiểu> = <Giá trị>;
Ví dụ:
CONSTx:integer = 5;
Với khai báo biến x như trên, trong chương trình giá trị của biến x có thể thay đổi. (Điều
này không đúng nếu chúng ta khai báo x là hằng).
4. Toán tử: Là các phép toán tác động lên dữ liệu (hay còn gọi là toán hạng).
Ví dụ: Các phép +, -, *, /, and, or, not…
5. Toán hạng: Là một trong các đại lượng sau:
Hằng
Biến
Hàm
Biểu thức
6. Biểu thức: Là một tập hợp gồm các toán tử và các toán hạng trong đó toán tử tác
động phù hợp lên toán hạng.
Người soạn: Đinh Văn Thái
16
Bài giảng ngôn ngữ lập trình Pascal
• Chú ý:
(1). Trong một biểu thức các toán tử trong dấu ngoặc “(…)” được ưu tiên thực hiện
trước
(2). Nếu có nhiều phép toán cùng cấp ưu tiên thì các phép toán được thực hiện tuần tự
từ trái qua phải.
(3). Mỗi biểu thức cho kết quả bằng số được gọi là biểu thức số học, cho kết quả là
kiểu logic thì được gọi là biểu thức logic.
II. Câu lệnh
1. Phân loại câu lênh: Trong Pascal có hai loại câu lệnh đó là câu lệnh đơn giản và
câu lệnh có cấu trúc.
Câu lệnh đơn giản gồm:
- Câu lệnh gán
- Các lệnh xuất nhập dữ liệu: READ/READLN, WRITE/WRITELN.
- Lời gọi hàm, thủ tục.
Câu lệnh có cấu trúc gồm:
- Câu lệnh ghép: BEGIN ... END;
- Các cấu trúc điều khiển: IF.., CASE..., FOR..., REPEAT..., WHILE...
2. Câu lệnh đơn giản:
a. Lệnh gán:
• Cú pháp: <Tên biến>:=<Biểu thức>;
• Ý nghĩa: Lệnh sẽ thực hiện việc gán giá trị của Biểu thức cho Tên biến.
b. Thủ tục ghi dữ liệu lên màn hình:
Để xuất dữ liệu ra màn hình, ta sử dụng ba dạng sau:
(1) WRITE(<tham số 1> [, <tham số 2>,...]);
(2) WRITELN(<tham số 1> [, <tham số 2>,...]);
(3) WRITELN;
Các thủ tục trên có chức năng như sau:
(1) Sau khi xuất giá trị của các tham số ra màn hình thì con trỏ không xuống dòng.
(2) Sau khi xuất giá trị của các tham số ra màn hình thì con trỏ xuống đầu dòng tiếp
theo.
(3) Xuất ra màn hình một dòng trống.
Các tham số có thể là các hằng, biến, biểu thức. Nếu có nhiều tham số trong câu lệnh thì
các tham số phải được phân cách nhau bởi dấu phẩy.
Khi sử dụng lệnh WRITE/WRITELN, ta có hai cách viết: không qui cách và có qui
cách:
- Viết không qui cách: dữ liệu xuất ra sẽ được canh lề ở phía bên trái. Nếu dữ liệu là số
thực thì sẽ được in ra dưới dạng biểu diễn khoa học.
Ví dụ:
WRITELN(x); WRITE(sin(3*x));
- Viết có qui cách: dữ liệu xuất ra sẽ được canh lề ở phía bên phải.
Ví dụ:
Người soạn: Đinh Văn Thái
17
Bài giảng ngôn ngữ lập trình Pascal
WRITELN(x:5); WRITE(sin(13*x):5:2);
Câu lệnh Kết quả trên màn hình
Writeln('Hello');
Writeln('Hello':10);
Writeln(500);
Writeln(500:5);
Writeln(123.457)
Writeln(123.45:8:2)
Hello
Hello
500
500
1.2345700000E+02
123.46
c. Nhập dữ liệu từ bàn phím
Để nhập dữ liệu từ bàn phím vào các biến có kiểu dữ liệu chuẩn (trừ các biến kiểu
BOOLEAN), ta sử dụng cú pháp sau đây:
• Cú pháp:
(1). READ(<biến 1> [,<biến 2>,...,<biến n>]);
(2).READLN(<biến 1> [,<biến 2>,...,<biến n>]);
(3). READLN;
• Ý nghĩa:
(1): Cho phép lần lượt nhập dữ liệu cho các biến.
(2): Tương tự dạng (a)chỉ khác ở chổ sau khi nhập xong dữ liệu con trỏ được đưa về
đầu dòng tiếp theo.
(3): Chỉ làm thao tác tạm dừng chương trình, chờ gõ phím Enter để tiếp tục.
Chú ý: Khi gặp câu lệnh READLN; (không có tham số), chương trình sẽ dừng lại chờ
người sử dụng nhấn phím ENTER mới chạy tiếp.
3. Các hàm và thủ tục thường dùng trong nhập xuất dữ liệu
• Hàm KEYPRESSED: Hàm trả về giá trị TRUE nếu như có một phím bất kỳ được
nhấn, nếu không hàm cho giá trị là FALSE.
• Hàm READKEY: Hàm có chức năng đọc một ký tự từ bộ đệm bàn phím.
• Thủ tục GOTOXY(X,Y:Integer): Di chuyển con trỏ đến cột X dòng Y.
• Thủ tục CLRSCR: Xoá màn hình và đưa con trỏ về góc trên bên trái màn hình.
• Thủ tục CLREOL: Xóa các ký tự từ vị trí con trỏ đến hết dòng.
• Thủ tục DELLINE: Xoá dòng tại vị trí con trỏ và dồn các dòng ở phía dưới lên.
• Thủ tục TEXTCOLOR(color:Byte): Thiết lập màu cho các ký tự. Trong đó color ∈
[0,15].
• Thủ tục TEXTBACKGROUND(color:Byte): Thiết lập màu nền cho màn hình.
4. Các ví dụ:
Ví dụ 1: Viết chương trình nhập vào độ dài hai cạnh của tam giác và góc giữa hai cạnh đó,
sau đó tính và in ra màn hình diện tích của tam giác.
Ý tưởng:
Người soạn: Đinh Văn Thái
18
Bài giảng ngôn ngữ lập trình Pascal
Công thức tính diện tích tam giác: S =
)sin(..
2
1
θ
ba
với a,b là độ dài 2 cạnh và θ là góc
kẹp giữa 2 cạnh a và b.
Program Tinh_dien_tich_tam_giac;
Var a,b,goc,dientich: Real;
Begin
Write('Nhap vao do dai canh thu nhat: '); Readln(a);
Write('Nhap vao do dai canh thu hai: '); Readln(b);
Write('Nhap vao goc giua hai canh: '); Readln(goc);
Dientich:=a*b*sin(goc)/2;
Writeln('Dien tich cua tam giac la: ',Dientich:0:2);
Readln;
End.
Ví dụ 2 : Viết chương trình tính
n
x
, x>0.
Ý tưởng:
Ta có:
n
x
=
n
x
1
=
x
n
e
ln
1
Program Tinh_can_bac_n_cua_x;
Var x,S: Real;
n: Word;
Begin
Write('Nhap vao n= '); Readln(n);
Write('Nhap vao x= '); Readln(x);
S:=EXP(1/n*LN(x));
Writeln('S = ',S:0:2);
Readln;
End.
Ví dụ 3 : Viết chương trình nhập vào 2 số a, b. Sau đó hoán đổi giá trị của 2 số đó:
a/ Cho phép dùng biến trung gian.
Program Swap;
Var a,b,tam: Integer;
Begin
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
tam:=a; {tam lấy giá trị của a}
a:=b; {a lấy giá trị của b}
b:=tam;{b lấy lại giá trị của tam}
Writeln('a = ',a,’ b = ‘,b);
Người soạn: Đinh Văn Thái
19
Bài giảng ngôn ngữ lập trình Pascal
Readln;
End.
b/ Không được phép dùng biến trung gian.
Program Swap;
Var a,b: Integer;
Begin
Write('Nhap vao a= '); Readln(a);
Write('Nhap vao b= '); Readln(b);
a:=a+b; {a lấy tổng giá trị của a+b}
b:=a-b; {b lấy giá trị của a}
a:=a-b; {a lấy lại giá trị của b}
Writeln('a = ',a,’ b = ‘,b);
Readln;
End.
BÀI TẬP CHƯƠNG IV
Bài tập 1: Viết chương trình tính khoảng cách từ một điểm I(x
i
,y
i
) đến đường thẳng có
phương trình D: Ax + By + C = 0.
Gợi ý:
Công thức tính khoảng cách: h =
22
..
BA
CyBxA
ii
+
++
Bài tập 2: Viết chương trình tách một số n thành 2 số a, b sao cho tích P=a*b
2
đạt cực đại
với n được nhập vào từ bàn phím.
Gợi ý:
Gọi x là số thứ hai thì số thứ nhất là: (n-x). Theo đề ta có: P(x) = x
2
.(n-x).
Hàm P đạt cực đại khi P’(x) = -3x
2
+ 2nx = 0 x = 2n/3.
Bài tập 3: Viết chương trình nhập vào ba cột điểm với các hệ số 1,2 và 3. Tính và in lên
màn hình điểm trung bình cộng.
Bài tập 4: Viết chương trình nhập vào số nguyên dương n, in lên màn hình tổng sau:
S = 1
2
+2
2
+3
2
+…+n
2
.
(Biết công thức s = n*(n+1)*(2*n+1) div 6)
Người soạn: Đinh Văn Thái
20
Bài giảng ngôn ngữ lập trình Pascal
CHƯƠNG V
CÂU LỆNH CÓ CẤU TRÚC
I. CÂU LỆNH RẼ NHÁNH
1.1. Lệnh IF
Cú pháp:
(1) IF <btdk> THEN CL;
(2) IF <btdk> THEN CL1 ELSE CL2;
Trong đó: btdk ký hiệu cho biểu thức logic.
Dạng (1) gọi là dạng thiếu, dạng (2) gọi là dạng đủ.
Ý nghĩa:
(1) Nếu btdk nhận giá trị true thì máy sẽ thực hiện CL , ngược lại thì không thực hiện.
(2) Nếu btdk nhận giá trị true thì máy sẽ thực hiện CL1, ngược lại thì thực hiện CL2.
Sơ đồ thực hiện:
Chú ý: Khi sử dụng câu lệnh IF thì đứng trước từ khoá ELSE không được có dấu chấm
phẩy (;).
Các ví dụ:
Ví dụ 1: Viết chương trình nhập vào một số nguyên và kiểm tra xem số vừa nhập là số
chẵn hay số lẻ.
Uses crt;
Var x:integer;
Begin
Write('Nhap vao mot so nguyen : '); Readln(x);
If x MOD 2=0 Then
Người soạn: Đinh Văn Thái
21
(1)
btdk
+ -
CL
...
(2)
btdk
+ -
CL1 CL2
...
Bài giảng ngôn ngữ lập trình Pascal
Writeln('So vua nhap vao la so chan')
Else
Writeln('So vua nhap vao la so le');
Readln;
End.
Ví dụ 2: Viết chương trình giải phương trình bậc nhất ax+b=0
Uses Crt;
Var a,b,x : real;
Begin
Write('a = '); Readln(a);
Write('b = '); Readln(b);
If a = 0 Then { Nếu a bằng 0 }
If b = 0 Then { Trường hợp a = 0 và b = 0 }
Writeln('Phuong trinh co vo so nghiem')
Else { Trường hợp a=0 và b
≠
0 }
Writeln('Phuong trinh vo nghiem')
Else { Trường hợp a
≠
0 }
Begin
x:= -b/a;
Writeln('Phuong trinh co nghiem la :',x:0:2);
End;
Readln;
End.
1.2. Lệnh CASE
Cú pháp:
Dạng 1 Dạng 2
CASE <BT> OF
Const 1: CL
1
;
Const 2: CL
2
;
...
Const n: CL
n
;
END;
CASE <BT> OF
Const 1: CL
1
;
Const 2: CL
2
;
...
Const n: CL
n
;
ELSE CL
n+1
;
END;
Trong đó:
BT: Biểu thức kiểu vô hướng đếm được như kiểu nguyên, kiểu logic, kiểu ký tự,
kiểu liệt kê.
Người soạn: Đinh Văn Thái
22
Bài giảng ngôn ngữ lập trình Pascal
Const i: Hằng thứ i, có thể là một giá trị hằng, các giá trị hằng (phân cách nhau bởi
dấu phẩy) hoặc các đoạn hằng (dùng hai dấu chấm để phân cách giữa giá trị đầu và
giá trị cuối).
Giá trị của biểu thức và giá trị của tập hằng i (i=1¸n) phải có cùng kiểu.
Khi gặp lệnh CASE, chương trình sẽ kiểm tra:
- Nếu giá trị của biểu thức BT nằm trong tập hằng const i thì máy sẽ thực hiện lệnh CL
i
tương ứng.
- Ngược lại:
+ Đối với dạng 1: Không làm gì cả.
+ Đối với dạng 2: thực hiện lệnh CL
n+1
.
Các ví dụ:
Viết chương trình nhập vào tuổi của một người và cho biết người đó là thiếu niên, thanh
niên, trung niên hay lão niên. Biết rằng: nếu tuổi nhỏ hơn 18 là thiếu niên, từ 18 đến 39 là
thanh niên, từ 40 đến 60 là trung niên và lớn hơn 60 là lão niên.
Uses crt;
Var tuoi:Byte;
Begin
Write(Nhap vao tuoi cua mot nguoi:'); Readln(tuoi);
Case tuoi Of
1..17: Writeln(Nguoi nay la thieu nien');
18..39: Writeln(Nguoi nay la thanh nien');
40..60: Writeln(Nguoi nay la trung nien');
Else Writeln(Nguoi nay la lao nien');
End;
Readln;
End.
II. CÂU LỆNH LẶP
2.1. Vòng lặp xác định (FOR - DO)
Cú pháp: Có hai dạng sau:
Dạng tiến
FOR <biến đếm>:=<giá trị đầu> TO <giá trị cuối> DO CL;
Dạng lùi
FOR <biến đếm>:=<giá trị cuối> DOWNTO <giá trị đầu> DO CL;
Sơ đồ thực hiện vòng lặp FOR:
Người soạn: Đinh Văn Thái
23
Dạng tiến
Biến đếm:=đầu
Biến đếm<=cuối
+
-
Thoát
CL;
INC(Biến đếm);
Dạng lùi
Biến đếm:=cuối
Biến đếm>=cuối
+
-
Thoát
CL;
DEC(Biến đếm);
Bài giảng ngôn ngữ lập trình Pascal
Ý nghĩa:
Dạng tiến: Câu lệnh sẽ được thực hiện bằng số lần mà Biến đếm được gán tăng dần
lần lượt từ giá trị của giá trị đầu đến giá trị của giá trị cuối.
Dạng lùi: Câu lệnh sẽ được thực hiện bằng số lần mà Biến đếm được gán giảm dần
lần lượt từ giá trị của giá trị cuối đến giá trị của giá trị đầu
Chú ý: Khi sử dụng câu lệnh lặp FOR cần chú ý các điểm sau:
Không nên tuỳ tiện thay đổi giá trị của biến đếm bên trong vòng lặp FOR vì làm như
vậy có thể sẽ không kiểm soát được biến đếm.
Giá trị Max và Min trong câu lệnh FOR sẽ được xác định ngay khi vào đầu vòng lặp.
Do đó cho dù trong vòng lặp ta có thay đổi giá trị của nó thì số lần lặp cũng không
thay đổi.
Các ví dụ:
Ví dụ 1: Viết chương trình tính tổng S = 1+2+...+N.
Dùng vòng lặp FOR.
Program TinhTong;
Uses crt;
Var N,i,S:integer;
Begin
Clrscr;
Write('Nhap vao gia tri cua N :'); Readln(N);
S:=0;
For i:=1 to N do S:=S+i;
Writeln('Ket qua la :',S);
Người soạn: Đinh Văn Thái
24
Bài giảng ngôn ngữ lập trình Pascal
Readln;
End.
Ví dụ 2: Viết chương trình nhập vào N số nguyên từ bàn phím. Hãy tính và in ra màn hình
tổng của các số vừa được nhập vào.
Ý tưởng:
Dùng phương pháp cộng dồn. Cho vòng lặp FOR chạy từ 1 tới N, ứng với lần lặp thứ i,
ta nhập vào số nguyên X và đồng thời cộng dồn X vào biến S.
Program Tong;
Uses crt;
Var N,S,i,X : Integer;
Begin
Clrscr; S:=0;
For i:=1 To n Do
Begin
Write('Nhap so nguyen X= '); Readln(X);
S:=S+X;
End;
Writeln(‘Tong cac so duoc nhap vao la: ‘,S);
Readln;
End.
2.2. Vòng lặp không xác định
Cú pháp:
Dạng REPEAT Dạng WHILE
Repeat
CL;
Until <btlg>;
While <btlg> Do CL;
Sơ đồ hoạt động:
Người soạn: Đinh Văn Thái
25
Repeat
CL
btlg
+
-
Thoát
While
btlg
+
-
Thoát
CL;