Vous êtes sur la page 1sur 27

LẬP TRÌNH PASCAL

I. MỘT SỐ VẤN ĐỀ CƠ BẢN VỀ CHƯƠNG TRÌNH PASCAL


1. CẤU TRÚC TỔNG QUÁT CỦA MỘT CHƯƠNG TRÌNH PASCAL
Cấu trúc của một chương trình Pascal
(1) PROGRAM …; {Khai báo tên chương trình}
(2) USES …; {Khai báo thư viện cần sử dụng}
(3) CONST … {Khai báo hằng}
(4) TYPE … {Khai báo kiểu tự định nghĩa}
(5) VAR …; {Khai báo biến toàn cục}

(6) FUNCTION {Hàm}


Var … {Khai báo biến cục bộ}
Begin

End;

(7) PROCEDURE {Thủ tục}


Var … {Khai báo biến cục bộ}
Begin

End;

(8) Begin {Chương trình chính}



End.
2

2. TỪ KHÓA
– Từ khóa chung:
PROGRAM, BEGIN, END, PROCEDURE, FUNCTION
– Từ khóa để khai báo:
CONST, VAR, TYPE, ARRAY, STRING, RECORD, SET, FILE, LABEL
– Từ khóa của lệnh lựa chọn:
IF … THEN … ELSE, CASE … OF … ELSE … END;
– 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, HALT
– Từ khóa toán tử:
AND, OR, NOT, IN, DIV, MOD
3. ĐẶT TÊN
Tuân thủ 3 quy tắc
- Không trùng với từ khóa;
- Không chứa khoảng trắng và các ký tự đặc biệt;
- Không bắt đầu là số.
Ví dụ:

Đặt tên chương trình: PROGRAM CT_tim_so_nguyen_to;

Đặt tên hằng số CONST hoten = ‘Nguyen Y Van’;

Đặt tên kiểu định nghĩa TYPE mang = array [1..1000] of integer;

Khai báo tên biến VAR a,b : word; dientich: Qword;

Khai báo tên hàm FUNTION tongchuso(a: word) : byte;

Khai báo tên thủ tục PROCEDURE xoaten(s: string);

4. CÁC LỆNH VÀO RA


write(): in ra màn hình liền sau kí tự cuối.
writeln(): in xuống một hàng.
Read(): đọc biến.
readln: dừng chương trình
3

II. HÀM, THỦ TỤC TRONG CÁC THƯ VIỆN


1. Thư viện CRT
Hàm/Thủ tục Ý nghĩa
HỆ THỐNG
ClrScr Xoá màn hình
Xoá các ký tự từ vị trí con trỏ đến cuối mà không di
Clreol
chuyển vị trí con trỏ
GotoXY(x,y) Dời con trỏ màn hình đến cột x, dòng y (x, y:byte;).
Windows(x1,y1,x2,y2) Thay đổi cửa sổ màn hình
TextMode(co40) Tạo kiểu chữ lớn
LowVideo Giảm độ sáng màn hình
Delay(ms) Tạm dừng trong ms (miligiây) (ms: word;)
Cho kết quả là phím được nhấn. VD: Khi nhấn phím ‘A’
ReadKey
từ bàn phím thì hàm ReadKey sẽ cho kết quả là ‘A’.
Phát ra âm thanh qua loa bên trong (Internal Speaker) với
Sound(Hz)
tần số Hz (Hz: word;)
Exit Thoát khỏi chương trình
Deline Xoá một dòng đang chứa con trỏ
Insline Chèn thêm một dòng vào vị trí của con trỏ hiện hành
TextBackground(color) Màu nền văn bản
TextColor(color) Chọn màu chữ in ra màn hình
HighVideo Tăng độ sáng màn hình
NormVideo Màn hình trở lại chế độ sáng bình thường
Halt Ngưng thực hiện chương trình và trở về hệ điều hành
Keypressed Hàm cho kết quả True nếu có một phím được nhấn.
NoSound Ngừng phát âm thanh
DỮ LIỆU SỐ
Randomize Khởi tạo sàn sinh số ngẫu nhiên.
Move(a,b,n) Sao chép trong bộ nhớ một khối n byte từ biến a sang b
Exp(x) Hàm số mũ cơ số tự nhiên e
Int(x) Cho kết quả thực là phần nguyên của số thập phân x
Ln(x) Hàm logarit cơ số tự nhiên
Sqr(x) Bình phương của số x.
Pred(x) Cho kết quả là số nguyên đứng trước số nguyên x. VD:
4

pred(3.14)=3
Inc(n) n:=n+1; (n là số nguyên)
Round(n) Làm tròn số thực n
Cos(x) Cho kết quả là cos x
Random(n) Sinh số ngẫu nhiên trong phạm vi n. [3]
Abs(n) Cho giá trị tuyệt đối của n
Frac(x) Cho kết quả là phần thập phân của số x
Trunc(x) Cho kết quả nguyên là phần nguyên của số thập phân x
Odd(x) Cho kết quả True nếu x số lẻ.
Sqrt(x) Căn bậc hai của x
Cho kết quả là số nguyên đứng sau số nguyên x. VD:
Succ(x)
succ(3.14)=4
Dec(n) n:=n-1; (n là số nguyên)
Arctan(x) Arctan x với x tính bằng Radian
sin(x) Cho kết quả là sin x
KIỂU FILE
Assign(f,p) Đọc file có đường dẫn p (đặt trong ' '), gán vào biến file f.
Reset(f) Đọc dữ liệu từ file f có sẵn
Append(f) Chèn thêm dữ liệu cho file
Erase(f) Xóa file
Rewrite(f) Ghi file mới lên đĩa
Close(f) Đóng file
Rename() Đặt lại tên file
KIỂU XÂU
Chr(vt) Trả về một kí tự có vị trí là vt trong bảng mã ASCII
Upcase(n) Đổi kí tự chữ thường sang chữ hoa
Copy(s,vt,a) Lấy từ xâu s thành 1 xâu con có độ dài a bắt đầu từ vị trí vt
Delete(s,vt,a) Xóa a ký tự khỏi xâu s bắt đầu từ vị trí vt
Ord(s) Trả về một số thứ tự của kí tự s trong bảng mã ASCII
Length(s) Cho kết quả là chiều dài của xâu
Insert(s1,s2,vt) Chèn xâu s1 vào xâu s2 bắt đầu từ vị trí vt
Pos(s1,s2) Cho vị trí đầu tiên xâu x1 xuất hiện trong xâu s2
2. Thư viện GRAPH
5

