Tải bản đầy đủ (.doc) (34 trang)

Tài liệu Bồi dưỡng Thường Xuyên Tin học THPT Phần 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (182.18 KB, 34 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO HÀ TĨNH

TÀI LIỆU
BỒI DƯỠNG THƯỜNG XUYÊN
NĂM HỌC 2013 - 2014
MÔN TIN HỌC THPT

1


LỜI GIỚI THIỆU
Nhằm nâng cao nhất lượng giảng dạy môn Tin học trong các nhà trường
THPT của tỉnh Hà Tĩnh, chúng tôi biên soạn cuốn sách này. Cuốn sách này được
xem như là tài liệu phục vụ cho giáo viên giảng dạy môn Tin học trong các nhà
trường THPT của tỉnh Hà Tĩnh trong việc tự học tự nghiên cứu.
Nội dung cuốn sách gồm ba phần:
Phần 1: Ngôn ngữ lập trình Pascal (Phần căn bản).
Phần 2: Thiết kế bài giảng điện tử E_Learning.
Tác giả của cuốn sách này gồm: Trần Xuân Bình - Chuyên viên Tin học, Sở
GD&ĐT Hà Tĩnh; Nguyễn Duy Dũng - Giáo viên Tin học, trường THPT chuyên
Hà Tĩnh; Võ Sỹ Ngọc - Giáo viên Tin học, trường THPT Thành Sen.
Do điều kiện tổ chức tài liệu còn nhiều hạn chế nên khó tránh khỏi thiếu sót,
chúng tôi rất mong nhận được ý kiến góp ý, bổ sung hoàn thiện nội dung cuốn
sách của giáo viên và những người quan tâm.

Hà Tĩnh, ngày 20 tháng 11 năm 2013
Tổng chủ biên
Trần Xuân Bình

2



PHẦN I
NGÔN NGỮ LẬP TRÌNH PASCAL (PHẦN CĂN BẢN)
Chương 1
CÁC YẾU TỐ CƠ SỞ CỦA NGÔN NGỮ PASCAL
1.1. Giới thiệu ngôn ngữ PASCAL
PASCAL là ngôn ngữ lập trình bậc cao được giáo sư Niklaus Wirth ở trường đại
học Kỹ thuật Zurich (Thụy sĩ) thiết kế và công bố vào năm 1971. Ông đặt tên cho ngôn
ngữ của mình là Pascal để tưởng nhớ nhà toán học nổi tiếng người Pháp ở thế kỷ 17:
Blaise Pascal, người đã sáng chế ra chiếc máy tính cơ khí đầu tiên của nhân loại. Qua
thời gian sử dụng, Pascal ngày càng được đông đảo người dùng đánh giá cao, và trở
thành một trong các ngôn ngữ lập trình phổ biến nhất hiện nay.
Thành công của ngôn ngữ Pascal là ở chỗ: nó là ngôn ngữ đầu tiên đưa ra và thể hiện
được khái niệm lập trình có cấu trúc. Ý tưởng về một chương trình có cấu trúc xuất phát
từ suy nghĩ cho rằng có thể chia một bài toán lớn, phức tạp thành nhiều bài toán nhỏ, đơn
giản hơn. Nếu mỗi bài toán nhỏ được giải quyết bằng một chương trình con, thì khi liên
kết các chương trình con này lại sẽ tạo nên một chương trình lớn giải quyết được bài toán
ban đầu.
Bằng cách chia một chương trình thành các chương trình con như vậy, người lập trình
có thể lập trình để giải quyết riêng lẻ từng phần một, từng khối một, hoặc có thể tổ chức
để nhiều người cùng tham gia, mỗi người phụ trách một vài khối. Đặc biệt khi phải thay
đổi hay sửa chữa trong một khối thì điều đó sẽ ít ảnh hưởng đến các khối khác.
Tính cấu trúc của ngôn ngữ Pascal còn thể hiện trong việc tổ chức các câu lệnh và tổ
chức dữ liệu. Từ các lệnh đã có, người lập trình có thể nhóm chúng lại với nhau và đặt
giữa hai từ khóa Begin và End tạo thành một câu lệnh mới phức tạp hơn gọi là câu lệnh
ghép. Đến lượt mình, hai hay nhiều lệnh ghép lại có thể được nhóm lại để tạo thành một
câu lệnh ghép phức tạp hơn nữa,.v.v. Tương tự như thế, ngôn ngữ Pascal cũng cho phép
xây dựng các kiểu dữ liệu phức tạp hơn từ các kiểu dữ liệu đã có.
Pascal là một ngôn ngữ không chỉ chặt chẽ về mặt cú pháp mà còn chặt chẽ về mặt
dữ liệu. Mỗi biến, mỗi hằng tham gia trong chương trình luôn có một kiểu dữ liệu xác

định và chỉ nhận những giá trị có cùng kiểu dữ liệu với nó. Điều này buộc người lập trình
phải nắm chắc cú pháp và luôn chú ý đến tính tương thích của các biểu thức về mặt kiểu
dữ liệu. Chính vì thế, lập trình bằng ngôn ngữ Pascal là một cơ hội tốt không chỉ rèn
luyện tư duy mà còn rèn luyện tính cẩn thận và chính xác.
1.2. Các thành phần cơ bản của ngôn ngữ PASCAL
Con người thể hiện tư duy của mình bằng ngôn ngữ, khởi đầu là ngôn ngữ nói và
sau đó là ngôn ngữ viết. Mỗi dân tộc dùng một số ký tự khác nhau cho ngôn ngữ viết của
mình, điều này cũng không ngoại lệ với các ngôn ngữ lập trình. Ngôn ngữ Pascal cũng có
một bộ ký tự và những quy tắc riêng để hình thành nên các từ khóa, tên chuẩn và các câu
lệnh của mình.
1.2.1. Bộ ký tự cơ bản
Bộ ký tự của Pascal chủ yếu giống như bộ ký tự ASCII, chúng gồm các nhóm sau:
- Nhóm 26 chữ cái in: A, B, C, ...Z
- Nhóm 26 chữ cái thường: a, b, c, ...z
- Nhóm chữ số của hệ đếm thập phân: 0,1,2,3,4,5,6,7,8,9
- Nhóm các toán tử toán học: +,-,*,/,>,<,=,>=,<=,<>
- Nhóm các ký tự đặc biệt: (,),[,],?,{,},...
3


- Dấu cách
- Dấu gạch nối _ (cần phân biệt với dấu trừ -)
Dấu gạch nối thường dùng để phân cách giữa các từ cho dễ đọc. Pascal không cho
phép viết dấu trừ (‘-‘) giữa các từ.
Ví dụ: giai_phương_trinh_bac_hai là cách viết đúng
Giai-phương-trinh-bac-hai là cách viết sai
1.2.2. Từ khóa (key word)
Từ các ký tự, ngôn ngữ Pascal đã xây dựng một số từ khóa và tên chuẩn để sử dụng
khi lập trình.
- Từ khóa chung:

Program, Begin, End, Procedure, Function.
- Từ khóa khai báo:
Const, Var, Label, Type, Array, Record, Set, File Of, String.
- Từ khóa dùng trong các cấu trúc lập trình:
If...Then...Else..., Case...Of..., For...To...Do..., For...Downto...Do..., While...Do...,
Repeat...Until.
- Từ khóa điều khiển:
With, Goto, Break, Halt, Exit.
- Từ khóa tên các toán tử:
Not, And, Or, Xor, In, Div, Mod
Chú ý:
Các từ khóa và tên chuẩn có thể viết dưới dạng chữ hoa hay chữ thường hay xen kẽ
chữ hoa với chữ thường đều được.
1.2.3. Tên (identifier)
Tên là một dãy các ký tự dùng để đặt cho hằng, biến, chương trình, nhãn, hoặc kiểu
dữ liệu mới.... Tên này do người lập trình tự đặt và phải đảm bảo đúng quy tắc:
- Tên chỉ gồm chữ số, chữ cái và dấu gạch nối (gạch dưới ‘ _ ’)
- Không bắt đầu bởi một chữ số
- Không trùng với từ khóa
- Chiều dài của tên tối đa là 127 ký tự.
- Thông thường tên nên đặt ngắn gọn và có tính gợi nhớ.
Pascal định nghĩa một số tên chuẩn như tên một số chương trình con, tên kiểu dữ
liệu: Char, Boolean, Integer, Real, Byte, Text, Read, Readln, Write, Writeln, Abs, Cos,
Sin, Sqrt, Exp, Ord, Round, Trunc, Pres, Succ, ...
Sự khác nhau giữa từ khóa và tên chuẩn là: Người lập trình có thể định nghĩa lại tên
chuẩn, dùng tên chuẩn vào các mục đích khác khi cần, còn từ khóa thì không được phép
thay đổi và dù có cố ý cũng không thể dùng nó với những ý nghĩa khác với quy định mà
Pascal đã thiết kế.
1.3. Cấu trúc chương trình
Một chương trình lập bằng ngôn ngữ Pascal gồm ba phần chính như sau:

1. Phần tiêu đề:
Phần này bắt đầu bằng từ khóa Program tiếp theo là tên chương trình, sau tên chương
trình là dấu “;”. Sau tên chương trình ta có thể đưa vào các dòng chú thích hoặc lời giải
thích.
2. Phần khai báo:
Có tất cả 7 tham số phải khai báo, tuy nhiên tùy từng chương trình mà chúng ta dùng
loại nào thì khai báo loại đó, thứ tự các khai báo là:
- USES (Crt, Graph,... khai báo sử dụng các đơn vị chương trình chuẩn)
- LABLE (khai báo nhãn)
- CONST (khai báo hằng)
4


- TYPE (mô tả kiểu dữ liệu mới)
- VAR (khai báo biến)
- PROCEDURE (khai báo các thủ tục)
- FUNCTION (khai báo các hàm)
3. Phần thân chương trình:
Phần thân chương trình phải đặt giữa hai từ khóa BEGIN và END, sau từ khóa END
phải có dấu chấm để báo kết thúc chương trình.
Phần bắt buộc phải có trong một chương trình Pascal là phần thân chương chình. Các
phần còn lại có thể có hoặc không tùy theo nhu cầu sử dụng.
PROGRAM Tên chương trình;
USES Tên đơn vị chương trình chuẩn;
LABLE (khai báo nhãn);
CONST (khai báo hằng);
TYPE (mô tả kiểu dữ liệu mới);
VAR (khai báo biến);
PROCEDURE Tên thủ tục;
Begin

Thân chương trình con;
End;
FUNCTION Tên hàm;
Begin
Thân chương trình con;
End;
BEGIN
Thân chương trình chính;
END.

BÀI TẬP
1.
2.
3.
4.
5.

Nêu ý nghĩa của dấu cách, dấu gạch dưới, dấu chấm phẩy.
Tên dùng để làm gì? Quy định về cách đặt tên.
Cho ví dụ về một số từ khoá điều khiển.
Cho biết ý nghĩa của từ khóa và tên chuẩn, nêu sự khác giữa chúng.
Viết cấu trúc tổng thể của một chương trình.

5


Chương 2
KIỂU DỮ LIỆU, HẰNG, BIẾN, BIỂU THỨC, CÂU LỆNH
2.1. Các kiểu dữ liệu và phép toán
Trong Pascal, ngôn ngữ lập trình cấu trúc nên có thể chia các kiểu dữ liệu thành ba loại

là:

Chuẩn
Đơn
giản
Các
kiểu
dữ liệu

Do người
dùng định
nghĩa

Mô tả
sẵn
Có cấu
trúc
Do người
dùng định
nghĩa
Con trỏ

Logic (boolean)
Ký tự (char)
Nguyên (integer)
Thực (real)
Liệt kê (enumerate)
Đoạn con (sub range)
Xâu ký tự (string)
Mảng (array)

Tập hợp (set of)
Bản ghi (record)
Tệp (file)
Ngăn xếp (stack)
Hàng đợi (queue)
Danh sách (list)
Cây (tree)
….


2.1.1. Kiểu số nguyên
2.1.1.1. Khái niệm: Kiểu nguyên là một kiểu số hữu hạn và đếm được có miền giá trị
phụ thuộc vào số byte được cấp phát.
2.1.1.2. Các kiểu số nguyên
Tên kiểu
ShortInt
Byte
Integer
Word
LongInt

Phạm vi giá trị
-128 .. 127
0..255
-32768 .. 32767
0 .. 65535
-2147483648
2147483647

Số byte

1
1
2
2
..
4

Giải thích
1 bit chứa dấu, 7 bit chứa giá trị
8 bit chứa giá trị
1 bit chứa dấu, 15 bit chứa giá trị
16 bit chứa giá trị
1 bit chứa dấu, 31 chứa giá trị

2.1.1.3. Các phép toán
Phép toán
Trong toán học
Trong Pascal
Các phép toán số + (cộng), - (trừ), x (nhân), div (chia +, -, *, div, mod
học với số nguyên
nguyên), mod (lấy phần dư)

6


2.1.2. Kiểu số thực
2.1.2.1. Kiểu Real và các kiểu mở rộng
Kiểu Real là kiểu số thực thông dụng nhất dùng để biểu diễn các số thực x có trị tuyệt
đối |x| nằm trong khoảng từ 2.9*10 -39 đến 1.7*10+38. Nếu |x| > 1.7*10+38 thì không biểu
diễn x trong máy được, còn nếu | x| < 2.9*10-39 thì x được coi là bằng 0.

Có hai cách biểu diễn các số thực:
- Cách 1 (Biểu diễn dưới dạng dấu phẩy tỉnh): Viết bình thường, trong đó dấu phẩy
thập phân được thay bằng dấu chấm thập phân, ví dụ như: 18.6 có nghĩa là 18,6
- Cách 2 (Biểu diễn dưới dạng dấu phẩy động):
1.257E+01 (có giá trị = 1.257*101 = 12.57 )
1257.0E-02 (có giá trị = 1257*10-2 = 12.57 )
Trong dạng này số gồm có hai phần, phần đứng trước E gọi là phần định trị, được
viết theo cách 1, phần đứng sau E gọi là phần bậc, gồm dấu cộng hoặc trừ, tiếp đến là
một số nguyên.
Số viết theo cách 1 còn gọi là số có dấu chấm thập phân cố định, số viết theo cách 2
còn gọi là số có dấu chấm thập phân di động hay số dạng khoa học (Scientific).
Tên kiểu
Real
Single
Double
Extended
Comp

Phạm vi giá trị
2.9*10-39 .. 1.7*1038
1.5*10-45 .. 3.4*1038
5.0*10-324 .. 1.7*10308
3.4*10-4932 .. 1.1*104932
-9.2*1018 .. 9.2*1018

Số byte
6
4
8
10

8

Chú ý: Turbo Pascal thường chỉ làm việc với một kiểu Real. Muốn dùng 4 kiểu thực còn
lại, phải chuyển sang mode 8087 bằng cách viết chỉ thị {$N+} ở ngay đầu chương trình.
2.1.2.2. Các phép toán
Phép toán
Trong toán học
Các phép toán số học + (cộng), - (trừ), x (nhân), : (chia)
với số thực

Trong Pascal
+, -, *, /

2.1.2.3. Các hàm và thủ tục có đối số nguyên hoặc thực
- Thủ tục Inc(i,h): Thủ tục này có chức năng tương đương với câu lệnh gán i:=i+h,
với i, h là các số nguyên và kết quả trả lại có kiểu nguyên.
- Thủ tục Dec(i,h): Thủ tục này có chức năng tương đương với câu lệnh gán i:=i-h,
với i, h là các số nguyên và kết quả trả lại có kiểu nguyên.
Trong 2 thủ tục trên nếu chỉ có mỗi tham số i thì ngầm định là h bằng 1 (viết Inc(i)
thay cho Inc(i,1); Dec(i) thay cho Dec(i,1))
- Hàm Abs(x): tính trị tuyệt đối của x. Kiểu dữ liệu của kết qủa cùng kiểu với đối số.
Nếu x nguyên thì Abs(x) cũng nguyên, nếu x là số thực thì Abs(x) cũng là số thực.
- Hàm Sqr(x): tính bình phương của x. Kiểu dữ liệu của kết qủa cùng kiểu với đối số.
- Trong các hàm dưới đây, đối số x có thể là nguyên hay thực, nhưng giá trị trả về
luôn luôn là kiểu thực:
Hàm Sqrt(x): tính căn bậc 2 của x (x >= 0), kết quả trả lại là một số thực
Hàm Exp(x): tính e mũ x, kết quả trả lại là một số thực
Hàm Ln(x): tính lnx, (x > 0), kết quả trả lại là một số thực
Các hàm Sin(x), Cos(x), và Arctan(x): tính sinx, cosx và arctgx.
7



- Hàm Int(x) : cho số thực bằng phần nguyên của x.
Ví dụ 2.1: Int(12.55) = 12.0
- Hàm Frac(x) : cho số thực bằng phần lẻ của x.
Ví dụ 2.2: Frac(12.55) = 0.55
- Hai hàm đặc biệt dưới đây cho kết qủa là số nguyên:
- Hàm Trunc(x): cho số nguyên là phần nguyên của x.
Ví dụ 2.3: Trunc(-2.98) = -2
- Hàm Round(x): cho số nguyên bằng cách làm tròn x.
Ví dụ 2.4: Round(-2.98) = -3
Chú ý: Hàm Int(x) và hàm Trunc(x) cùng cho phần nguyên của x, chúng chỉ khác nhau
về kiểu dữ liệu của giá trị trả về: Int(4.5)= 4.0 còn Trunc(4.5) = 4 (viết 4 thì hiểu đó là
số nguyên, còn viết 4.0 thì hiểu đó là số thực).
2.1.3. Kiểu ký tự (Char)
Các hàm liên quan đến ký tự
- Hàm Pred(ch): cho ký tự đứng ngay trước ký tự ch trong bảng mã ASCII.
Ví dụ 2.5: Pred(‘B’)=‘A’
- Hàm Succ(ch): cho ký tự đứng ngay sau ký tự ch trong bảng mã ASCII.
Ví dụ 2.6: Succ(‘A’)=‘B’.
- Hàm UpCase(ch): đổi ký tự ch thành chữ hoa tương ứng.
Ví dụ 2.7: Upcase( ‘a’ ) = ‘A’
- Hàm Ord(ch) : cho mã của ký tự ch.
Ví dụ 2.8: Ord (‘A’) = 65, Ord (‘a’) = 97 .
- Hàm Chr(k) : đối số k nguyên, 0<= k<= 255, cho ký tự có mã bằng k.
Ví dụ 2.9: Chr (65)= ‘A’ ,
Chú ý:
- Turbo Pascal (TP) cho phép viết gọn Chr(k) thành #k nếu k là hằng số.Ví dụ ta có
thể viết Write(#65) thay cho Write(Chr(65)).
- Trong TP không có hàm đổi chữ hoa ra chữ thường, nhưng có thể làm việc này nhờ

hai hàm Ord và Chr: Chữ thường := Chr(Ord(chữ hoa) + 32)
2.1.4 Kiểu Lôgic (Boolean)
2.1.4.1 Kiểu lôgic: Là kiểu dữ liệu chỉ nhận một trong hai hai giá trị True (đúng) hoặc
False (sai). Về quan hệ thứ tự thì False < True (tên các giá trị của kiểu dữ liệu này không
phân biệt chữ hoa hay chữ thường)
2.1.4.2 Các phép toán: Các phép toán lôgic gồm có: not, and, or và xor. Nếu A và B là
hai biểu thức lôgic thì not A, A and B, A or B và A xor B cũng là những biểu thức lôgic
có kết qủa được cho ở bảng dưới đây:
A
not A
True
False
False
True
A
B
A and B
A or B
A xor B
True
True
True
True
False
True
False
False
True
True
False

True
False
True
True
False
False
False
False
False
Nếu trong một biểu thức lôgic có nhiều phép toán lôgic thì thứ tự thực hiện các phép toán
lôgic là như sau: not tính trước, kế đến and, sau cùng là or, xor.
Ví dụ 2.10: sau khi thực hiện lệnh:
8


A:=not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1);
thì giá trị của A= False, thật vậy :
Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1)
= True or True and False xor True
= True or False xor True
= True xor True
= False
Biến chỉ nhận giá trị là True hoặc False gọi là biến kiểu lôgic. Khi khai báo biến kiểu
lôgic ta dùng tên chuẩn Boolean.
2.1.4. Các kiểu dữ liệu tự định nghĩa
2.1.4.1 Kiểu liệt kê: Là kiểu dữ liệu do người lập trình tự đặt tên. Các thành phần của
kiểu dữ liệu này được lấy ra từ các kiểu dữ liệu chuẩn bằng cách liệt kê các giá trị của
kiểu dữ liệu. Danh sách các giá trị này được đặt trong dấu ngoặc đơn và được mô tả bằng
một tên kiểu trong phần định nghĩa (TYPE).
Ví dụ 2.11:

