Tóm tắt lý thuyết pascal
ÔN THI HỌC SINH GIỎI PASCAL (LÝ THUYẾT)
- CÁC KIỂU DỮ LIỆU CƠ BẢN
- Kiểu logic
– Từ khóa: BOOLEAN
– miền giá trị: (TRUE, FALSE).
– Các phép toán: phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, NOT.
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 | NOT A |
TRUE | TRUE | TRUE | TRUE | FALSE |
TRUE | FALSE | FALSE | TRUE | FALSE |
FALSE | TRUE | FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE | FALSE | TRUE |
- Kiểu số nguyên
2.1. Các kiểu số nguyên
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 | -2 147 483 648 ® 2 147 483 647 | 4 byte |
Int64 | 2^63…2^63-1 | |
Qword | 0…2^64-1 |
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).
- Kiểu số thực
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 |
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ú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD.
3.3. Các hàm số học sử dụng cho kiểu số nguyên và số thực:
Thủ tục/ hàm | chức năng |
Biến kiểu nguyên | |
Sqr(x) | Cho giá trị bằng bình phương của biến x |
Random(N) | Hàm có biểu thức N kiểu Word và cho giá trị là một số nguyên ngẫu nhiên trong phạm vi từ 0 đến N-1. Khi dùng hàm này ta phải gọi thủ tục randomize |
Biến kiểu thực | |
Abs(x) | Cho giá trị bằng trị tuyệt đối củ giá trị biến x hoặc số thực x |
Int(x) | Phần nguyên của số thực x (kết quả kiểu số thực) |
Trunc(x) | Phần nguyên của số thực x (kết quả kiểu số nguyên) |
Sqr(x) | Cho giá trị bằng bình phương của giá trị biến x hoặc số thực x |
Sqrt(x) | Cho giá trị bằng căn bậc hai của giá trị không âm của biến x hoặc số thực không âm x |
Round(x) | Làm tròn phần lẽ của x đến số nguyên gần nhất |
- Kiểu ký tự
– Từ khoá: CHAR.
– Kích thước: 1 byte.
– Để 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.
– Các phép toán: =, >, >=, <, <=,<>.
* 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’.
– SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: SUCC(‘A’)=’B’.
- CÂU LỆNH RẼ NHÁNH
1.1. Lệnh IF
Cú pháp:
- Dạng đủ: IF < điều kiện> THEN <câu lệnh 1> ELSE <câu lệnh 2> ;
- Dạng khuyết : IF < điều kiện> THEN <câu lệnh >;
BÀI TẬP:
1.1.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ẻ.
1.1.2: Viết chương trình giải phương trình bậc nhất ax+b=0
1.2. Lệnh CASE
Cú pháp:
Dạng 1 | Dạng 2 |
CASE B OF
Const 1: S1; Const 2: S2; … Const n: Sn; END; |
CASE B OF
Const 1: S1; … Const n: Sn; ELSE Sn+1; END; |
Trong đó:
- B: 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ê.
- 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 B nằm trong tập hằng const i thì máy sẽ thực hiện lệnh Si 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 Sn+1.
BÀI TẬP:
1.2.1: 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.
1.2.2: Viết chương trình nhập vào ngày, tháng, năm. Máy sẽ hiện lên ngày, tháng, năm hôm sau.
Gợi ý:
Biện luận theo tháng. Gom tháng thành 3 nhóm: tháng có 31 ngày (1,3,5,7,8,10,12), tháng có 30 ngày (4,6,9,11) và tháng 2 (có 28 hoặc 29 ngày tùy theo năm nhuận).
Dùng lệnh lựa chọn:
CASE thang OF
1,3,5,7,8,10,12: ……….
4,6,9,11: …………………
2: …………………………..
END;
- CÂU LỆNH LẶP
2.1. Vòng lặp xác định
Có hai dạng sau:
Dạng tiến
FOR <biến đếm>:=<giá trị Min> TO <giá trị Max> DO S;
Dạng lùi
FOR <biến đếm>:=<giá trị Max> DOWNTO <giá trị Min> DO S;
BÀI TẬP:
2.1.1: Viết chương trình tính tổng S = 1+2+…+N.
2.1.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.
2.2. Vòng lặp không xác định
Dạng REPEAT | Dạng WHILE |
Repeat < câu lệnh>;
Until < điều kiện>; |
While < điều kiện>
Do < câu lệnh>; |
Ý nghĩa:
- Dạng REPEAT: Lặp lại < câu lệnh> cho đến khi < điều kiện>=TRUE thì dừng.
- Dạng WHILE: Trong khi < điều kiện> =TRUE thì tiếp tục thực < câu lệnh>;.
BÀI TẬP
2.2.1 Viết chương trình nhập vào các số nguyên cho đến khi nào gặp số 0 thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào.
Ý tưởng:
Bài toán này không biết chính xác số lần lặp nên ta không thể dùng vòng lặp FOR. Vì phải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N=0? Do đó ta nên dùng vòng lặp REPEAT.
2.2.2: Viết chương trình nhập vào các số nguyên từ bàn phím cho đến khi nào gặp số nguyên tố thì kết thúc nhập. Tính tổng các số chẵn và trung bình cộng các số lẻ.
Gợi ý:
Dùng vòng lặp REPEAT … UNTIL NTo; để nhập. Trong đó, NTo là biến kiểu Boolean để kiểm tra số được nhập vào có phải là số nguyên tố hay không.
2.2.3: Viết chương trình nhập vào một số nguyên dương. Hãy thông báo lên màn hình số đó có bao nhiêu chữ số và tổng các chữ số của số đó.
Gợi ý:
Dùng vòng lặp WHILE. Trong khi N>0 thì: lấy ra chữ số cuối cùng của N để tính bằng phép toán MOD 10, sau đó bỏ bớt đi chữ số cuối cùng của N bằng phép toán DIV 10.
CHƯƠNG TRÌNH CON: THỦ TỤC VÀ HÀM
- KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON
Chương trình con (CTC) là một đoạn chương trình thực hiện trọn vẹn hay một chức năng nào đó. Trong Turbo Pascal, có 2 dạng CTC:
- Thủ tục (PROCEDURE): Dùng để thực hiện một hay nhiều nhiệm vụ nào đó.
- Hàm (FUNCTION): Trả về một giá trị nào đó (có kiểu vô hướng, kiểu string hoặc kiểu con trỏ). Hàm có thể sử dụng trong các biểu thức.
Ngoài ra, trong Pascal còn cho phép các CTC lồng vào nhau.
II. CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CÓ SỬ DỤNG CTC
PROGRAM Tên_chương_trình;
USES CRT;
CONST …………;
VAR …………;
PROCEDURE THUTUC[(Các tham số)] ;
[Khai báo Const, Type, Var]
BEGIN
…………..
END;
FUNCTION HAM[(Các tham số)] :<Kiểu dữ liệu>;
[Khai báo Const, Type, Var]
BEGIN
…………..
HAM:=<Giá trị>;
END;
BEGIN {Chương trình chính}
……………….
THUTUC[(…)] ;
……………….
A:= HAM[(…)] ;
……………….
END.
Chú ý: Trong quá trình xây dựng CTC, khi nào thì nên dùng thủ tục/hàm?
Dùng hàm |
Dùng thủ tục |
– Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ).
– Lời gọi CTC cần nằm trong các biểu thức tính toán. |
– Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả về kiểu dữ liệu có cấu trúc (Array, Record, File).
– Lời gọi CTC không nằm trong các biểu thức tính toán. |
Ví dụ 1: Viết CTC để tính n! = 1.2…n.
Ý tưởng: Vì bài toán này trả về 1 giá trị duy nhất nên ta dùng hàm.
III. BIẾN TOÀN CỤC VÀ BIẾN ĐỊA PHƯƠNG
- Biến toàn cục: là các biến được khai báo trong chương trình chính. Các biến này có tác dụng ở mọi nơi trong toàn bộ chương trình.
- Biến địa phương: là các biến được khai báo trong các CTC. Các biến này chỉ có tác dụng trong phạm vi CTC đó mà thôi.
Chú ý: Trong một CTC, nếu biến toàn cục trùng tên với biến địa phương thì biến địa phương được ưu tiên hơn.
IV. ĐỆ QUI
4.1. Khái niệm đệ qui
Trong một chương trình, một CTC có thể gọi một CTC khác vào làm việc. Nếu như CTC đó gọi lại chính nó thì gọi là sự đệ qui.
4.2. Phương pháp thiết kế giải thuật đệ qui
- Tham số hóa bài toán
- Tìm trường hợp suy biến.
- Phân tích các trường hợp chung (đưa về các bài toán cùng loại nhưng nhỏ hơn).
Ví dụ: Viết hàm đệ qui để tính n! = 1.2…n.
DỮ LIỆU KIỂU MẢNG (ARRAY)
- KHAI BÁO MẢNG
Cú pháp:
VAR <Biến mảng> : ARRAY [chỉ số] OF <Kiểu dữ liệu>;
Ví dụ:
VAR A: Array[1..100] of Integer; {Mảng 1 chiều}
B: Array[1..100,1..200] of integer; {Mảng 2 chiều: 100 hàng 200 cột}
C: Array[Byte] of Char;
- XUẤT NHẬP TRÊN DỮ LIỆU KIỂU MẢNG
– Để truy cập đến phần tử thứ k trong mảng một chiều A, ta sử dụng cú pháp: A[k] .
– Để truy cập đến phần tử (i,j) (hàng i cột j) trong mảng hai chiều M, ta sử dụng cú pháp: M[i,j] .
– Có thể sử dụng các thủ tục READ(LN)/WRITE(LN) đối với các phần tử của biến kiểu mảng.
XÂU KÝ TỰ (STRING)
I. KHAI BÁO KIỂU STRING
VAR Tên biến : STRING[Max] ;
Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max Î[0,255] ). Nếu không có khai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255.
Ví dụ:
Var Name : String[30] ;
Line : String[80] ;
St : String; {St có tối đa là 255 ký tự}
II. TRUY XUẤT DỮ LIỆU KIỂU STRING
– Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biến kiểu String.
– Để truy xuất đến ký tự thứ k của xâu ký tự, ta sử dụng cú pháp sau: Tênbiến[k] .
III. CÁC PHÉP TOÁN TRÊN XÂU KÝ TỰ
3.1. Phép nối xâu: +
3.2. Các phép toán quan hệ: =, <>, <, <=, >, >=.
Chú ý: Các phép toán quan hệ được so sánh theo thứ tự từ điển.
IV. CÁC THỦ TỤC VÀ HÀM VẾ XÂU KÝ TỰ
Thủ tục/ hàm | chức năng |
Inc(x) | Cho kí tự đứng ngay sau kí tự ứng với giá trị hiện thời của x trong bộ mã ASCII |
Dec(x) | Cho kí tự đứng ngay trước kí tự ứng với giá trị hiện thời của x trong bộ mã ASCII |
Chr(x) | Cho kí tự có mã ASCII là x VD: chr(65)=’A’ |
Ord(c) | Cho giá trị số mã ASCII của kí tự c VD: Ord(‘A’)=65 |
Pred(c) | Cho kí tự đứng ngay trước kí tự c trong bảng ASCII |
Succ(c) | Cho kí tự đứng ngay sau kí tự c trong bảng ASCII |
Upcase(c) | Cho giá trị bằng chữ cái hoa tương ứng ( nếu c là chữ cái tiếng Anh), ngược lại hàm cho giá trị bằng giá trị của c |
Lowercase(c) | Cho giá trị bằng chữ thường tương ứng ( nếu c là chữ cái tiếng Anh), ngược lại hàm cho giá trị bằng giá trị của c |
Length(st) | Cho độ dài của chuỗi st |
Pos(s,st) | Cho vị trí đầu tiên tìm thấy chuỗi s trong chuỗi st, cho kết quả 0 nếu không tìm thấy |
Copy(st,k,m) | Cho m kí tự của st tính từ vị trí k |
Concat(st1,st2,…stn) | Ghép nối các chuỗi st1, st2,…,stn theo thứ tự đó thành 1 chuỗi duy nhất |
Delete(st,k,m) | Xoá m kí tự của st tính từ vị trí k |
Insert(s,st,k) | Chèn chuỗi s vào chuỗi st tại vị trí k (chèn vào phía trước vị trí k) |
Str(x,st) | Biến đổi số nguyên hay số thực x thành kiểu chuỗi và gán cho biến chuỗi st |
Val(st,x,k) | Biến đổi chuỗi số thành số nguyên hay số thực và gán cho biến x. |
Hàm chuẩn trả về giá trị logic | |
Odd(x) | Với biểu thức số nguyên x, cho giá trị TRUE nếu x lẻ, giá trị FALSE nếu x chẵn |
DỮ LIỆU KIỂU FILE VĂN BẢN
3.1. Khai báo
Var <Tên biến file>: Text;
3.2. Các lệnh và hàm chỉ tác động trên file dạng text
* Lệnh read và Readln
Cú pháp: Read(F,x) hay Readln(F,x);
Chức năng: Đọc một dòng từ vị trí con trỏ file và gán cho biến x. Biến x có thể nhận các kiểu: Char, String hoặc kiểu số. Lệnh readlc đọc xong xuống dòng tiếp theo.
* Lệnh Write và Writeln
Cú pháp: Write(F, x); hay Writeln(F, x);
Chức năng: Ghi giá trị x vào file ở vị trí con trỏ file. Lệnh Writeln sau khi ghi con trỏ file sẽ chuyển về đầu dòng sau.
* Hàm EOLn
Cú pháp: EOLn(F);
Chức năng: Hàm trả về giá trị True nếu con trỏ đang ở cuối một dòng, ngược lại hàm trả về giá trị False.
* Sau đây là các thao tác cơ bản khi xuất nhập file:
Ghi dữ liệu vào file |
Đọc dữ liệu từ file |
ASSIGN(f,FileName);
REWRITE(f); … WRITE(f,value); … CLOSE(f); |
ASSIGN(f,FileName);
RESET(f); … READ(f,x); … CLOSE(f); |
Tải về Giao trinh_Pascal_LT