Hàm/Thủ tục Ý nghĩa


Initgraph(a,b) Khởi tạo chế độ đồ hoạ.
Outtext() In ra màn hình tại góc trên bên trái.
Rectangle(x1,y1,x2,y2) Vẽ hình chữ nhật.
Moveto(x,y) Lấy điểm xuất phát để vẽ đoạn thẳng.
Circle(x,y,n) Vẽ đường tròn.
Floodfill(a,b,n) Tô màu cho hình.
Setcolor(x) Chọn màu.
Cleardevice Xoá toàn bộ màn hình.
Bar(a,b,c,d) Vẽ thanh.
Arc(a,b,c,d,e) Vẽ cung tròn.
Putpixel(x,y,n) Vẽ điểm.
Etfillstyle(a,b) Tạo nền cho màn hình.
Getimage(x1,y1,x2,y2,p) Nhớ các hình vẽ trên vùng cửa sổ xác định.
Closegraph Tắt chế độ đồ hoạ.
Outtextxy(x,y,) In ra màn hình tại toạ độ màn hình.
Line(x1,y1,x2,y2) Vẽ đoạn thẳng.
Lineto(x,y) Lấy điểm kết thúc để vẽ đoạn thẳng.
Ellipse(x,y,o1,o2,a,b) Vẽ hình elip.
Getfillpattern(x) Tạo biến để tô.
Setfillpattern(x,a) Chọn màu để tô.
Settextstyle(n,a,b) Chọn kiểu chữ.
Bar3d(a,b,c,d,n,h) Vẽ hộp.
Setbkcolor(n) Tô màu nền.
Getmem(p,1) Chuyển biến để nhớ dữ liệu.
Setlinestyle(a,b,c) Chọn kiểu đoạn thẳng.
Putimage(x,y,p,n) In ra màn hình các hình vừa nhớ.
3. Thư viện DOS
getdate(y,m,d,t): lấy các dữ liệu về ngày trong bộ nhớ.
gettime(h,m,s,hund): lấy các dữ liệu về giờ trong bộ nhớ.
findnext(x): tìm kiếm tiếp.
Findfirst($20,dirinfo): tìm kiếm. ...
4. MÀU TRONG PASCAL
6

Mã màu Tên thay thế Ý nghĩa Mã màu Tên thay thế Ý nghĩa
0 Black Đen 8 DarkGray Xám tối
1 Blue Xanh lam 9 LightBlue Lam sáng
2 Green Lục 10 LightGreen Lục sáng
3 Cyan Lục lam 11 LightCyan Lục lam sáng
4 Red Đỏ 12 LightRed Đỏ sáng
5 Magenta Tím sen 13 LightMagenta Tím sen sáng
6 Brown Nâu 14 Yellow Vàng
7 LightGray Xám sáng 15 White Trắng

5. BẢNG MÃ ASCII
M HIỂN HIỂN HIỂN HIỂN HIỂN
MÃ MÃ MÃ MÃ
à THỊ THỊ THỊ THỊ THỊ
Khoảng
32 trống 51 3 70 F 89 Y 108 l
33 ! 52 4 71 G 90 Z 109 m
34 " 53 5 72 H 91 [ 110 n
35 # 54 6 73 I 92 \ 111 o
36 $ 55 7 74 J 93 ] 112 p
37 % 56 8 75 K 94 ^ 113 q
38 & 57 9 76 L 95 _ 114 r
39 ' 58 : 77 M 96 ` 115 s
40 ( 59 ; 78 N 97 a 116 t
41 ) 60 < 79 O 98 b 117 u
42 * 61 = 80 P 99 c 118 v
43 + 62 > 81 Q 100 d 119 w
44 , 63 ? 82 R 101 e 120 x
45 - 64 @ 83 S 102 f 121 y
46 . 65 A 84 T 103 g 122 z
47 / 66 B 85 U 104 h 123 {
48 0 67 C 86 V 105 i 124 |
49 1 68 D 87 W 106 j 125 }
50 2 69 E 88 X 107 k 126 ~
7

III. KIỂU DỮ LIỆU


1. Kiểu số nguyên
Dung lượng
Tên kiểu Khoảng giá trị
theo bytes
Byte 0.. 255 1
Shortint -128.. 127 1
Word 0.. 65 535 2
Integer -32 768.. 32 767 2
Longint -2 147 483 648.. 2 147 483 647 4
Longwor
d 0.. 4 294 967 295 4
int64 -9 223 372 036 854 775 808.. 9 223 372 036 854 775 807 8
QWord 0.. 18 446 744 073 709 551 615 8

 Các phép toán số học đối với số nguyên