Type
Color=(Red,Blue,Green,While,Black);
Khi đó 2 biến kiểu Color là mau1, mau2 được khai báo như sau:
Var
mau1,mau2:Color;
Sau khi khai báo như trên thì các biến mau1, mau2 chỉ được nhận bởi một trong các giá
trị Red, Blue, Green, While, Black.
2.1.4.2. Kiểu đoạn con:
Là kiểu dữ liệu được ứng dụng khi một biến chỉ được nhận các giá trị trong một khoảng
(xác định bởi cận trên và cận dưới).
Ví dụ 2.12:
Type
Ngay=1..31;
Chuhoa=’A’..’Z’;
Var
Chu: Chuhoa;
Ngay_lam_viec:Hai..Bay;
Trong ví dụ trên ta định nghĩa hai kiểu đoạn con Ngay và Chuhoa và phần khai báo biến
thực hiện khai báo hai biến, biến Chu thuộc kiểu dữ liệu Chuhoa và khai báo trực tiếp
biến Ngay_lam_viec thuộc kiểu đoạn con.
2.1.5 Hằng, biến, biểu thức, câu lệnh gán
2.1.5.1 Khái niệm về biến và hằng
Mỗi kiểu dữ liệu có một tập các giá trị tương ứng. Các giá trị của kiểu nguyên hay
kiểu thực là các số, như 40 hay 5.72, các giá trị của kiểu ký tự là các ký tự như ‘A’ hay
‘a’, còn kiểu lôgic thì chỉ có hai giá trị là True và False, ...
Quá trình xử lý trong máy tính đòi hỏi mỗi giá trị phải được lưu trữ ở một ô nhớ nào
đó trong bộ nhớ của máy, và ô nhớ này được đặt một cái tên để gọi. Khi đó mọi việc tính
toán hay xử lý liên quan đến mỗi giá trị được thực hiện gián tiếp thông qua tên của ô nhớ
chứa giá trị đó. Ví dụ, nếu số 5.72 được lưu trong ô nhớ có tên là x, thì biểu thức 5.72*2
có thể được viết là x*2. Việc dùng tên x dễ nhớ và tiện hơn nhiều so với việc dùng và

nhớ số 5.72.
Như vậy, khi một ô nhớ được đặt tên thì tên này đồng nhất với giá trị của nó. Trong
một chương trình, mỗi ô nhớ có một tên duy nhất nhưng giá trị của nó thì có thể thay đổi
9


hoặc không. Nếu giá trị của ô nhớ có thể thay đổi được thì ô nhớ này là một biến, tên của
ô nhớ là tên biến, ngược lại, nếu giá trị của ô nhớ không thể thay đổi, thì ô nhớ là một
hằng, tên của ô nhớ là tên hằng.
Các biến và hằng tham gia trong chương trình đều phải được khai báo. Việc khai báo
có tác dụng báo trước cho máy dành sẵn các ô nhớ thích hợp trong bộ nhớ để sẵn sàng
chứa dữ liệu.
2.1.5.2 Khai báo biến
Khai báo biến:
Var <Danh sách biến> : <Kiểu dữ liệu> ;
Trong đó :
<Danh sách biến> là một hoặc nhiều tên biến, nếu có nhiều hơn một tên biến thì các tên
biến viết cách nhau bởi dấu phẩy ;
<Kiểu dữ liệu> là một trong các kiểu dữ liệu chuẩn hoặc hoặc kiểu dữ liệu do người lập
trình định nghĩa.
Ví dụ 2.13: Trong chương trình cần 3 biến kiểu thực X, Y, Z; 1 biến kiểu ký tự C ; 2 biến
kiểu Byte I, J ; 1 biến kiểu Word N. Khi đó ta có thể khai báo các biến đó như sau :
Var
X,Y,Z : Real;
C : Char;
I,J : Byte;
N :Word;
Trong khai báo trên có ba biến thực X, Y, Z. Bộ nhớ cấp phát cho ba biến này là 18 byte
(3 x 6 = 18). C là biến kiểu ký tự và bộ nhớ dành cho nó là 1 byte. Các biến I, J nhận giá
trị nguyên trong phạm vi 0..255 và bộ nhớ dành cho mỗi biến là 1 byte. Biến N cũng