Toán tử ý nghĩa
div chia lấy phần nguyên
mod chia lấy phần dư
+ cộng
- trừ
* nhân
/ chia lấy kết quả đầy đủ (kết quả là 1 số thực)

Lưu ý :
- Cần chú ý về miền giới hạn của kiểu dữ liệu.
- Trong một biểu thức, các phép toán có mức ưu tiên cao hơn (*, /, div và mod) sẽ được
thực hiện trước; các phép toán có mức ưu tiên thấp hơn (+, -) được thực hiện sau. Các phép
toán có cùng mức ưu tiên được thực hiện theo thứ tự từ trái qua phải.
- Khi một biểu thức có chứa các biểu thức con nằm trong ngoặc, thì các biểu thức con
này được thực hiện trước. Nếu có nhiều ngoặc lồng nhau thì các biểu thức con trong cùng được
thực hiện trước.
8

2. Kiểu số thực
Kiểu số thực (thuộc tập R trong toán học) được khai báo bằng từ khoá REAL, miền giá
trị của kiểu số thực là -1.7*10-38 đến 1.7*1038.
Các phép toán số học : +, - , *, /
Số chữ số Dung lượng
Tên kiểu Khoảng cách có nghĩa theo bytes
Real Phụ thuộc vào nền tảng phần cứng Không rõ 4 đến 8
Single 1.6E-45.. 3.4E38 44050 4
Double 5.0E-324.. 1.7E308 15-16 8
Extended 1.9E-4932.. 1.1E4932 19-20 10
Comp -2E64+1.. 2E63-1 19-20 8
-922337203685477.5808..
Currency 922337203685477.5807 19-20 8

3. Các hàm số học chuẩn (dùng cho dữ liệu kiểu số nguyên và số thực):

Hàm Ý nghĩa Kiểu tham số Kiểu hàm

abs(x) Tính trị tuyệt đối của x Số nguyên, thực Cùng kiểu tham số

arctan(x) Hàm ngược của tan(x), tính bằng radian Số nguyên, thực Số thực

cos(x) Cos(x) tính bằng radian Số nguyên, thực Số thực

exp(x) ex Số nguyên, thực Số thực

ln(x) Log cơ số e của x Số nguyên, thực Số thực

round(x) Làm tròn x Số thực Số nguyên

sin(x) Sin(x) tính bằng radian Số nguyên, thực Số thực

sqr(x) x2 Số nguyên, thực Cùng kiểu tham số

sqrt(x) Căn bậc hai của x Số nguyên, thực Số thực

trunc(x) Lấy phần nguyên của x (bỏ phần lẻ) Số thực Số nguyên

odd(x) Cho giá trị true nếu x là số lẻ Số nguyên Boolean


9

4. Kiểu ký tự
Dung lượng
Tên Số ký tự lưu được theo bytes
Char 1 1
Widechar 1 ký tự unicode 2
String 255
Shortstrin
g Tương tự String (255)
Tùy thuộc vào bộ nhớ (càng nhiều bộ nhớ thì lưu được
Ansistring càng nhiều - tối đa 2GB)

Được khai báo bằng từ khoá CHAR.


Kiểu ký tự gồm các ký tự của bảng mã ASCII (256 ký tự).
Một ký tự được biểu diễn trong cặp dấu nháy đơn ’ ’.
Các hàm liên quan :
ord(‘x’) : Trả về số thứ tự tương ứng với ký tự x trong bảng mã ASCII.
chr(x) : Trả về ký tự tương ứng với thứ tự x trong bảng mã ASCII.
Ví dụ : Ord(‘A’)=65
Ord(‘0’) = 48
Chr(65)=’A’
Chr(48) = ‘0’
5. Kiểu logic
Kiểu Logic là kiểu chỉ nhận 1 trong 2 giá trị là đúng (True) hoặc sai (False), được khai
báo bằng từ khoá Boolean.
Các phép toán so sánh cho kết quả là một kiểu boolean
Toán tử Định nghĩa

< Nhỏ hơn (hoặc đứng trước)


> Lớn hơn (hoặc đứng sau)
= Bằng
<= Nhỏ hơn hoặc bằng
>= Lớn hơn hoặc bằng
<> Khác nhau

Các phép toán trên kiểu boolean:


Phép phủ định Not
Phép hội and
Phép tuyển or
10
11

IV. HẰNG, BIẾN, BIỂU THỨC, CÂU LỆNH


1. Hằng:
Hằng là đại lượng có giá trị không thay đổi. Một hằng có thể là số, kí tự, xâu ký tự hay
là kiểu logic. Hằng được khai báo bằng từ khóa CONST:
CONST
Tên hằng = giá trị của hằng;
- Ví dụ :
Const
PI=3.14;
N=100;
GIOI = ‘A’;
DUNG = FALSE;
2. Biến:
Biến là đại lượng có giá trị có thể thay đổi trong khi chương trình được thực hiện.
Cách khai báo :
VAR
Tên_biến_1 : kiểu_dữ_liệu_1;
Tên_biến_2 : kiểu_dữ_liệu_2;
- Ví dụ :
Var a, b: integer;
C: real;
3. Biểu thức:
- Định nghĩa : Biểu thức là một công thức tính toán bao gồm các phép toán và toán hạng
(hằng, biến, hàm) và các dấu ngoặc. Các toán hạng phải tương thích với nhau về kiểu.
- Có 2 loại biểu thức :
+ Biểu thức số học : có giá trị là 1 số (số nguyên hay thực).
+ Biểu thức logic : có giá trị là là 1 kiểu BOOLEAN (TRUE hay FALSE).
- Thứ tự ưu tiên : Khi tính giá trị của một biểu thức, ngôn ngữ pascal quy ước thứ tự ưu
tiên của các phép toán từ cao đến thấp như sau:
phép gọi hàm
Not
*,/, div, mod, and
+, -, or, xor
<, >, =, <=, >=, <>
12