nhận các giá trị nguyên trong phạm vi 0..65535. Bộ nhớ dành cho biến N là 2 byte. Như
vậy tổng số bộ nhớ dành cho các biến đã khai báo là :
18 + 1 + 2 + 2 = 23 (byte)
Chú ý: Khi sử dụng biến nào trong chương trình thì phải đặc biệt lưu ý đến phạm vi giá
trị của nó.Ví dụ: Sử dụng biến kiểu Byte để biểu diễn số học sinh của 1 lớp ; sử dụng
biến kiểu Word để biểu diễn số học sinh của toàn trường; sử dụng biến kiểu LongInt để
biểu diễn giá trị tổng của các số nguyên,...
2.1.5.3. Khai báo hằng
+ Việc khai báo hằng bằng tên có 3 ưu điểm:
- Chương trình dễ đọc.
- Dễ thay đổi chỉnh sửa.
- Tiết kiệm bộ nhớ.
+ Khai báo:
Const <Tên hằng> = <Giá trị của hằng>;
Trong đó: <Tên hằng> là do người lập trình đặt theo đúng quy tắc của một tên.
Ví dụ 2.14:
Const
N = 10;
SoPi = 3.1416;
C=’h’;
Trong Pascal có sẵn một số hằng chuẩn cho phép sử dụng mà không phải khai báo,
như: Pi, MaxInt. Hằng Pi có giá trị bằng số pi, còn MaxInt có giá trị 32767, là số Integer
lớn nhất. Chẳng hạn, có thể dùng các lệnh sau:
Writeln(‘Dien tich hinh tron ban kinh 5 la: ‘ , Pi*5*5:8:3);
Writeln(‘So Integer lon nhat = ‘ , MaxInt);
10


2.1.5.4. Biểu thức
Biểu thức là một công thức gồm có một hay nhiều thành phần được kết nối với nhau

bởi các phép toán. Mỗi thành phần (hay toán hạng) có thể là hằng, là biến hay là hàm.
Khi các phép toán trong biểu thức được thực hiện thì ta nhận được một giá trị gọi là kết
qủa của biểu thức. Kiểu dữ liệu của kết qủa gọi là kiểu dữ liệu của biểu thức.
Một biểu thức có thể chứa nhiều phép toán. Thứ tự thực hiện các phép toán được cho
trong bảng dưới đây.
Cấp ưu tiên
Phép toán
1
biểu thức trong ngoặc đơn (...)
2
Các hàm
3
Not, - (phép lấy dấu âm)
4
* , /, Div, Mod, And
5
+, - (trừ), Or, Xor
6
=, <>, <, <=, >, >=, In
Việc tính toán một biểu thức dựa theo hai quy tắc:
Quy tắc 1: Phép toán có cấp ưu tiên nhỏ thì được tính trước, phép toán có cấp ưu tiên
lớn thì được tính sau.
Quy tắc 2: Đối với các phép toán đứng liền nhau và có cùng cấp ưu tiên, thì phép
toán nào đứng trước được tính trước.
Ví dụ 2.15:
+ Tính biểu thức số học :
(4+5)*2 div 7 + sin(pi/6)
= 9 * 2 div 7 + 0.5
=
18 div 7 + 0.5

=
2 + 0.5
=
2.5
+ Tính biểu thức lôgic :
( 2 > 4 div 2) or Not ( 49.25 + 2 < 50)
= (2 > 2) or Not ( 51.25 < 50)
= False or Not False
= False or True
= True
2.1.5.5. Câu lệnh
Các câu lệnh được viết ở phần thân của chương trình, câu lệnh bao gồm các câu lệnh đơn
hoặc câu lệnh ghép. Câu lệnh ghép là tập hợp các câu lệnh đơn đặt giữa hai từ khóa
‘Begin’ và ‘End;’. Câu lệnh nhằm thực hiện một công việc nào đó mà người lập trình đặt
ra cho máy xử lý. Việc bố trí mỗi câu lệnh trên một dòng hay nhiều câu lệnh trên một
dòng là tùy cách trang trí của người lập trình miễn là các câu lệnh phải đặt cách nhau bởi
dấu phân cách “;”. Việc thực hiện các câu lệnh đơn trong câu lệnh ghép hoặc thực hiện
các câu lệnh ghép là theo tuần tự, lệnh nào viết trước thì thực hiện trước.
Như vậy ta đã biết là cuối mỗi câu lệnh bao giờ cũng có dấu ‘;’, riêng câu lệnh
đứng ngay trước từ khóa ‘End’ có thể không cần có dấu ‘;’.
2.1.5.6 Câu lệnh gán
Lệnh gán là một trong những lệnh hay dùng nhất trong ngôn ngữ lập trình PASCAL.
Cú pháp: <Tên biến>:=<Biểu thức>;
Thực hiện: Tính giá trị biểu thức bên phải dấu gán ‘:=’ và ghi giá trị đó vào địa chỉ của
biến có tên ở bên trái dấu gán ‘:=’, tức là gán giá trị cho biến.
Chú ý: Kiểu của biểu thức phải phù hợp với kiểu của tên biến.
Ví dụ 2.16:
11



Sau khi thực hiện các lệnh gán sau đây thì giá trị của các biến x, y, z là bao nhiêu?
1) x:=1;
2) y:=2;
3) z:=3;
4) x:=x+1; {Tăng giá trị của biến x lên 1 đơn vị ≈ thủ tục Inc(x)}
5) y:=y-1; {Giảm giá trị của biến y xuống 1 đơn vị ≈ thủ tục Dec(y)}
6) x:=x+y+z;
7) y:=y+z-x;
8) z:=x+y-z;
Giải thích ý nghĩa khi thực hiện các câu lệnh:
Câu lệnh 1, 2, 3: Thực hiện gán giá trị 1, 2, 3 cho các biến tương ứng là x, y, z (giá trị
của x là 1, giá trị của y là 2, giá trị của z là 3).
Câu lệnh 4: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 2, lấy giá trị
đó gán cho biến x (giá trị của x là 2)
Câu lệnh 5: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 1, lấy giá trị
đó gán cho biến y (giá trị của y là 1)
Câu lệnh 6: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 6, lấy giá trị
đó gán cho biến x (giá trị của x là 6)
Câu lệnh 7: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị -2, lấy giá
trị đó gán cho biến y (giá trị của y là -2)
Câu lệnh 8: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 1, lấy giá trị
đó gán cho biến z (giá trị của z là 1)
Trả lời: Sau khi thực hiện các câu lệnh gán trên thì giá trị của x là 6,giá trị của y là -2,
giá trị của z là 1.
Chú ý:
- Khi gán giá trị phải đảm bảo tính tương thích giữa kiểu dữ liệu và giá trị gán, ví
dụ khai báo biến x kiểu Integer thì không thể gán nó cho giá trị 6.5.
- Trong câu lệnh gán có một ngoại lệ đó là biến kiểu thực có thể nhận giá trị
nguyên.


BÀI TẬP
1. Tên các kiểu dữ liệu đã giới thiệu trong chương này có thể thay đổi với ý nghĩa
khác đi hay không?
2. Tại sao bảng mã ASCII lại chỉ có 256 ký tự.
3. Sự giống nhau và khác nhau giữa hai kiểu dữ liệu Integer và Word.
4. Một lớp học sinh có không quá 50 học sinh, nên dùng kiểu dữ liệu nào để đánh số
thứ tự.
5. Để gán các giá trị 6, 2.5, ‘A’ lần lượt cho các biến x, y, z thì các biến x, y, z phải
thuộc kiểu dữ liệu nào? Viết các câu lệnh gan.
6. Có thể gán các ký tự ‘ă’, ‘â’, ‘ô’, ‘ê’, ‘ư’ cho một biến kiểu Char được hay không?
7. Có những biểu thức loại gì? Biểu thức có phải là một câu lệnh hay không?
8. Có thể gán giá trị mới cho một hằng đã khai báo hay không?

12