4. Câu lệnh:
- Là những công việc mà chương trình cần phải thực hiện để xử lý các dữ liệu đã được
khai báo. Các câu lệnh cách nhau bằng dấu chấm phẩy (;)
- Có 2 loại câu lệnh :
+ Lệnh đơn giản : là những lệnh đơn, không chứa các lệnh khác.
Ví dụ : write, writeln, read, readln, goto…
+ Lệnh có cấu trúc (lệnh hợp thành hay lệnh ghép) : bao gồm nhiều lệnh khác (lệnh đơn
hay lệnh ghép khác) bên trong.
Ví dụ : if … then …else …,
case…of…,
for …to…do …,
repeat…until…,
while…do…
5. Một số câu lệnh đơn cơ bản:
5.1. Lệnh gán:
Là lệnh dùng để gán giá trị cho các biến, ký hiệu :=
Cú pháp:
tên biến := biểu thức;
Trong đó:
+ Vế trái của phép gán chỉ có thể là 1 biến duy nhất.
+ Biểu thức có thể là một hằng, một biến khác đã được gán giá trị trước đó, hay là một
biểu thức.
Chú ý: tính tương thích về kiểu dữ liệu của 2 vế : vế trái và vế phải phải cùng kiểu dữ
liệu. Có trường hợp ngoại lệ là 1 biến thực (vế trái) có thể nhận 1 giá trị nguyên (vế phải), khi
đó giá trị nguyên sẽ được chuyển đổi thành giá trị thực tương ứng. Nhưng ta không thể làm
ngược lại, tức là gán một giá trị thực cho biến nguyên.
Ví dụ :
Var a,b : integer;
c : real;
Begin
A := 5; {đúng}
C := A; {đúng}
B := C+3; {sai}
End.
13

5.2. Câu lệnh nhập/xuất:


* Các lệnh xuất dữ liệu ra màn hình
Write (‘x’); Xuất ra màn hình ký tự x
Write (x); Xuất ra màn hình giá trị của biến x
Write (x:m); Dành m vị trí để xuất giá trị của biến x (x là biến số
nguyên hay ký tự)
Write(x:m:n); Dành m vị trí để xuất giá trị của biến x (x là biến thực),
trong đó lấy n chữ số thập phân.
Writeln; Đưa con trỏ xuống đầu dòng dưới.
Chú ý: Lệnh writeln tương tự như write nhưng sẽ đưa con trỏ xuống đầu dòng dưới
sau khi đã xuất xong dữ liệu.
Ví dụ : Viết chương trình xuất lên màn hình 2 câu sau
Hello Turbo Pascal
Hello Visual Basic
begin
writeln('Hello Turbo Pascal');
writeln('Hello Visual Basic');
readln; {dừng chương trình để xem kết quả, xem xong nhấn enter}
end.
Thay lệnh writeln bằng lệnh write để thấy sự khác nhau.
* Các lệnh nhập giá trị cho các biến từ bàn phím:

Read(x); nhập 1 giá trị từ bàn phím đưa vào cho biến x, nhấn enter
để kết thúc việc nhập
Readln(x);
Readln; Dừng màn hình, nhấn phím enter sẽ tiếp tục
Ví dụ: Viết chương trình nhập vào 2 số nguyên a,b. Tính tích, thương của hai số nguyên
a,b đó.
Program Tinh_tich_thuong_cua_2_so_nguyen;
Var a , b : integer; tich : integer; thuong : real;
Begin
Writeln(‘nhap vao so nguyen a=’); readln(a);
Writeln(‘nhap vao so nguyen b=’); readln(b);
Tich:=a*b;
Thuong:=a/b;
Writeln(‘ Tich la ‘, tich:10);
Writeln(‘ Thuong la ‘, thuong:10:2);
Readln;
End.
14

V. CÁC CẤU TRÚC RẼ NHÁNH


1. CẤU TRÚC IF …THEN …ELSE…
Cú pháp 1 (Câu lệnh điều kiện dạng thiếu):
IF <điều_kiện> THEN <công_việc>;
- Trong đó
 <điều_kiện> là một biểu thức logic (trả về trị true hoặc false).
 Nếu <điều_kiện>là true, <công_việc> sẽ được thực hiện, ngược lại <công_việc>
không thực hiện.
- Lưu đồ thực hiện :

Begin

FALSE
điều_kiện

TRUE
công_việc

End

Ví dụ : Nhập vào 2 số nguyên a, b. Tìm số lớn nhất trong 2 số.


Var a, b, max : integer;
Begin
write('a = '); readln(a);
write('b = ');readln(b);
if (a>b) or (a=b) then max:=a
if b>a then max:=b
writeln('so lon nhat la ',max);
End.

Chú ý : Phần công việc cần thực hiện sau then và sau else trong cấu trúc if chỉ bao gồm
1 lệnh. Nếu công việc cần thực hiện bao gồm từ 2 lệnh trở lên, thì phải dùng cặp từ khóa begin
và end để nhóm các lệnh đó lại thành 1 lệnh phức.
15

* Cú pháp 2 (câu lệnh điều kiện dạng đủ):


IF <điều_kiện> THEN <công_việc_1>
ELSE <công_việc_2>;
Nếu <điều_kiện> nhận giá trị true thì <công_việc_1> được thực hiện, ngược lại (điều
kiện sai) thì <công_việc_2> sẽ được thực hiện.
Lưu đồ thực hiện:
Begin

FALSE
điều_kiện

TRUE
công_việc_1 công_việc_2

End

Chú ý: trước else không dùng dấu chấm phẩy.


Ví dụ : Nhập vào 2 số nguyên a, b. Tìm số lớn nhất trong 2 số.
Var a, b, max : integer;
Begin
readln(a,b);
if a>b then max:=a
else max:=b;
writeln('so lon nhat la ',max);
End.
Có thể kết hợp nhiều cấu trúc if…then… và if…then…else…lại với nhau.
Ví dụ : Nhập vào 1 tháng (từ 1 đến 12), cho biết số ngày của tháng.
Var thang, so_ngay : byte;
Begin
Write(‘Nhap vao 1 thang’);
Read(thang);
If ( thang 2) then so_ngay:= 28;
Else
If (thang =1) or( thang=3) or (thang=5) or (thang=7) or
(thang=8) or (thang=10) or (thang=12) then
so_ngay:= 31
Else so_ngay:=30;
Write(‘So ngay cua thang ’, thang, ‘la:’, so_ngay);
End.
16

2. CẤU TRÚC CASE ... OF


Tuy if...then…else… đủ để thực hiện hầu như bất kỳ cấu trúc có nhiều lựa chọn nào,
nhưng trong một số trường hợp, cấu trúc case...of… tiện lợi và làm chương trình trở nên rõ
ràng, dễ đọc hơn. Ta sẽ xem xét cấu trúc này dưới đây.
Cú pháp:

CASE <biểu_thức> OF
Danh_ sách_hằng_1 : <công_việc_1>;
Danh_ sách_ hằng_2 : <công_việc_2>;
....
Danh_ sách_ hằng_n : <công_việc_n>;
ELSE
<công_việc_0>;
END;

Trong đó
 <biểu_thức> có thể nhận giá trị kiểu nguyên, kiểu logic, hay kiểu kí tự, nhưng
không thể là kiểu số thực.
 Danh_ sách_ hằng_ilà một hay nhiều giá trị có thể của biểu thức.
 Đầu tiên, <biểu_thức> được tính toán, nếu giá trị của nó nằm trong Danh_
sách_ hằng_i thì <công_việc_i> tương ứng với nó sẽ được thực hiện. Nếu giá trị
của biểu thức không thuộc danh sách hằng từ 1 đến n đã được liệt kê thì
<công_việc_0> sau từ khoá else (nếu có) sẽ được thực hiện.

Ví dụ: Nhập vào 1 tháng (từ 1 đến 12), cho biết số ngày của tháng.
var thang, so_ngay : byte;
begin
readln(a);
case thang of
1, 3, 5, 7, 8, 10,12:so_ngay:=31;
4, 6, 9, 11:so_ngay:=30;
2:so_ngay:=28;
end;
writeln('so ngay la : ' ,so_ngay);
readln;
end.
17

VI. CẤU TRÚC LẶP


1. CẤU TRÚC LẶP CÓ SỐ BƯỚC LẶP XÁC ĐỊNH FOR – TO – DO
Cấu trúc lặp for được dùng khi ta biết trước số lần cần lặp lại  cần 1 biến để đếm số
lần đã thực hiện.
* Cú pháp 1:
FOR <biến_ đếm>:= <GT_đầu> TO <GT_cuối> DO <công_việc>;
Hoạt động:
Đầu tiên <biến_đếm> nhận giá trị là <cận_đầu>.
Nếu <biến_đếm><= <GT_cuối> thì <công_việc> được thực hiện
Sau đó <biến_đếm> tự động tăng lên một giá trị và vòng lặp cứ thế tiếp tục đến khi nào
<biến_đếm> lớn hơn <GT_cuối> thì vòng lặp kết thúc.

Begin

biến đếm:= GT_đầu

FALSE
biến_đếm > GT_cuối

TRUE End
công_việc

biến đếm:= biến đếm+1

Chú ý: <biến_đếm>, <GT_đầu>, <GT_cuối> là dữ liệu thuộc kiểu đếm được (SỐ
NGUYÊN).
Ví dụ 1: Xuất 5 lần dòng chữ sau lên màn hình: Hello Turbo Pascal
uses crt;
var I:byte;
Begin
For I:=1 to 5 do
Writeln(‘Hello Turbo Pascal’);
End.
18

Ví dụ 2: Xuất ra màn hình các số từ 1 đến 100, mỗi dòng 10 số.


uses crt;
var I:byte;
Begin
For I:=1 to 100 do
Begin
Write(i:3);
If (I mod 10=0) then Writeln;
End;
End.

Có thể kết hợp các cấu trúc lặp for với nhau hay với các cấu trúc rẽ nhánh đã học: if…
then…else…, case…of…

* Cú pháp 2:

FOR <biến_ đếm>:= <GT_đầu> DOWNTO <GT_cuối> DO <công_việc>;

Hoạt động:
Đầu tiên <biến_đếm> nhận giá trị là <GT_đầu>. Nếu <biến_đếm> >= <GT_cuối> thì
<công_việc> được thực hiện sau đó <biến_đếm> tự động giảm đi một giá trị và vòng lặp cứ
thế tiếp tục đến khi nào <biến_đếm> nhỏ hơn <GT_cuối> thì vòng lặp kết thúc.
Ví dụ 1: Tính tổng S= 1 + 2 +. . . + n. với n là số nguyên dương nhập từ bàn phím
uses crt;
var i, n, s: Integer;
begin
clrscr;
readln(n);
s:=0;
for i:=n downto 1 do
s:=s+i;
writeln('tong la ',s);
readln;
end.
Ví dụ 2: In ra màn hình các ký tự chữ cái theo thứ tự đảo ngược :
uses crt;
var i: char;
Begin
For i:=’z’ downto ‘a’ do
Write(i : 3);
End.
19