Chương 3
THỦ TỤC NHẬP, XUẤT DỮ LIỆU
Nhập dữ liệu có nghĩa là gán cho các hằng, biến những giá trị phù hợp nào đó. Xuất
dữ liệu nghĩa là viết ra màn hình hoặc máy in những số liệu đang lưu trữ trong các biến.
Khi xuất dữ liệu ra màn hình cần phải biết màn hình máy vi tính hiện nay ở chế độ ngầm
định được chia thành 25 dòng và 80 cột. Trong chế độ đồ họa màn hình chia thành một
ma trận điểm, với màn hình VGA số điểm theo chiều ngang thường là 640 và theo chiều
đứng là 480. Với những màn hình độ phân giải cao tỷ lệ này có thể là 800/600 hoặc
1024/768.
3.1. Nhập dữ liệu
Các đại lượng thường phải nhập dữ liệu là hằng, biến. Có hai cách nhập dữ liệu là
nhập trực tiếp bằng lệnh gán ( :=) và nhập bằng cách gõ số liệu từ bàn phím. Có hai thủ
tục chuẩn của Turbo Pascal để nhập dữ liệu vào từ bàn phím : Read(...) và Readln(...).
3.1.1 Thủ tục Read(...) và Readln(...)

Thủ tục Read được sử dụng để đọc dữ liệu từ tệp ra biến hoặc nhập dữ liệu từ bàn
phím vào cho biến nếu tên biến đã được chỉ rõ.
Thủ tục Read(Tên biến) đòi hỏi có các tham số là biến đã được khai báo. Có thể sử
dụng thủ tục Read(...) để nhập dữ liệu cho nhiều biến, tên các biến phải đặt cách nhau bởi
dấu phẩy.
Ví dụ 3.1: Để nhập dữ liệu cho ba biến a, b, c ta dùng thủ tục Read(a,b,c). Khi thực
hiện thủ tục này ta tiến hành như sau : [Gõ giá trị của a] [gõ dấu cách] [gõ giá trị của b]
[gõ dấu cách] [gõ giá trị của c] [ấn phím Enter]
Chú ý :
- Các biến sử dụng trong thủ tục Read(...) có thể thuộc các kiểu dữ liệu khác
nhau do đó khi gõ dữ liệu từ bàn phím cần gõ đúng kiểu dữ liệu.
- Thủ tục Read(...) không thể nhập dữ liệu cho Hằng hoặc Biểu thức.
Thủ tục Readln(...) cũng dùng để nhập dữ liệu như thủ tục Read(...), sự khác nhau
giữa hai thủ tục này là: Với thủ tục Read(...) (của các Version nhỏ hơn 7.0) sau khi ấn
phím Enter để kết thúc nhập dữ liệu thì con trỏ màn hình không chuyển xuống dòng
dưới, còn với thủ tục Readln(...) con trỏ màn hình sẽ chuyển xuống dòng tiếp theo. Riêng
Version 7.0 thì hai thủ tục Read(...) và Readln(...) là như nhau.
Trường hợp đặc biệt của thủ tục Readln(...) là thủ tục Readln (không có tham số).
Chức năng của thủ tục này là dừng màn hình chờ ấn phím Enter (hay sử dụng trong
trường hợp dừng màn hình để xem kết quả).
3.1.2. Thủ tục Readkey và Keypessed
Trong quá trình nhập dữ liệu cũng như xây dựng chương trình, người ta hay dùng
hai thủ tục đặc biệt của Turbo Pascal là Readkey (đọc một ký tự từ bàn phím) và
Keypessed (bấm một phím nào đó trên bàn phím).
Cú pháp của thủ tục Readkey như sau: <Tên biến> := Readkey ;
Khi gặp thủ tục này, máy sẽ chờ ta gõ một ký tự từ bàn phím. Ký tự gõ vào sẽ được
gán cho biến có tên ở bên trái dấu gán ‘:=’. Biến đó thuộc kiểu dữ liệu Char.
Trong các chương trình, thủ tục Readkey thường được dùng để trả lời câu hỏi có
‘Y’ hoặc không ‘N’. Căn cứ phím gõ vào máy sẽ quyết định công việc tiếp theo.
13



Thủ tục KeyPressed thường được dùng làm điều kiện trong một câu lệnh. Gặp thủ
tục này máy sẽ chờ cho đến khi một phím bất kỳ được gõ.
Hai thủ tục Readln và Keypessed đều được dùng để giữ màn hình lại cho ta quan
sát, sự khác biệt giữa chúng là khi xem xong để tiếp tục công việc với Readln ta cần gõ
phím Enter còn với KeyPressed ta gõ một phím bất kỳ.
3.1.3 Thủ tục Clrscr
Thủ tục Clrscr có chức năng xóa sạch màn hình. Người ta thường sử dụng thủ tục
này trước khi nhập dữ liệu.
Để sử dụng được thủ tục này cũng như một số thủ tục khác liên quan đến các thao
tác trên màn hình và bàn phím thì trước đó ta phải gọi Unit CRT bởi lệnh: Uses CRT;.
3.2. Xuất dữ liệu
3.2.1. Viết dữ liệu ra màn hình
3.2.1.1. Thủ tục Write(...) và Writeln(...)
Có ba thủ tục để viết dữ liệu ra màn hình, đó là Write(...), Writeln(...) và Writeln.
Hai thủ tục Write(...), Writeln(...) đòi hỏi có tham số đi kèm. Tham số trong các lệnh trên
có thể là tên các biến, hằng, biểu thức. Nếu muốn viết nhiều đại lượng ra màn hình thì
cần dùng dấu phẩy để ngăn cách tên các biến, hằng hoặc các biểu thức. Với các hằng ký
tự cần phải đặt chúng trong cặp dấu nháy đơn ‘...’.
Sự khác nhau giữa ba thủ tục trên là:
Write(...): sau khi viết xong giá trị cuối cùng, con trỏ màn hình vẫn nằm nguyên tại
vị trí kết thúc.
Writeln(...): sau khi viết xong giá trị cuối cùng, con trỏ màn hình tự động chuyển
đến vị trí đầu dòng tiếp theo.
Writeln: không viết gì ra màn hình mà chỉ di chuyển con trỏ màn hình đến vị trí đầu
dòng dưới.
Ví dụ 3.2: Để viết dòng chữ ‘Chuc mung nam moi’ có màu đỏ trên nền vàng bắt
đầu từ vị trí dòng 10 cột 30 ta phải lập chương trình sau đây:
Program Vietchu;

Uses Crt;
Begin
Clrscr;
Gotoxy(10,30);
Textcolor(Red);
Textbackground(Yellow);
Write(‘Chuc mung nam moi’);
End.
3.2.1.2. Viết các ký tự ra màn hình
Các ký tự khi viết ra màn hình phải đặt trong dấu ngoặc đơn, nếu không có các lệnh
gì khác liên quan đến vị trí con trỏ màn hình thì các ký tự được viết bắt đầu từ vị trí hiện
tại của con trỏ màn hình và chiếm một khoảng rộng đúng bằng số ký tự được viết ra màn
hình.
Nếu trước khi viết, trong chương trình có lệnh Clrscr (xóa sạch màn hình) thì các
ký tự sẽ được viết ra bắt đầu tại vị trí có tọa độ (1,1) trên màn hình, còn nếu trước đó là
lệnh Writeln(...) hoặc Writeln thì các ký tự sẽ được viết bắt đầu ở đầu dòng mới.
Sử dụng cách viết có quy cách có nghĩa là quy định độ dài chuỗi ký tự sẽ viết ra thì
ký tự cuối cùng của chuỗi sẽ được căn theo lề phải trong phạm vi độ rộng quy định.
14


Ví dụ 3.3:
Program Vietkytu ;
Uses Crt;
Var c: Char;
Begin
Clrscr;
c:=’y’;
Writeln(c) ;
Writeln(c :7) ;