2. CẤU TRÚC LẶP CÓ SỐ BƯỚC LẶP KHÔNG XÁC ĐỊNH:


Được sử dụng khi số lần cần thực hiện là không biết trước.
2.1. CẤU TRÚC WHILE:
Cú pháp:
WHILE <điều_kiện> DO <công_việc>;

Begi
n

FALSE
điều_kiện

TRUE End
công_việc

Hoạt động: Đầu tiên <điều_kiện> được kiểm tra. Nếu <điều_kiện> đúng (TRUE) thì
<công_việc> được thực hiện, sau đó quay lại kiểm tra <điều_kiện>, vòng lặp cứ như thế cho
đến khi nào <điều_kiện> sai (FALSE) thì vòng lặp kết thúc.
Chú ý:
+ Trong<công_việc>phải có lệnh để làm cho <điều_kiện> thay đổi giá trị, nếu không
vòng lặp không kết thúc.
+Vòng lặp while kiểm tra <điều_kiện>trước nên <công_việc>có thể không được thực
hiện lần nào.
Ví dụ: Lặp lại việc nhập vào hai số nguyên a,b từ bàn phím cho đến khi nào gặp hai số
mà tích của chúng là số chẵn thì dừng lại. Xuất kết quả a, b, a*b lên màn hình.
Uses crt;
Var a, b : integer;
Begin
Clrscr;
Write(‘Nhap vao 2 so a,b :’); Readln(a,b);
While (a*b mod 2 =1) do
Begin
Write(‘Nhap lai 2 so a,b :’);
Readln(a,b);
End;
Write(‘Ket qua la : a =’, a, ‘b=’,b, ‘tich=’, a*b);
Readln;
End.
20

2.2 CẤU TRÚC REPEAT … UNTIL…


Cú pháp:
REPEAT
<công_việc>;
UNTIL <điều_kiện>;

Hoạt động : Đầu tiên, <công_việc> được thực hiện và sau đó <điều_kiện> được kiểm
tra. Nếu <điều_kiện> có giá trị sai (FALSE) thì vòng lặp được tiếp tục thực hiện, và cứ như
thế cho đến khi nào <điều_kiện> có giá trị đúng (TRUE) thì vòng lặp kết thúc.

Begin

công_việc

điều_kiện
FALSE
TRUE

End

Ví dụ : Lặp lại việc nhập vào hai số nguyên a,b từ bàn phím cho đến khi nào gặp hai số
mà tích của chúng là số chẵn thì dừng lại. Xuất kết quả a, b, a*b lên màn hình.
Var a, b: integer;
Begin
Repeat
Write(‘Nhap vao 2 so a,b :’); Readln(a,b);
Until (a*b mod 2 =0);
Write(‘Ket qua la : a =’, a, ‘b=’,b, ‘tich=’, a*b);
Readln;
End.
Chú ý:
Trong<công_việc>phải có lệnh để làm cho <điều_kiện> thay đổi giá trị, nếu không
vòng lặp không kết thúc.
Vòng lặp Repeat…until…thực hiện <công_việc>trước, nên <công_việc>luôn được
thực hiện ít nhất 1 lần.
21

Ví dụ : Tính tổng các số từ 1 đến N, với N là số nguyên được nhập từ bàn phím
Trường hợp 1 : dùng cấu trúc FOR
Var i, n, tong : integer;
Begin
Write(‘Nhap vao so nguyen N’); Readln(n);
tong:=0;
For i:=1 to n do
tong :=tong+i;
Write(‘Tong la : ’, tong:5);
Readln;
End.

Trường hợp 2 : dùng cấu trúc WHILE


Var i, n, tong : integer;
Begin
Write(‘Nhap vao so nguyen N’); Readln(n);
tong:=0;
while(i<=n)
begin
tong :=tong+i;
i:=i+1;
end;
Write(‘Tong la : ’, tong:5);
Readln;
End.

Trường hợp 3 : dùng cấu trúc REPEAT…UNTIL…


Var i,n, tong : integer;
Begin
Write(‘Nhap vao so nguyen N’); Readln(n);
tong:=0;
Repeat
tong :=tong+i;
i:=i+1;
Until (i>n);
Write(‘Tong la : ’, tong:5);
Readln;
End.
22

VII. MẢNG
Biến mảng: Là biến chứa nhiều phần tử cùng kiểu dữ liệu.
1. MẢNG 1 CHIỀU
Là một dãy các phần tử cùng kiểu dữ liệu, mỗi phần tử được đánh dấu bằng một vị trí
xác định. Ví dụ: Mảng a gồm 6 phần tử: 5 3 6 8 1 4

Giá trị  5 3 6 8 1 4
Vị trí  1 2 3 4 5 6

Ta có: a[1] có giá trị là 5


a[2] + a[3] = 3 + 6 = 9
Phần tử có giá trị lớn nhất là a[4] (số 8 nằm ở vị trí thứ 4)
Các phần tử có giá trị chẵn là a[3], a[4], a[6]
1.1. Cách khai báo mảng: Có 2 cách khai báo:
Khai báo trực tiếp:
var <tên mảng> : array [<chỉ số đầu> .. <chỉ số cuối>] of <kiểu phần tử> ;
Ví dụ: a:array[1..100] of integer;
b,c:array[1..250] of integer;
Khai báo gián tiếp:
type <tên kiểu mảng>=array [kiểu phần tử] of <kiểu chỉ số>;
var <tên mảng> : <tên kiểu mảng>;
Ví dụ: type mang=array[1..100] of integer;
var a,b,c : mang;
1.2. Cách nhập/xuất mảng 1 chiều:
var a:array[1..100] of integer;
n,i:integer;
begin
writeln('Nhap so phan tu cua mang:'); readln(n);
for i:=1 to n do {Nhập phần tử cho mảng}
begin
write('A[',i,']='); readln(A[i]);
end;
for i:=1 to n do {Xuất mảng}
writeln(A[i]);
end.
23

2. MẢNG 2 CHIỀU (MA TRẬN)


- Khái niệm: Nếu mảng 1 chiều là dãy thì mảng 2 chiều là bảng các phần tử cùng kiểu
(bảng các số).
- Tham chiếu: Vì mảng 2 chiều là bảng nên sẽ cần chỉ số hàng và chỉ số cột: A[i,j] với i
là chỉ số hàng, j là chỉ số cột.
2.1. Khai báo: Tương tự như mảng 1 chiều nhưng thêm chỉ số cột.
var <tên mảng> : array [<1> .. <2> , <3> .. <4>] of <kiểu phần tử> ;
Trong đó:
<1> và <2> : chỉ số đầu và cuối của hàng
<3> và <4> : chỉ số đầu và cuối của cột
Ví dụ: Khai báo ma trận a gồm 100 hàng, 200 cột kiểu số nguyên.
Var a : array [1..100, 1..200] of integer;

5 3 6 8 1

4 9 7 10 2

1 8 6 3 5

Ta có:
a[2,3] có giá trị là 7
Phần tử lớn nhất là a[2,4]
2.2. Cách nhập/xuất mảng 2 chiều:
var A:array[1..50,1..50] of Integer;
i,j,N,Max,k,c,M:Integer;
begin
write('So hang cot:');readln(N,M);Max:=0;
for i:=1 to N do
for j:=1 to M do
begin
write('A[',i,',',j,']=');readln(A[i,j]);
end;
for i:=1 to N do {Xuất ra màn hình}
begin
for j:=1 to M do
write(A[i,j]);
end;
end.
24

VIII. XÂU KÝ TỰ
Để xử lý các chuỗi văn bản, Pascal đưa ra một kiểu dữ liệu mới gọi là xâu ký tự và được
định nghĩa bằng từ khóa STRING. Xâu ký tự là dữ liệu bao gồm một dãy các ký tự trong bảng
mã ASCII.
1. Cách khai báo:
Var ten_xau: STRING[độ dài của xâu];
hoặc Var ten_xau: string;
Xâu ký tự trong bộ nhớ nó chiếm số byte bằng số ký tự cực đại được khai báo cộng với
byte đầu tiên chứa số ký tự hiện có của xâu. Độ dài tối đa của xâu ký tự là 255.
2. Cách nhập/xuất:
Cách đọc hay viết kiểu STRING cũng tương tự như các kiểu dữ liệu khác, ta sử dụng
các thủ tục READ, hoặc WRITE.
Ví dụ: Readln(st);
Writeln(st);
3. Truy cập từng phần tử của xâu ký tự:
Tương tự mảng 1 chiều: thông qua tên biến kiểu STRING và chỉ số của nó.
Ví dụ: St := 'Le Thanh Lam';
write(st[4]);
 Kết quả: cho ra chữ T.
4. Các thao tác trên xâu ký tự:
4.1. Phép cộng xâu:
Ví dụ: st1:=’Le’; st2:=’Thanh’;
st=st1 + st2;
 Kết quả: st = ‘Le Thanh’
4.2. Phép so sánh:
Hai xâu ký tự có thể so sánh với nhau bằng các phép so sánh =, >, <…
Nguyên tắc so sánh thực hiện như sau, chúng sẽ đem từng ký tự tương ứng với nhau để
so sánh, xâu nào có ký tự có số thứ tự trong bảng mã ASCII lớn hơn thì xâu đó lớn hơn.
Hai xâu ký tự được gọi là bằng nhau khi chúng hoàn toàn giống nhau (có độ dài như
nhau).
Ví dụ: ‘FILENAME’ = ’FILENAME’
5. Các thủ tục và hàm chuẩn xử lý xâu ký tự:
5.1. Hàm length(st):
Cho độ dài thực của xâu ký tự.
Ví dụ: st:=’le thanh’ thì LENGTH(st) cho bằng 8.
25

5.2. Thủ tục DELETE(st, pos, num): xóa num ký tự trong xâu st kể từ vị trí pos
Ví dụ: st= ‘FILENAME’; Delete(st,5,4);
 Kết quả: st = ‘FILE’
5.3. Thủ tục INSERT(obj, st, pos):
Thủ tục cho kết quả bằng cách chèn xâu ký tự có tên là Obj vào xâu st tại vị trí pos,
những ký tự đứng sau pos sẽ được dời về phía sau của xâu ký tự obj.
Ví dụ: obj:= 'Thanh '; st:='Le Lam'; INSERT(obj,st,4);
 Kết quả: st=’Le Thanh Lam’;