Writeln(‘abcde’);
Writeln(‘abcde’:8);
Readln
End.
Khi thực hiện chương trình trên thì kết quả sẽ viết ra màn hình như sau:
y
y
abcde
abcde
Vị trí 12345678
Nếu trong lệnh Writeln(‘abcde’:n) ta chọn n nhỏ hơn độ dài chuỗi ký tự (ở đây là 5)
thì máy vẫn viết ra đầy đủ cả chuỗi.
Để viết một ký tự nào đó trong bảng mã ASCII ta cần biết số thứ tự của ký tự đó
trong bảng mã. Một số ký tự đầu trong bảng mã ASCII là các ký tự điều khiển không in
ra được. Ví dụ ký tự có số thứ tự 7 trong bảng mã ASCII là tiếng chuông, nếu ta viết lệnh
Write(Char(7)) thì máy sẽ phát ra tiếng chuông (lệnh trên cũng có thể viết dưới dạng:
Write(#7)).
3.2.1.3. Viết các số ra màn hình
Cách viết các số nguyên và số thực ra màn hình là khác nhau.
- Trường hợp không định kiểu: Với các số nguyên, máy sẽ viết ra đầy đủ số
chữ số kể cả dấu bắt đầu từ vị trí hiện thời của con trỏ màn hình. Với các số thực, máy sẽ
dành 18 vị trí để viết mỗi số theo quy định sau: 2 vị trí đầu để trống, tiếp đến một số phần
nguyên, dấu chấm phân cách, 10 vị trí phần thập phân, chữ E biểu hiện phần mũ, dấu của
mũ và 2 vị trí cho số mũ.
Ví dụ 3.4:
Writeln(-123456);
Writeln(123.4567) ;
Kết quả viết ra màn hình như sau:
-123456
1.2345670000E+02

- Trường hợp có định kiểu: Qua ví dụ trên ta thấy cách viết số thực không định
kiểu sẽ rườm rà, khó đọc và khó trình bày trên màn hình cũng như in ra giấy, vì vậy cần
phải quy định cách viết theo ý nghĩa người lập trình. Cách viết có định kiểu đòi hỏi chỉ
cho máy biết số vị trí mà máy phải viết dữ liệu ra tính từ vị trí hiện thời của con trỏ màn
hình. Riêng đối với số thực thì phải quy định rõ số vị trí cho toàn bộ số và số vị trí cho
phần thập phân.
Ví dụ 3.5:
Write(‘So thu tu :’) ;
Writeln(381 :14) ;
Writeln(‘Ho va ten: Tran Tuan Thanh’);
15


Write(‘Luong:’);
Writeln(359000.123:12:4) ;
Write(‘Phu cap:’) ;
Writeln(2400.65:12:4) ;
Kết quả viết ra màn hình như sau :
So thu tu:
381
Ho va ten: Tran Tuan Thanh
Luong:
359000.1230
Phu cap:
2400.6500
Nếu trong việc viết số thực ta chỉ quy định độ dài tổng thể mà không quy định số vị
trí cho phần thập phân thì máy sẽ viết ra theo kiểu mũ trong đó 4 vị trí dành cho phần số
mũ, phần số sẽ được làm tròn với độ rộng còn lại.
Ví dụ 3.6:
Write(123.456789 :8) ;

Kết quả viết ra màn hình như sau :
1.23E+02
3.2.2. Đưa dữ liệu ra máy in
Pascal quy định máy in là LST, việc quản lý máy in đã được chuẩn hóa và cài đặt
trong Unit Printer.
Để đưa dữ liệu ra máy in trước hết phải gọi Unit Printer bởi lệnh Uses Printer; sau
đó sử dụng lệnh in theo cú pháp sau đây: Write(LST,tên biến/giá trị); hoặc
Writeln(LST,tên biến/giá trị);
Ví dụ 3.7:
Program Indulieu ;
Uses Crt,Printer;
Var
Luong,phucap:Real;
Stt:Integer;
Begin
Clrscr;
Write(‘Nhap so thu tu :’);
Readln(Stt);
Write(‘Nhap luong:’);
Readln(luong);
Write(‘Nhap phu cap:’);
Readln(phucap);
Clrscr;
Writeln(Lst,’DU LIEU DA NHAP CHO CAC BIEN’);
Writeln(Lst,’So thu tu :’,stt) ;
Writeln(Lst,’Luong :’,luong :10 :2);
Writeln(Lst,’Phu cap :’,phucap :10 :2);
Readln;
End.


BÀI TẬP

1.
2.

Các thủ tục Read(...), Readln(...), Readln khác nhau thế nào?
Nêu sự giống nhau, khác nhau giữa hai thủ tục Write(...), Writeln(...).
16


3.

Nêu chức năng của các thủ tục Readkey, Keypessed. Hai thủ tục Keypessed và
Readln giống nhau và khác nhau thể nào?

4.
5.

Có những cách nào để viết các số nguyên, số thực ra màn hình.
Trong các câu lệnh viết dữ liệu ra màn hình và đưa dữ liệu ra máy in có gì giống
nhau và khác nhau?

Chương 4
CÁC CÂU LỆNH CÓ CẤU TRÚC
4.1. Câu lệnh rẽ nhánh
4.1.1. Cấu trúc câu lệnh
Câu lệnh rẽ nhánh có hai dạng với cấu trúc như sau :
Câu lệnh rẽ nhánh dạng khuyết:
Câu lệnh rẽ nhánh dạng đủ:
If <Điều kiện> Then <Công việc>

If <Điều kiện> Then <Công việc 1>
Else <Công việc 2>
4.1.2. Lưu đồ hoạt động :
Câu lệnh rẽ nhánh dạng khuyết:
Câu lệnh rẽ nhánh dạng đủ:
Điều kiện
Đúng
Công việc

Điều kiện
Sai

Đúng
Công việc 1

Sai
Công việc 2

<Công việc>, <Công việc 1>, <Công việc 2> là các câu lệnh để giải quyết một vấn đề
nào đó. <Điều kiện> là một biểu thức lôgic, nếu biểu thức lôgic có giá trị True thì ta nói
rằng <Điều kiện> đúng, biểu thức lôgic có giá trị False thì ta nói rằng <Điều kiện> sai.
Sự thực hiện câu lệnh rẽ nhánh dạng khuyết như sau: Kiểm tra <Điều kiện>, nếu
<Điều kiện> đúng thì thực hiện <Công việc>.
Sự thực hiện câu lệnh rẽ nhánh dạng đủ như sau: Kiểm tra <Điều kiện>, nếu <Điều
kiện> đúng thì thực hiện <Công việc 1>, nếu <Điều kiện> sai thì thực hiện <Công việc2>.
4.3. Câu lệnh lặp có số lần lặp định trước
4.3.1. Cấu trúc câu lệnh:
Câu lệnh lặp có số lần lặp định trước có hai dạng với cấu trúc như sau:
Trường hợp tiến: For <Biến đếm>:=<Giá trị đầu> To <Giá trị cuối> Do <Công việc>
Trường hợp lùi: For <Biến đếm>:=<Giá trị cuối> Downto <Giá trị đầu> Do <Công việc>

4.3.2. Lưu đồ hoạt động:

17


Trường hợp tiến:

Trường hợp lùi:

Biến đếm:=Giá trị đầu

Biến
đếm<=Giá
trịtrị
cuối
Biến
đếm <=Giá
cuối

Biến đếm:=Giá trị cuối

Sai

Sai
Biến đếm>=Giá trị đầu

Đúng

Đúng
Công việc


Công việc

Tăng biến đếm lên 1 đơn vị

Giảm biến đếm xuống 1 đơn vị

<Biến đếm> là biến có giá trị thuộc một đoạn số liên tục kiểu nguyên (có một số trường
hợp đặc biệt khác ta sẽ đề cập sau).
4.3.2.4. Ví dụ
Ví dụ 4.1: Tính tổng S=1+1/2+1/3+...+1/n . Biết rằng n là một số nguyên dương được
nhập vào từ bàn phím.
Program Tinhtong; {Chuong trinh su dung FOR tien}
Uses Crt;
Var i, n: Integer;
s: Real;
Begin
ClrScr;
Write('Nhap n= '); Readln(n);
s:=0;
For i:=1 to n do
s:=s+1/i;
WriteLn('Tong S= ',s:8:3);
Readln;
End.
4.5. Câu lệnh lặp có số lần lặp không xác định
4.5.1. Cấu trúc câu lệnh:
Cấu trúc của hai câu lệnh lặp với số lần lặp không xác định là:
Repeat
While <Điều kiện> Do

<Công việc>
Begin
Until <Điều kiện>
<Công việc>
End;
4.5.2. Lưu đồ hoạt động:
Câu lệnh Repeat ... Until
Câu lệnh While ... Do
Công việc
Điều kiện
Điều kiện

Sai

Sai
Đúng
Công việc

Đúng

18


Sự thực hiện câu lệnh lặp Repeat ... Until như sau:
B1: Thực hiện <Công việc>.
B2: Kiểm tra <Điều kiện>, nếu <Điều kiện> sai quay về B1, nếu <Điều kiện> đúng thì
kết thúc vòng lặp.
Sự thực hiện câu lệnh lặp While ... Do như sau:
B1: Kiểm tra <Điều kiện>.
B2: Nếu <Điều kiện> đúng thì thực hiện <Công việc> sau đó quay về B1, nếu <Điều

kiện> sai thì kết thúc vòng lặp.
Sự khác nhau cơ bản giữa hai câu lệnh lặp trên là: Câu lệnh lặp Repeat ... Until thực hiện
<Công việc> trước rồi kiểm tra <Điều kiện> sau, như vậy ít nhất thực hiện <Công việc>
một lần; còn câu lệnh lặp While ... Do thì kiểm tra <Điều kiện> trước do đó có thể không
thực hiện <Công việc> một lần nào.
Ví dụ 4.2: Chương trình nhập một số tự nhiên N nằm trong khoảng từ 1 đến 20
Program Nhapso;
Uses Crt;
Var N:Word;
Begin
Repeat
Clrscr;
Write(‘Nhap so N:’); Readln(N);
Until (N>=1) and (N<=20);
End.
Ví dụ 4.3: Chương trình nhập một số tự nhiên N nằm trong khoảng từ 1 đến 20
Program Nhapso;
Uses Crt;
Var x,y,N:Integer;
Begin
Clrscr;
Write(‘Nhap so N:’);
x:=Wherex;
y:=Wherey;
Repeat
Gotoxy(x,y);
Clreol;
Readln(N);
Until (N>=1) and (N<=20);
End;

Các chương trình trong ví dụ 4.2 và ví dụ 4.3 có chức năng hoàn toàn giống nhau là nhập
một số tự nhiên nằm trong khoảng từ 1 đến 20, nhập có kiểm tra điều kiện, khi nào số N
nhập vào thỏa mãn yêu cầu thì mới kết thúc. Tuy nhiên các chương trình đó khác nhau ở
chỗ: trong chương trình ở ví dụ 4.2 khi số N nhập vào không thỏa mãn yêu cầu thì sẽ xóa
sạch màn hình, làm lại thao tác nhập số N từ đầu (Write(‘Nhap so N:’); Readln(N);) còn
đối với chương trình trong ví dụ 4.3 thì sau khi sử dụng lệnh Write(‘Nhap so N:’) ta ghi
nhận tọa độ hàng, cột của con trỏ màn hình tại vị trí sau dấu ‘:’ bằng các lệnh x:=Wherex,
19


y:=Wherey rồi sau đó khi mà số N nhập vào không thỏa mãn yêu cầu thì di chuyển con
trỏ màn hình đến vị trí có tọa độ x, y (là vị trí sau dấu ‘:’ mà đã ghi nhận trước đó) bằng
lệnh Gotoxy(x,y), tiếp theo xóa văn bản từ vị trí hiện tại của con trỏ màn hình đến cuối
dòng bằng lệnh Clreol và sau đó thực hiện lệnh nhập số N từ bàn phím bằng lệnh
Readln(N).
Ví dụ 4.4: Tính tổng S=1+1/2+1/3+...+1/n . Biết rằng n là một số nguyên dương được
nhập vào từ bàn phím.
Program Tinhtong;
Uses Crt;
Var i, n: Integer;
s: Real;
c:Char;
Begin
Repeat
ClrScr;
Write('Nhap n= '); Readln(n);
s:=0; i:=1;
While i<=n do
Begin
s:=s+1/i; i:=i+1;

End;
Writeln('Tong S= ',s:8:3);
Write(‘Tiep tuc nua khong (C/K):’); c:=Readkey;
Until (c=’k’) or (C=’K’);
End.
4.5.3. Xây dựng cấu trúc lặp với câu lệnh có số lần lặp không xác định
Dưới đây giới thiệu một số bài toán thường sử dụng lặp và phương pháp giải
(Phương pháp giải được minh họa qua câu lệnh lặp While ... Do).
a) Điều khiển vòng lặp bằng giá trị canh chừng
Ta xét ví dụ sau:
Ví dụ 4.5: Viết chương trình nhập vào số thực a. Với n lớn nhất bằng bao nhiêu để tổng
1
2

S = 1+ +

1
1
+…+ nhỏ hơn số a cho trước.
3
n

Với ví dụ này ta không biết trước số lần lặp vì giá trị a là giá trị bất kỳ được nhập từ bàn
phím. Ta lấy giá trị a là giá trị canh chừng để dừng vòng lặp. Thực hiện như sau:
i) Dữ_liệu_vào := giá _trị_đầu_tiên;
ii) While dữ_liệu_vào <= giá_trị_canh_chừng_a do
Begin
….
Dữ_liệu_vào:=giá_trị_tiếp_theo;
End;