5.4. Thủ tục STR(value, st):
Thủ tục này thực hiện việc chuyển đối giá trị kiểu số(value) sang dạng xâu ký tự và gán
cho biến st.
Ví dụ: n là một só nguyên có giá trị: n:=150;
STR(n:5,st) sẽ cho kết quả xâu st là: st=’ 150’;
5.5. Thủ tục VAL(st, value,code):
Đổi một xâu ký tự st sang dạng số và gán cho biến value, nếu biến đổi thành công thì
code sẽ nhận giá trị bằng 0, ngược lại thì cho giá trị khác không.
Ví dụ: VAL(‘123’,value,code) lúc này code sẽ nhận giá trị bằng 0 và value=123
5.6. Hàm COPY(st, pos, num):
Sao chép trong xâu st, num ký tự tại vị trí pos.
Ví dụ: st=’Le Thanh Lam’; COPY(st,4,5)  ‘Thanh’;
5.7. Hàm CONCAT(s1,s2,…,sn):
Hàm cho ra 1 xâu mới bằng cách nối đuôi các xâu s1,s2,…,sn lại với nhau.
Ví dụ: CONCAT(‘Le ’,’Thanh ‘, ‘Lam’)  ‘Le Thanh Lam’;
5.8. Hàm POS(st1,st2):
Hàm cho ta vị trí tìm thấy đầu tiên của xâu s1 trong xâu s2.
Ví dụ: POS(‘Lam’,‘Le Thanh Lam’)  10;
5.9. Hàm Length(st): Cho kết quả là một số nguyên chỉ chiều dài của chuỗi st.
Ví dụ: lenght('PASCAL')  6
5.10. Hàm UPCASE(Ký_tự): Đổi Ký_tự thành "KÝ_TỰ" in hoa.

6. Truy xuất từng ký tự trong chuỗi:


Có thể kết hợp dùng vòng lặp truy xuất các ký tự trong chuỗi.
Ví dụ: In ra các ký tự của chuỗi st[i] ra màn hình theo từng dòng
st:='PASCAL';
for i:=1 to 6 do writeln(st[i]);
26

IX. DỮ LIỆU KIỂU FILE


1. Giới thiệu
Đối với các kiểu cấu trúc dữ liệu ta đã biết như kiểu mảng, kiểu tập hợp, kiểu Record,
dữ liệu được tổ chức trên bộ nhớ trong (RAM) của máy tính nên khi kết thúc chương trình thì
dữ liệu cũng mất luôn. Điều này thật tai hại vì khi cần ta phải nhập dữ liệu lại - một công việc
chẳng thú vị gì và rất mất thời gian. Để giải quyết vấn đề này, người ta đặt ra kiểu tập tin
(File). Kiểu FILE cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (trên đĩa cứng hay đĩa mềm…), khi
kết thúc chương trình hay khi tắt máy thì dữ liệu vẫn còn nên có thể sử dụng nhiều lần.
Trong Pascal, tập tin có 3 loại: tập tin định kiểu, tập tin văn bản và tập tin tổng quát.
2. Khai Báo
Cú pháp: var <tên_biến> : text;
3. Truy xuất tệp
3.1. Đọc dữ liệu từ tệp
ASSIGN(<tên biến>, <tên tệp>);
RESET(<tên biến>);
READ/READLN và <các lệnh đọc file>;
CLOSE(<tên biến>);
Trong đó: Tên tệp: là đường dẫn đến tệp tin cần lấy dữ liệu.
Các lệnh đọc file: Các lệnh lấy dữ liệu vào biến
Ví dụ: Giả sử tệp mang.txt nằm trong ổ đĩa D, nội dung file chỉ có 1 dòng duy
nhất là số 10. Chương trình đọc số 10 vào biến n
var f: text;
n: integer;
begin
assign( f , 'D:\mang.txt');
reset(f);
read( f , n);
close(f);
write('Gia tri cua n : ', n);
readln;
end.
3.2. Các hàm và thủ tục đọc file
- Lệnh READ(<tên biến>, <dữ liệu>);
Đọc dữ liệu vào biến. Để đọc xong xuống dòng ta dùng READLN

DỮ LIỆU TRONG FILE LỆNH ĐỌC


10 5 READ( f, n, m)
10 READLN( f, n);
5 READ( f , m)
27

10 Readln( f , n);
5 3 6 8 1 4 9 7 10 2 For i :=1 to n do
Read( f , a[i]);
- Hàm EOF(<tên biến>): Boolean;
Cho kết quả là True nếu con trỏ tập tin ở cuối tập tin. Người ta dùng hàm này để kiểm
tra tình trạng hết tập tin hay chưa.
- Hàm EOLN(<tên biến>): Boolean;
Cho kết quả là True nếu con trỏ tập tin ở cuối dòng.
- Hàm FILEPOS(<tên biến>): Integer;
Cho kết quả là một số nguyên chỉ vị trí hiện tại của con trỏ tập tin.
- Hàm FILESIZE(<tên biến>): Integer;
Cho kết quả là một số nguyên chỉ số lượng phần tử có trong tập tin. FileSize nhận giá trị
0 khi không có một phần tử nào. Để đưa con trỏ về cuối tập tin ta có thể dùng lệnh:
Seek(<tên tệp>, FileSize(<tên tệp>));
- Thủ tục SEEK(<tên biến>, n)
Biến n là một biến số nguyên chỉ số thứ tự của phần tử trong tập tin. Phần tử thứ nhất có
số thứ tự là 0. Thủ tục này dịch con trỏ tập tin đến vị trí thứ n của tập tin.
3.3. Ghi dữ liệu ra tệp
ASSIGN(<tên biến>, <tên tệp>);
REWRITE(<tên biến>);
WRITE(<tên biến>, <nội dung>);
CLOSE(<tên biến>);

Ví dụ: Ghi 2 câu thơ ra file tho.txt


var f: text;
begin
assign( f , 'D:\tho.txt');
rewrite(f );
writeln( f , ‘Cong cha nhu nui thai son’);
writeln( f , ‘Nghia me nhu nuoc trong nguon chay ra’);
close(f);
readln;
end.

Vous aimerez peut-être aussi