Chương trình chi tiết:
Program Vidu;
Var a, S: real;
n, i: integer;
Begin
write(‘ Nhap a = ‘); Readln(a);
S:=0; i:=1; {khoi gan gia tri ban đau cho S va i}
while S<=a do {chung nao S con nho hon a thi con}
Begin
20


S:=S+1/i;
i:=i+1;
End;
n:=i-1; {n=i-1 vì khi kết thúc vòng lặp, giá trị của i làm S>=a}
Writeln(‘ Gia tri n lon nhat thoa man la n = ‘, n);
Readln;
End.
b) Điều khiển vòng lặp bằng cờ báo:
Xây dựng cấu trúc lặp mà được điều khiển bằng cờ báo thường áp dụng cho các bài
toán tìm kiếm sự tồn tại hay phần tử có tính chất nào đó. Với bài toán này thường sử
dụng một biến logic, ta thường khởi tạo cho biến cờ báo này một giá trị là False, lặp lại
nhiều lần phép kiểm tra cho đến khi điều kiện được thỏa mãn tức tìm thấy, khi đó ta gán
cho biến cờ báo giá trị là True và vòng lặp kết thúc. Cụ thể như sau:
(i) Cờ_báo:=False;
(ii) While not cờ_báo Do
Begin
…..
If tìm_thấy Then cờ_báo:=True;

End;
Ta xét ví dụ sau:
Ví dụ 4.6: Viết chương trình tìm số chính phương chẵn nhỏ nhất lớn hơn m với m nhập
từ bàn phím, in kết quả lên màn hình.
Program Vidu;
Var i, m: Integer;
Found:boolean;
Begin
i:=m; found:=false;
While found =false Do
If (frac(sqrt(i))=0)) and (i mod 2 =0) Then found:=true
Else i:=i+1;
Writeln(‘ So chinh phuong chan nho nhat ma lon hon ‘,m,’ la ‘, i);
Readln;
End.
Việc sử dụng câu lệnh Repeat ... Until để xây dựng cấu trúc lặp cũng thực hiện
tương tự.
4.4.6. Một số câu lệnh kết thúc sớm vòng lặp hoặc chương trình
4.4.6.1. Lệnh nhảy không điều kiện (Goto): là câu lệnh nhảy không điều kiện, cho
phép nhảy từ bất kì nơi nào bên trong chương trình hay chương trình con đến vị trí đã
đánh dấu bằng nhãn. Nhãn là một tên, như tên biến hoặc là một số nguyên, sử dụng như
sau:
Cú pháp: Goto nhãn;
Cách thực hiện:
1) Khai báo nhãn: phải khai báo nhãn tại phần đầu khai báo (xem cấu trúc chung một
chương trình Pascal) theo cú pháp: label nhãn1, nhãn2, …, nhãnN;
2) Đánh dấu đích: Trong thân chương trình vị trí đích sẽ nhảy đến bằng lệnh Goto cần
đánh dấu trước, theo cú pháp sau:
nhãn: các_câu_lệnh_đích;
3) Viết câu lệnh: Goto nhãn;

* Chú ý với lệnh nhảy vô điều kiện Goto:
21


- Có thể nhảy từ trong vòng lặp ra ngoài,
- Không cho phép nhảy từ ngoài vào trong vòng lặp, từ ngoài vào trong chương trình
con.
- Nên hạn chế dùng câu lệnh nhảy vô điều kiện Goto vì nó phá vỡ tính cấu trúc của câu
lệnh điều khiển, khó theo dõi.
Ví dụ 4.7: Viết chương trình nhập vào một số nguyên n, In ra màn hình số chính phương
lớn nhất mà không lớn hơn n.
Program Vidu;
Uses Crt;
Label in_ket_qua;
Var n,i:integer;
Begin
Clrscr;
Write('Nhap so n:'); Readln(n);
For i:=n Downto 1 Do
If frac(sqrt(i)) = 0 Then goto in_ket_qua;
in_ket_qua: writeln(' So chinh phuong do la : ',i);
Readln;
end.
4.4.6.2. Lệnh chấm dứt sớm vòng lặp (Break): là câu lệnh có tác dụng chấm dứt giữa
chừng một vòng lặp dù chưa kết thúc.
Cú pháp: Break;
Ví dụ 4.8: Xét lại ví dụ trên nhưng sử dụng câu lệnh Break
Program Vidu;
Var k,i:integer;
Begin

Write('Nhap so can kiem tra :');readln(k);
For i:=k Downto 1 Do
If frac(sqrt(i)) = 0 Then
Begin
Writeln(' So chinh phuong do la : ',i); Break;
End;
Readln;
End.
Chú ý:
- Lệnh Break cho phép thoát khỏi mọi kiểu vòng lặp For, While ... Do hay Repeat ...
Until.
- Nếu có nhiều vòng lặp lồng nhau thì câu lệnh Break cho phép thoát khỏi vòng lặp
bên trong nhất chứa nó. Các vòng lặp bên ngoài vẫn hoạt động bình thường.
4.4.6.3. Lệnh thoát khỏi chương trình con (Exit): là lệnh kết thúc và thoát khỏi chương
trình.
Cú pháp: Exit;
Sự thực hiện câu lệnh như sau:
- Nếu câu lệnh ở bên trong chương trình con thì sẽ chấm dứt chương trình con (mặc
dù chưa đến câu lệnh cuối) và trở về chương trình bên ngoài đã gọi chương trình con đó.
- Nếu câu lệnh ở trong chương trình chính (không ở trong chương trình con nào cả)
thì lệnh này chấm dứt chương trình chính và dừng lại.
Chú ý: Câu lệnh Exit chỉ nên sử dụng trong các chương trình con.
Ví dụ 4.9: Viết chương trình nhập vào số k, kiểm tra số k có phải là số nguyên tố hay
không?
22


Program Vidu;
Var k,i:integer;
Function lsnt(k:integer):boolean;

Var i:integer;
Begin
lsnt:=false;
if k<2 then exit;
if k>3 then
For i:=2 to trunc(k/2) do
if k mod i = 0 then exit;
lsnt:=true;
End;
Begin
Write('Nhap so can kiem tra :');readln(k);
If lsnt(k) then writeln(k,' la so nguyen to')
Else writeln(k,' khong la so nguyen to');
Readln;
End.
4.4.6.4. Lệnh dừng chương trình bất thường (Halt): là lệnh dừng chương trình chính.
Lệnh này được sử dụng khi xảy ra lỗi, sai sót nghiêm trọng, việc tiếp tục chương trình là
không có ý nghĩa.
Cú pháp: Halt;
Ví dụ 4.10:
Program Vidu;
Var f,x,y:real;
Begin
Writeln(' Nhap x = '); Readln(x);
Writeln(' Nhap y = '); Readln(y);
If y <>0 then f:=x/y
Else halt; {Chuong trinh se dung lai ngay khi thay y =0}
Writeln(' f = ',f:8:3);
Readln;
End.


BÀI TẬP
1. Lập chương trình in ra màn hình các ký tự của bảng mã ASCII từ ký tự số 32 đến
ký tự số 127.
2. Cho một số có ba chữ số abc (a<>0). Tìm các số a, b, c sao cho: abc=a 3+b3+c3.
3. Lập chương trình tính diện tích tam giác biết hai cạnh là a, b, và góc xen kẻ giữa
hai cạnh a, b là anpha. Giá trị của hai cạnh a, b và góc anpha được nhập vào từ
bàn phím.
4. Một khối trụ bán kính đáy là r, chiều cao là h. Lập chương trình tính thể tích và
diện tích toàn phần của khối trụ đó. Các giá trị của bán kính r và chiều cao h của
khối trụ được nhập vào từ bàn phím.
5. Một thửa ruộng hình chữ nhật kích thước a x b (mét). Tính sản lượng lúa thu
được trong một năm nếu một năm cấy hai vụ, năng suất vụ mùa là 180 kg/sào,
năng suất vụ chiêm bằng 85% vụ mùa. Đơn vị sào nói đến ở đây là sào Bắc bộ,
mỗi sào Bắc bộ là 360 m2). Giá trị của a, b được nhập vào từ bàn phím.
23


6. Tốc độ tăng dân số của một quốc gia là 2% một năm. Năm 1990 dân số nước này
là 65 triệu người. Hỏi năm 2000 sẽ có bao nhiêu người.
7. Tìm các số có ba chữ số abc (a<>0) sao cho a+b+c chia hết cho 7 và hai chữ số liền nhau
bằng nhau (Ví dụ các số 115, 266).

8. Có 20 tờ giấy bạc mệnh giá 1000, 500, 200. Tổng giá trị của hai mươi tờ là 13500. Hỏi
mỗi loại giấy bạc có bao nhiêu tờ.

9. Cho số nguyên dương N. Lập chương trình tìm các số nguyên tố không lớn hơn N, hiện
kết quả lên màn hình mỗi dòng 20 số.
10. Lập chương trình tính N!! biết rằng:
N!! = 1*3*5*…N nếu N lẻ

N!! = 2*4*6*…N nếu N chẵn
11. Cho một số thực phần nguyên có 4 chữ số, phần thập phân có một chữ số. Viết chương
trình hiện lên màn hình:
Chữ số hàng nghìn:…
Chữ số hàng trăm:…
Chữ số hàng chục:…
Chữ số hàng đơn vị:…
Chữ số phần thập phân:…

24


Chương 5
DỮ LIỆU CÓ CẤU TRÚC
5.1. Kiểu mảng
5.1.1. Khái niệm
Mảng là một tập hợp hữu hạn các phần tử có cùng kiểu dữ liệu đã được định nghĩa
trước.
5.1.2. Khai báo mảng
Có hai kiểu dữ liệu mảng là mảng một chiều và mảng hai chiều. Để khai báo các
biến thuộc các kiểu dữ liệu mảng đó cần chỉ rõ ba yếu tố sau:
- Tên mảng (theo quy định đặt tên của Pascal).
- Số lượng phần tử của mảng (thông qua khai báo chỉ số).
- Kiểu dữ liệu chung của các phần tử mảng.
Người lập trình có thể định nghĩa trước kiểu dữ liệu thông qua từ khóa TYPE rồi mới
khai báo mảng. Nếu sử dụng các kiểu đơn giản chuẩn đã có thì có thể khai báo trực tiếp
biến kiểu mảng.
5.1.2.1. Khai báo trực tiếp
Cú pháp:
- Khai báo biến mảng thuộc kiểu mảng một chiều:

Var <Tên biến mảng>: Array[<Kiểu chỉ số>] of <Kiểu phần tử>;
Trong đó: <Tên biến mảng> là tên gọi biến mảng do người sử dụng đặt. số> không những cho ta biết số phần tử của mảng mà còn cho biết thứ tự của từng phần
tử trong mảng. Kiểu dữ liệu của <Kiểu chỉ số> chỉ có thể là kiểu đơn giản và có thể nhận
một trong các kiểu dữ liệu sau đây:
+ Kiểu ký tự.
+ Kiểu tập con (của Integer hoặc Char).
+ Kiểu do người lập trình tự định nghĩa.
+ Kiểu Boolean.
<Kiểu chỉ số> bao gồm hai giá trị: Giá trị đầu và giá trị cuối, các giá trị này viết cách
nhau bởi hai dấu ‘.’. Giá trị đầu phải nhỏ hơn giá trị cuối. <Kiểu phần tử> là kiểu dữ liệu
của các phần tử của mảng, có thể là bất kỳ kiểu dữ liệu nào đã được định nghĩa.
Chú ý:
+ Nếu <Kiểu chỉ số> thuộc kiểu ký tự (tức là một tập con của Char) thì các ký tự
phải đặt trong cặp dấu nháy đơn.
+ <Kiểu chỉ số> không được là kiểu Real hoặc một kiểu có cấu trúc nào đó.
+ Để khai báo nhiều hơn một biến mảng thì tên các biến mảng đó phải viết cách
nhau bởi dấu phẩy.
Ví dụ 5.1: Khai báo hai mảng A, B, mỗi mảng gồm 5 phần tử, mỗi phần tử là một số
thuộc kiểu Byte. Thứ tự của các phần tử trong mỗi mảng là 1, 2, ..., 5.
Var A,B: Array[1..5] Of Byte;
Mô phỏng mảng A:
Các phần tử mảng A
*****
Số thứ tự của các phần tử: 1 2 3 4 5

Ví dụ 5.2: Khai báo mảng C gồm 5 phần tử, mỗi phần tử là một chuỗi gồm nhiều
nhất là 10 ký tự.
Var C: Array[‘A’..’E’] Of String[10];
25



×