You are on page 1of 94

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN

KHOA CÔNG NGHỆ THÔNG TIN

BΜI TËP
NG«N NG÷ LËP TR×NH PASCAL
Phần cơ sở

Tác giả :

Ngô Thanh Huyền


Nguyễn Hữu Đông
Nguyễn Văn Hậu

Tài liệu lưu hành nội bộ

LỜI NÓI ĐẦU


Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Ngôn ngữ Pascal do giáo sư N. Wirth sáng tác ra năm 1970, là một ngôn
ngữ thuật giải, có tính cấu trúc chặt chẽ, sáng sủa và với mục đích làm công cụ
giảng dạy cho sinh viên. Học Ngôn ngữ lập trình PASCAL, các bạn học sinh, sinh
viên còn học được lối tư duy mạch lạc, rõ ràng.
Hiện nay, đã có rất nhiều tài liệu, giáo trình viết cho ngôn ngữ này nhưng
vẫn chưa tương ứng, phù hợp với yêu cầu, nội dung và thời gian cho sinh viên
trong trường. Sau một thời gian giảng dạy ở khoa Công nghệ thông tin - trường
Đại học sư phạm kỹ thuật Hưng Yên, chúng tôi viết cuốn sách này nhằm cung cấp
tài liệu học tập cho sinh viên phù hợp với chương trình môn học Nhập môn tin
học. Về nội dung, chúng tôi bám sát với chương trình của nhà trường và hệ thống
bài tập cũng được biên soạn theo các chương lý thuyết. Với mỗi chương sẽ được
chia thành 3 phần:
Phần A. Nhắc lại lý thuyết: tóm tắt các kiến thức cơ bản, các ví dụ và các
lưu ý hữu ích, các kinh nghiệm trong khi lập trình
Phần B. Bài tập mẫu có phân tích thuật toán và chương trình minh hoạ
Phần C. Bài tập tự giải: người học thực hiện việc giải các bài tập này

Chúng tôi mong rằng tài liệu này đáp ứng được một phần nào nhu cầu của
học sinh, sinh viên.

Bộ môn Công nghệ phần mềm

Môc lôc
Trang 2
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Trang 3
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

GIẢI THUẬT

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC

 Phân tích được định nghĩa và các đặc trưng của giải thuật
 Biểu diễn được giải thuật bằng cách liệt kê từng bước và Lưu đồ
khối
 Trình bày được một số giải thuật thường gặp
 Viết được giải thuật để giải quyết các bài toán theo yêu cầu

A/ NHẮC LẠI LÝ THUYẾT

1. Định nghĩa
Giải thuật là một hệ thống chặt chẽ và rõ ràng các qui tắc nhằm xác định một
dãy các thao tác trên những đối tượng, sao cho sau một số hữu hạn bước thực
hiện các thao tác ta thu được kết quả mong muốn
2. Các đặc trưng của giải thuật
- Tính kết thúc
- Tính rõ ràng, chặt chẽ
- Tính phổ dụng
- Tính hiệu quả
3. Cách biểu diễn giải thuật
a. Liệt kê từng bước các thao tác
Các động tác cơ bản:
- Bắt đầu
- Thông báo, yêu cầu
- Gán giá trị
- Thực hiện các phép tính số học, logic
- Kiểm tra điều kiện
- Chuyển không điều kiện, chuyển có điều kiện
- Lặp lại
- Kết thúc
b. Lưu đồ khối
Dùng các hính thể hiện các thao tác và các mũi tên chỉ thứ tự thực
Trang 4
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

hiện các thao tác thành một sơ đồ biểu diễn giải thuật:
1/ Nút giới hạn: được biểu diễn bởi hình ôvan có ghi chữ bên trong như :

Các nút trên còn được gọi là nút đầu và nút cuối của lưu đồ.
2/ Nút thao tác: là một hình chữ nhật có ghi các lệnh cần thực hiện. Ví dụ:

3/ Nút điều kiện: thường là một hình thoi có ghi điều kiện cần kiểm tra. Trong các
cung nối với nút nầy có 2 cung ra chỉ hướng đi theo 2 trường hợp: điều kiện đúng
và điều kiện sai. Ví dụ:

4/ Cung: là các đường nối từ nút nầy đến nút khác của lưu đồ.
Hoạt động của thuật toán theo lưu đồ được bắt đầu từ nút đầu tiên. Sau khi
thực hiện các thao tác hoặc kiểm tra điều kiện ở mỗi nút thì bộ xử lý sẽ theo một
cung để đến nút khác. Quá trình thực hiện thuật toán dừng khi gặp nút kết thúc
hay nút cuối.
4. Một số giải thuật thường gặp
a) Hoán vị hai giá trị X,Y
Bước 1. Dùng một giái trị trung gian TG và gán TG=X
Bước 2. Gán X=Y
Bước 3. Gán Y = TG
b) Tìm phần tử nhỏ nhất trong dãy X1, X2, …, Xn

Bước 1. Vào các giái trị n, X1, X2, …, Xn

Bước 2. Gán i=1


Bước 3. Gán j=2
Bước 4. Nếu j>n thì kết thúc, giá trị nhỏ nhất tìm được là Xi, trái lại tiếp tục
bước 5
Bước 5. Nếu Xj <Xi thì gán i=j

Bước 6. Tăng j lên 1 đơn vị và quay về bước 4


c) Xem A có thuộc dãy X1, X2, …, Xn không? (Tìm kiếm tuần tự)

Trang 5
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bước 1. Vào các giá trị n, X1, X2, …, Xn và A

Bước 2. Gán i=1


Bước 3. Nếu i>N thì sang bước 5, trái lại đến bước 4
Bước 4. Nếu A=Xi thì sang bước 5, trái lại tăng i lên 1 đơn vị và quay về
bước 3
Bước 5. Nếu i>N thì thông báo A không thuộc dãy, trái lại thông báo A là
phần tử thứ i trong dãy

B./BÀI TẬP MẪU

Bài tập 1.
Nêu giải thuật cho chạy một chương trình tên là Bai1.Pas đã ghi trong đĩa
mềm
Giải thuật:
Bước 1. Kiểm tra xem máy bật chưa? Nếu bật thì chuyển sang bước 3
không thì thực hiện bước 2
Bước 2. Bật máy. Chờ khởi động xong hệ điều hành, sang bước 3
Bước 3. Khởi động Turbo Pascal, nếu trong máy không có chương trình
thì sang bước 4
Bước 4. Cho đĩa Turbo Pascal vào (tối thiểu cần có các File Turbo.exe và
Turbo.tpl)
Bước 5. Chọn File rồi mở xem trên đĩa có File Bài1.Pas chưa? Nếu chưa
thì nạp đĩa khác và lặp lại bước 5, nếu rồi thì sang bước 6
Bước 6. Chọn tệp Bài1.pas, ấn Enter nạp chương trình Bai1.pas vào máy
Bước 7. Ấn phím Ctrl + F9 hoặc dùng lệnh Run để chạy chương trình
Bai1.Pas
Bài tập 2
Cho dãy số X1, X2, …, Xn . Trình bày giải thuật sắp xếp lại dãy này theo thứ
tự tăng dần
Giải thuật:
Bước 1. Nhập dãy X1, X2, …, Xn

Bước 2. Gán i=j


Bước 3. Gán j=i+1
Bước 4. Kiểm tra Xj < Xi. Nếu đúng thì sang bước 5 không thì sang bước
6
Bài tập 3
Trang 6
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Viết thuật toán để nhập vào 2 số và tìm số lớn nhất trong 2 số này.
Giải thuật:
Bước 1: Nhập vào 2 số a và b
Bước 2: - Nếu a > b thì Max là A
& Kết thúc
- Trái lại (Không phải a > b) thì Max là B
& Kết thúc
Bài tập 4
Vẽ lưu đồ cho ví dụ trên.

Bài tập 5.
Vẽ lưu đồ thích hợp cho chuỗi lệnh dưới đây:
Giải thuật:
(i) Nhập vào một số num
(i) Hiển thị num
(ii) Kiểm tra num > 0 ?
(iii) Nếu đúng thì gán num = num +1
iv) Kết thúc.

Trang 7
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bài tập 6
Lưu đồ để tìm tổng số trẻ em nhỏ hơn 18 tuổi trong thành phố

Bài tập 7
Vẽ lưu đồ để nhập vào cạnh đáy & chiều cao của hình tam giác và tính diện
tích của hình tam giác đó
Gợi ý: Diện tích S = 0.5 * cạnh đáy * chiều cao
Trang 8
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bài tập 8
Công ty Meridian cho người bán hàng 5% hoa hồng nếu hàng tháng họ bán
được ít hơn 10,000 Rs và 10% hoa hồng nếu hàng tháng họ bán được nhiều hơn
hoặc bằng 10,000 Rs. Tính hoa hồng cuối tháng cho một người bán hàng.
Giải thuật:

Trang 9
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

MỞ ĐẦU VỀ NGÔN NGỮ LẬP TRÌNH PASCAL

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC

 Phân tích được các phần tử cơ sở: tập ký tự, từ khoá, tên chuẩn, tên
tự đặt
 Phân biệt các kiểu dữ liệu chuẩn, các phép toán
 Biểu diễn được các biểu thức trên các kiểu dữ liệu chuẩn
 Phân tích được các thành phần trong cấu trúc một chương trình
Pascal

A/ NHẮC LẠI LÝ THUYẾT


1. Tập ký tự
Các ký tự của Pascal bao gồm:
- Bảng chữ cái gồm 26 chữ cái tiếng Anh (thường và in) từ a đến z và dấu
gạch dưới
- Bảng chữ số gồm các số từ 0 đến 9
- Các dấu phép toán: + - * / (chia) = <> (khác)
- Các dấu chính tả , ; . : ‘ space (dấu cách)
- Các dấu ngoặc () []{ }
- Một số dấu đặc biệt @#$^

2. Các từ khoá
Các từ khoá (keyword) là các từ dành riêng mà người dùng không được thay
đổi hoặc dùng vào mục đích khác. Các từ khoá bao gồm một số định danh như
Program, Procedure, Function, Type, Var, const… hoặc một số câu lệnh như
for, while, repeat, do, then …

3. Các tên chuẩn


Các tên chuẩn là tên một số đối tượng (biến, hằng, kiểu, hàm, thủ tục) mà
Pascal đã định nghĩa trước. Khi dùng chúng không cần khai báo. Các tên chuẩn
có thể được định nghĩa lại, tuy nhiên nên để chúng như ý nghĩa đã đặt để tránh
nhầm lẫn.

4. Các tên tự đặt


Các tên tự đặt là tên mà người dùng đặt cho các đối tượng trong chương
trình của mình. Chúng phải được khai báo trước khi dùng. Các tên tự đặt phải
tuân theo các quy tắc sau:

Trang 10
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Chỉ được gồm các chữ cái và các chữ số, phải bắt đầu bằng chữ cái
- Không được trùng với từ khoá
Pascal không phân biệt chữ hoa và chữ thường. Dấu cách (space) không
được phép có mặt trong tên (người ta thường dùng dấu gạch dưới (_)để tách các
từ trong tên cho dễ đọc).
Nên đặt tên có tính gợi nhớ để dễ theo dõi hoặc hiệu chỉnh chương trình,
không nên đặt tên quá dài hoặc trùng với các tên chuẩn.

5. Các kiểu chuẩn


Pascal định nghĩa trước một số kiểu chuẩn:
- Kiểu Integer: là kiểu số nguyên 2 bytes ( từ 32768 đến 32767). Ngoài ra,
còn có thêm các kiểu số nguyên khác như sau:

Tên kiểu Kích thước Phạm vi biểu diễn


Byte 1 byte 0 đến 255
ShortInt 1 byte -128 đến 127
Word 2 bytes 0 đến 65535
LongInt 4 bytes -2147483648 đến 2147483647

- Kiểu Real: là kiểu số thực 6 bytes, có giá trị tuyệt đối nằm trong khoảng từ
2.9E-39 đến 1.7E+38, với phần định trị gồm 11 đến 12 chữ số có nghĩa
Trong tài liệu này, để thích hợp cho việc trình bày kiểu số nguyên được sử
dụng là: integer hoặc byte; kiểu số thực là: Real
- Kiểu Char: là kiểu ký tự 1 byte, gồm 256 ký tự trong bảng mã ASCII ( từ 0
đến 255)
- Kiểu Boolean: là kiểu logic 1 byte gồm 2 giá trị: True (đúng) và False (sai)

6. Các phép toán


Các phép toán (Operator) nhằm liên kết các toán hạng (Operand) để sinh ra
một giá trị. Đối với các kiểu chuẩn Pascal có các phép toán chủ yếu sau:
- Phép toán số học: bao gồm 4 phép toán số học:
+ (cộng)
- (trừ)
* (nhân)
/ (chia)
trên các toán hạng kiểu số (integer hoặc real). Chú ý, kết quả của phép /
bao giờ cũng là kiểu real. Đặc biệt, với các toán hạng kiểu Integer, có phép div
để lấy thương nguyên và phép mod để lấy phần dư
- Phép toán quan hệ: bao gồm các phép so sánh:
= (bằng) <> (khác) < (nhỏ hơn) > (lớn hơn) <= (nhỏ hơn hoặc bằng) >= (lớn
hơn hoặc bằng
Chú ý, kết quả của phép so sánh luôn thuộc kiểu Boolean

Trang 11
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Phép toán logic: bao gồm 3 phép:


and ( và hay hội)
or ( hoặc hay tuyển)
not (phủ định)
kết quả các các phép toán logic thuộc kiểu Boolean

7. Một số hàm chuẩn


Turbo Pascal có sẵn một số hàm trên kiểu chuẩn (integer, real, char, boolean).
Dưới đây là một số hàm thường gặp:
- Hàm đại số:
Abs(x): lấy giá trị tuyệt đối của x
Sqr(x): tính bình phương của x
Sqrt(x): tính căn bậc 2 của x
Int(x): lấy phần nguyên của x
Frac(x): lấy phần lẻ của x
- Hàm siêu việt:
Exp(x): tính e mũ x
Ln(x): tính lôga cơ số e của x
- Hàm lượng giác:
sin(x): tính sin của x
Cos(x): t ính cos của x
ArcTan(x); t ính arctang của x
- Hàm đổi số thực thành số nguyên
Round(x): làm tròn số thực x thành số nguyên gần nhất
Trunc(x): làm tròn số thực x bằng cách lấy phần nguyên
- Hàm ký tự
Chr(n): trả ra ký tự có mã ASCII là n
Ord(c): trả lại mã ARCII của ký tự c
Upcase(c): trả lại chữ cái in hoa của chữ cái c
- Một số hàm khác
Random: cho một số thực ngẫu nhiên trong khoảng (0,1)
Random(n): cho một số nguyên ngẫu nhiên từ 0 đến n-1
8. Biểu thức
Biểu thức là một sự kết hợp các giá trị (hằng, biến, hàm) bằng các phép
toán để sinh ra một giá trị mới. Kiểu của biểu thức là kiểu của giá trị mà nó
sinh ra. Các phép toán trong một biểu thức được thực hiện theo thứ tự:
- Phép toán một ngôi (đối, phủ định)
- Phép toán lớp nhân (nhân, chia, chia nguyên, lấy phần dư, hội (và))
- Phép toán lớp cộng (cộng, trừ, tuyển)
- Phép toán quan hệ
Để thay đổi thứ tự ưu tiên, cần đặt khối tính vào trong cặp dấu ngoặc

Trang 12
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

tròn ()

9. Cấu trúc một chương trình P ascal


Một chương trình Pascal gồm 3 phần:
- Phần đầu chương trình có dạng:
Program Tên_chương_trình;
- Phần khai báo gồm các mô tả những đối tượng sẽ dùng trong phần câu
lệnh (trừ những đối tượng chuẩn)
+ Khai báo hằng:
Const
Tên_hằng = giá_trị;
....................
+ Khai báo kiểu:
Type
Tên_kiểu = kiểu;
....................
+ Khai báo biến:
Var
Dãy_tên_biến: Kiểu;
hoặc khai báo biến có khởi tạo giá trị bằng cú pháp:
Const Tên_biến: Kiểu = giá_trị;
....................
+ Khai báo hàm:
Function Tên_hàm(.....): Kiểu;
....................
+ Khai báo thủ tục:
Procedure Tên_thủ_tục (....);
....................
- Phần câu lệnh (thân chương trình) gồm các câu lệnh của chương
trình:
Begin
Dãy_các_câu_lệnh;
End.

10. Chú thích


Pascal cho phép viết các chú thích trong chương trình bằng cách đặt
chúng vào trong cặp dấu ngoặc nhọn { } hoặc trong cặp dấu đôi (* *)

- CÁC VÍ DỤ
Ví dụ 1:
Cho năm tên hợp lệ và năm tên không hợp lệ trong Turbo Pascal

Trang 13
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Năm tên hợp lệ: lopa1, lop_a1, x, abc, bien


- Năm tên không hợp lệ: lop a1, bien nguyen( có chứa dấu cách) , 1abc,
12lop (bắt đầu bằng số), for (trùng với từ khoá)

Trang 14
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Ví dụ 2:
Hãy khai báo biến: a,b là các biến thực, i nhận giá trị nguyên trong khoảng
từ -32768 đến 32767; j1,j2 nhận giá trị nguyên không âm <=65535; k
nhận giá trị nguyên từ 0 đến 255; biến n kiểu nguyên nhận giá trị bằng 10
Var a,b: real;
i: integer;
j1,j2: word;
k: byte;
Const n:integer = 10;
Ví dụ 3: Khai báo hằng kiểu nguyên và hằng kiểu kí tự
Const
x = 10; ch = 'A';

III. MỘT SỐ LƯU Ý


o Trong khi đặt tên hay mắc phải lỗi sau:
- Vi phạm quy tắc đặt tên như: tên bắt đầu bằng chữ số, trong tên có
chứa dấu cách
- Đặt tên trùng với từ khoá
Một thói quen tốt khi đặt tên nên đặt tên ngắn gọn, có tính gợi nhớ để dễ theo
dõi, nếu cần có thể phân tách các từ có nghĩa bằng dấu gạch dưới (_), ví dụ:
So_nguyên thay vì đặt tên khó hiểu như s hoặc sn...
 Khi sử dụng các kiểu dữ liệu phải chú ý đến phạm vi biểu diễn, kích thước và
các phép toán tác động trên các kiểu dữ liệu đó. Có thể hay mắc phải các lỗi
khai báo và sử dụng các kiểu dữ liệu không phù hợp. Ví dụ: khai báo biến a,b
nguyên nhưng biến chứa thương của chúng nếu khai báo là số nguyên thì sẽ
có trường hợp không thoả mãn do phép chia không nguyên; hoặc sử dụng các
phép mod và div cho số thực ...
 Biểu diễn các biểu thức phải chú ý đến thứ tự ưu tiên của các phép toán

B/ BÀI TẬP MẪU

Bài số 1:
Các câu lệnh sau đây câu lệnh nào sai, tại sao?
a) Const x:=555;
b) Var y:integer;
Hướng dẫn:
Câu lệnh ở mục a) sai vì cú pháp khai báo hằng là:
Const tên_hằng = giá_trị;
Bài số 2:
Gải sử có khai báo Var x:integer;
Hãy xem các giá trị nào dưới đây có thể gán cho biến x:
Trang 15
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

a) 1E-6 b)15 c) 65535

Hướng dẫn:
Ta biết rằng, phạm vi biểu diễn của kiểu Integer là từ -32768 đến 32767
nên trong các giá trị đó chỉ có giá trị b) 15 thoả mãn và có thÓ g¸n cho biÕn x
Bài số 3:
Biểu diễn các biểu thức sau theo ngôn ngữ Pascal:
x+ y
a) x − z b) (1 + x2) y
2

c) e
+ x−4

Hướng dẫn:
Sử dụng các hàm chuẩn của Pascal và thứ tự ưu tiên của các phép toán
để biểu diễn:
a) (x + y) / (x - z) b) (1 + sqr(x)) * y
c) exp(2) + sqrt(x-4)
Bài số 4:
Viết các biểu thức quan hệ và logic sau theo ngôn ngữ Pascal:
a) a<x<b b) b2 - 4ac <0 c) y < a-c hoặc y < c+b
d) D = 0 và D1 ( 0 hoặc D2 =0
Hướng dẫn:
Sử dụng các hàm chuẩn của Pascal và thứ tự ưu tiên của các phép toán
để biểu diễn:
a) (a < x) and ( x<b)
b) ( sqr(b) - 4*a*c) <0 hoặc (b*b - 4*a*c)<0
c) (y < a-c) Or (y <c+b)
d) (D=0) and (D1 <>0) Or (D2=0)

C/ CÂU HỎI VÀ BÀI TẬP TỰ GIẢI

I- CÂU HỎI TRẮC NGHIỆM

Trong các câu hỏi dưới đây, hãy chọn một câu trả lời thích hợp nhất:
Câu 1: Tính cấu trúc của ngôn ngữ Pascal được thể hiện :
a) trong việc tổ chức các dữ liệu;
b) trong việc tổ chức các câu lệnh;
c) trong việc tổ chức chương trình;
d) ở cả ba mục a), b), c) ;

Trang 16
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Câu 2: Ðiều gì làm cho Pacal được đánh gía cao và trở thành một trong những
ngôn ngữ thảo chương phổ biến nhất hiện nay ?
a) 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.;
b) Nó là một ngôn ngữ chặt chẽ cả về mặt cú pháp và về mặt dữ dtệu;
c) Nó là ngôn ngữ có văn phạm sáng sủa, dễ hiểu, có khả năng đủ mạnh;
d)Cả ba điều nêu trong các mục a), b), c) ;

Câu 3: Khẳng định nào đúng:


a) VAR , BEGIN, end là các từ khóa của Pascal được khái niệm lập trình có
cấu trúc.;
b) Các ký hiệu a, b, g, d đều thuộc bộ ký tự cơ bản của Pascal;
c) Var, begin, Integer, Real là các từ khóa của Pascal;
d)VAR, Var, VaR, var là các từ khóa khác nhau của Pascal ;

Câu 4: Tên nào đặt Sai quy định của Pascal:


a) Giai_Ptrinh_Bac_2;
b) Ngaysinh;
c) Noi sinh;
d)Sv2000 ;

Câu 5: Mục nào có các Tên đều đặt đúng quy định của Pascal:
a) x1 , X-2 ;
b) Xx1 , X2;
c) CONST , X_234;
d)X[1], x2 ;

Câu 6: Chọn câu Sai : trong một chương trình Pascal, có thể không có :

a) phần thân chương trình ;


b) phần khai báo biến;
c) phần đầu chương trình;
d) phần khai báo hằng ;

Câu 7: Dấu hiệu kết thúc chương trình Pascal là :

a) End;
b) END;
Trang 17
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

c) end.
d) End ! ;

Câu 8: Trong Pascal, lệnh nào có tác dụng xóa màn hình :

a) CLRSSR ;
b) CLRSR;
c) Clrscl;
d) Clrscr ;

Câu 9: Trong Pascal, nếu muốn dùng lệnh xóa màn hình Clrscr thì phải khai báo
thế nào ở ngay sau phần tiêu đề chương trình :

a) Uses CRT ;
b) USES Graph;
c) use CRT ;
d) không khai báo gì cả ;

Câu 10: Khẳng định nào Sai: trong Turbo Pascal,

a) để lưu chương trình lên đĩa, gõ phím F2 hoặc chọn lệnh File / Save ;
b) để mở một tập tin cũ, gõ phím F1;
c) để tìm lỗi cú pháp của chương trình, gõ phím Alt_F9, hay F9 ;
d) để chạy chương trình, gõ phím ^F9 hoặc chọn lệnh Run / Run ;

II. BÀI TẬP


Bài tập 1:
Cho n¨m tªn hîp lÖ trong Turbo Pascal

Bài tập 2:
Trong những tên dưới đây cho biết tên nào là tên chuẩn:
for sin(x) cos not artan tg
x exp end alpha chr sqrt
in Var abs(a) upcase odd inc

Bài tập 3:
Các giá trị sau thuộc kiểu dữ liệu chuẩn nào?
a) 15.0 b)1922 c)'?'
d) Int(15.172) e) 3<7 g)sqrt(16)
h) 12/4 i) 64221 j) -1e10

Bài tập 4:
Trang 18
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Khai báo biến gồm: a,b là các biến thực; i nhận các giá trị nguyên trong
khoảng từ -32768 đến 32676; j1,j2 nhận các giá trị nguyên không âm trong
khoảng từ 0 đến 65535; k nhận các giá trị nguyên từ 0 đến 255

Bài tập 5:
Hãy viết khai báo sau:
a) Các biến thực x,y,z; các biến nguyên m,n,i,j
b) Các biến R1,R2 thuộc loại thực; các biến ký tự a,e,ten
c) 5 biến logic và 3 biến nguyên (tự đặt tên)
d) Các hằng 1993, 32.5, '%'

Bài tập 6:
Cho biết kết quả và kiểu dữ liệu của các biểu thức sau:
a) 8+5.0+4
b) 9/3 + 2 div 3 + 7
c) (10*((45 mod 5) +6))/2
d) (5<=3) And (Not True and (12 Div 3 <=1))

Bài tập 7:
Viết các ngôn ngữ sau theo ngôn ngữ Pascal:
x+ y
a) x − y b) ey+5x c)(1+x2) y
2
x
2

1+ x
2

1+ x
(2 sin 2 x + 3 cos 2 x )tg 5 x
2 2 −2
d)
1+ x
e) 3 +3
g) lnx + e2 h) x + x + x
3 4

i) x
− lg( x + 2) − x − 4

Bµi tËp 8:
Viết các biểu thức quan hệ và logic sau theo ngôn ngữ Pascal:
a) a<x<b b) b2 - 4ac <0
c) y<a-c hoặc y<a+c d) D=0 và D1 <> hoặc D2=0
e) D=0 và D1 = 0 hoặc D2<>0 g) D=0 và D1 = 0 và D2<>0
h) a=0 và b=0

Bài tập 9:
Các câu lệnh sau đây câu lệnh nào sai tại sao?
a) Const x:=555;
Trang 19
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

y = 'HA NOI'
b) Var sin,a,i:integer;
c) Var x,y,then:real;
d) Const a= (5+7=3);

Bài tập 10:


Chuyển các biểu thức viết theo Pascal sau đây thành biểu thức toán học
thông thường:
a) exp(x * ln(y)) b) (5*x-6*y)/x*y
c) (cos(3*x)/4 + sin(x/4)/a/b d) sqrt(z + aqrt(sqr(u)+sqr(v))

Bài tập 11:


Giả thiết có các khai báo:
Var x,y,z:real;
p,q:byte;
i,j:integer;
ch:char;
k:word;
b:boolean;
Hãy xem các giá trị dưới đây có thể gán cho các biến nào:
a) 1e-6 b) 1.1e+39 c)15 d) 0
e) 465.0 f)65535 g)-15 h)65536
i)-32769 j)1992 k)'a' l)i*3/j
m)' ' n)p+k*x o) Odd(i) p) x=y+z;

Trang 20
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

THỦ TỤC VÀO/RA DỮ LIỆU


MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC:
 Sử dụng được câu lệnh gán cho các biến
 Phân biệt được cú pháp của dạng của thủ tục Write và Read
 Vận dụng được câu lệnh gán và các thủ tục vào/ra dữ liệu để viết
các chương trình đơn giản theo yêu cầu

A/ NHẮC LẠI LÝ THUYẾT


1. Lệnh gán
- Cú pháp: Tên_biến:= Biểu_thức;
- Chức năng: Tính giá trị của biểu thức và gán cho biến
- Ví dụ minh hoạ:
Khai báo biến trước khi sử dụng:
Var x,y:integer; ch:char; b:boolean
Ta có, các câu lệnh gán sau:
X:=5; x:=y;
Ch:=’A’; b:=TRUE;
- Mét sè lu ý:
 Kiểu của biÕn ph¶I gièng (hoặc tương thích) với kiểu của biểu thức
(Phép gán cho phép giữa các biến cùng kiểu bất kỳ, trừ kiểu File
( Các biến cần được gán giá trị trước khi dùng
2. Các thủ tục vào/ra chuẩn
• Thủ tục vào
- Cú pháp:
Read (Danh_sách_các_biến_cần_đọc);
hoặc
Readln (Danh_sách_các_biến_cần_đọc);
C¸c biÕn trong Danh_sách_các_biến_cần_đọc ph©n c¸ch nhau bëi
dÊu phÈy (,)
- Ví dụ minh hoạ:
Read(a); - Đọc giá trị tương thích từ bàn phím và gán cho biến a
Hoặc Readln(a,b); - Đọc giá trị từ bàn phím và gán cho biến tương ứng,
mỗi lần nhập giá trị cách nhau ít nhất một dấu cách
• Thủ tục ra
- Có ph¸p:
Write (Danh_sách_các_biểu_thức_cần_đưa_ra);
Hoặc
Writeln (Danh_sách_các_biểu_thức_cần_đưa_ra);

Trang 21
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Các biểu thức trong Danh_sách_các_biểu_thức_cần_đưa_ra phân cách nhau bởi


dấu phẩy (,)
- Ví dụ minh hoạ:
Write(‘Khoa CNTT’);
Write(‘ Cong nghe phan mem ‘);
sẽ in ra màn hình dòng chữ: Khoa CNTT Cong nghe phan mem
hoặc Writeln(‘Khoa CNTT’);
Write(‘ Cong nghe phan mem ‘);
sẽ in ra màn hình dòng chữ:
Khoa CNTT
Cong nghe phan mem

B/ BÀI TẬP MẪU


Bài số 1:
Viết chương trình in ra màn hình hình tam giác như sau:
*
* *
* * *
* * * *
Hướng dẫn:
Sử dụng thủ tục in ra màn hình các kí tự (*) trên các dòng để tạo thành
hình tam giác
Chương trình minh hoạ:
0100090000037800000002001c000000000004000000030108000500
00000b0200000000050000000c022005f806040000002e0118001c000
000fb021000070000000000bc02000000000102022253797374656d00
05f806000057890000ac5d110004ee8339e8011c000c0200000400000
02d01000004000000020101001c000000fb02ceff00000000000090010
00000000440001254696d6573204e657720526f6d616e00000000000
00000000000000000000000040000002d01010005000000090200000
0020d000000320a2d0000000100040000000000f8061d05200016000
40000002d010000030000000000

Bài số 2:
Viết chương trình in ra màn hình một bài thơ

Hướng dẫn:
Mỗi câu thơ được in trên 1 dòng, do đó nên sử dụng dạng lệnh in Writeln

Chương trình minh hoạ:


Trang 22
Program Ca_dao;
Program Cuu_chuong_1;
Begin Var
so :Integer;
Writeln('Trong dam gi dep bang sen,');
Bài tập Pascal phần cơ sở
Begin Biên soạn: Bộ môn CNPM – UTEHY
Writeln('La xanh bong trang lai chen nhi vang,');
Write('-Bang
Writeln('Nhi cuu chuong
vang bong trang la soxanh.');
may ?: ');
Readln(so);
Writeln('Gan bun ma chang hoi tanh mui bun');
Writeln;
Bài số 3: l?nh cu?i c?ng kh?ng c?n k?t th?c b?ng d?u ;
Readln c?u
Writeln;
End. Cho 3 sốCHUONG
Writeln(' A = 555;TRINH
B = -4.3;
BANG C =CUU2100000000.
CHUONG');Hãy viết chương trình đưa
các dữWriteln('-------------------------------');
liệu này vào máy bằng hằng và đưa các số đó ra màn hình theo qui cách
Writeln;
dùng 14 vị trí, trong đó có 3 số lẻ nếu là số thực
Writeln(so:2,' lan 1 = ',so*1:3);
Hướng dẫn:
Writeln(so:2,' lan 2 = ',so*2:3);
- Khai báo hằng theo cú pháp
- Sử dụng thủ tục in số ra màn hình có qui cách: Write(a:m[:n]);
Trong đó: m là số vị trí chiếm chỗ của a trên màn hình; n là số chữ số phần
thập phân nếu a là số thực. Biết rằng màn hình dạng text có 25 dòng và 80 cột
Chương trình minh hoạ:
0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
010000030000000000
Bài tập 4:
Viết chương trình in ra màn hình bảng cửu chương của số nhập từ bàn
phím
Chương trình minh hoạ:

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
04ee8339e8011c000c020000040000002d01000004000000020101001c000000f
b02ceff0000000000009001000000000440001254696d6573204e657720526f6d6
16e0000000000000000000000000000000000040000002d010100050000000902
000000020d000000320a2d0000000100040000000000f8061d052000160004000
0002d010000030000000000
Trang 23
Program DTHTron;
Var bkinh, dtich : real;
Begin
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Write(‘Cho b?n k?nh : ’); Readln(bkinh);
dtich:=PI*bkinh*bkinh;
Writeln(‘Dien tich vong tron : ’, Dtich:8:2);
Readln;
End.
Bài tập 5:
Viết chương trình cho máy hỏi tên của một học sinh (nhập tên từ bàn phím)
và đưa ra màn hình dòng chữ: Chao ban <ten>. Ví dụ: nhập tên là Hoa sẽ in ra
màn hình: Chao ban Hoa
Hướng dẫn:
Sử dụng kết hợp thủ tục vào/ra dữ liệu
Chương trình minh hoạ:

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
010000030000000000
Bài tập 6:

Tính diện tích hình tròn với hằng số PI

 Đề bài:

Tính diện tích hình tròn khi biết kích thước của bán kính với hằng số PI
cho trước

 Hướng dẫn :

- PI là giá trị không đổi trong chương trình và PI là hằng số có sẵn


trong Pascal

- Bán kính, diện tích hình tròn khai báo là 2 biến kiểu thực tương ứng:
bkinh và dtich

- Diện tích hình tròn được tính bằng công thức:

dtich:= PI * bkinh * bkinh;

 Chương trình minh họa :

Trang 24
Truong DHSPKT Hung Yen
Khoa CNTT
Program ChuViHCN;
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Var Dai, Rong, Chuvi : integer ;
Begin
Write(‘Nh?p chi?u d?i hinh chu nhat : ’); Readln(Dai);
Write(‘Nh?p chi?u r?ng hinh chu nhat : ’); Readln(Rong);
Chuvi:=2*(dai +rong);
Writeln(‘Chu vi hinh chu nhat la : ’, Chuvi);
Readln;
End.

Bài tập 7:

Đề bài: Tính chu vi hình chữ nhật khi biết kích thước chiều dài và chiều rộng

 Phân tích bài toán :

Chiều dài và chiều rộng của hình chữ nhật khai báo bằng 2 biến nguyên:
dai, rong. Chu vi hình chữ nhật được tính và lưu vào biến chuvi. Kích thước của
2 biến dai, rong được nhận theo 2 cách:

+ Gán giá trị bằng lệnh gán

+ Đọc giá trị từ bàn phím và gán cho biến chiều dài và chiều rộng

 Chương trình minh họa :

C/ BÀI TẬP TỰ GIẢI

Bài tập 1:
Viết chương trình in ra màn hình dòng chữ như sau:

Hướng dẫn:

Nhập thêm các dấu cách đứng trước và đứng sau dòng chữ 'Khoa CNTT'

Bài tập 2:
Viết chương trình đưa họ tên, ngày tháng năm sinh của học sinh Nguyen
Thanh Mai, sinh ngày 12/02/1980 vào máy bằng hằng và đưa các dữ liệu đó ra
màn hình.

Hướng dẫn:
- Khai báo hằng theo cú pháp

Trang 25
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Sử dụng thủ tục in dữ liệu ra màn hình

Bài tập 3:
Viết chương trình để máy tính nói chuyện với người sử dụng:
- Máy “nói” bằng các câu in ra màn hình
- Người sử dụng “nói” bằng cách đánh từ bàn phím
Nội dung cuộc nói chuyện tuỳ thích
Hướng dẫn:
Khai báo các biến kiểu string để chứa các thông tin của người và máy
Bài tập 4:
Tính và đưa ra màn hình giá trị của biểu thức A sau đây:
Y = ax
Z = loga(x)
Hướng dẫn:
- Trong Pascal để tính luỹ thừa f = ab ta dựa vào các hàm có sẵn bằng
cách biến đổi như sau: f = ab = (elna)b = eb*lna nên f = exp(b*ln(a))
- Và g = logax = ln(x)/ln(a)
Bài tập 5:
Viết chương trình đọc từ bàn phím độ dài 3 cạnh của tam giác ABC rồi tính
diện tích và các đường cao của tam giác
Hướng dẫn:
Dùng công thức Hêrông: S = Sqrt(p(p-a)(p-b)(p-c)) trong đó p là nửa chu vi
Bài tập 6:
Viết chương trình nhập vào số lượng tờ 200, 500, 1000, 2000, 5000 tiền
Việt Nam và tính tổng số tiền
Bài số 7:
Cho tam giác ABC với 3 đỉnh có toạ độ là (x1,y1), (x2,y2), (x3,y3). Tính
chu vi và diện tích tam giác
Bài số 8:
Viết chương trình nhập vào tổng số giây, sau đó đưa ra màn hình dạng
hh:mm:ss (giờ:phút:giây)

CÁC CÂU LỆNH RẼ NHÁNH

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC

 Phân tích được cú pháp của câu lệnh rẽ nhánh dạng khuyết, dạng
đủ và đa lựa chọn

Trang 26
M?u 2:
M?u 1:
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Case <bi?u_th?c> Of
Case <bi?u_th?c> Of
h?ng1: <c?ng_vi?c1>;
h?ng1: <c?ng_vi?c1>;  So sánh được điểm giống và khác nhau của 2 dạng lệnh rẽ nhánh
h?ng2: <c?ng_vi?c2>;
h?ng2: <c?ng_vi?c2>;
 Sử dụng thành thạo các............................
câu lệnh rẽ nhánh để thể hiện giải thuật
............................
h?ng N: <c?ng vi?c n>;
h?ng N: <c?ng vi?c  Vậnn>;dụng được để viết các chương trình theo yêu cầu
Else <c?ng_vi?c n+1>;
End;
End;
A/ NHẮC LẠI LÝ THUYẾT
1. Câu lệnh rẽ nhánh IF
Câu lệnh IF dùng để rẽ nhánh dựa vào việc kiểm tra một giá trị kiểu
Boolean.
- Cú pháp khai báo có 2 dạng :
+ Dạng khuyết:
IF <điều_kiện> THEN <công_việc>;
+ Dạng đủ:
IF <điều_kiện> THEN <công_việc1>
ELSE <công_việc2>
trong đó điều kiện là biểu thức Boolean, còn công_việc có thể là một
hay nhiều câu lệnh ( nằm trong khối Begin ... end)
- Ví dụ minh họa:
Tìm số lớn nhất trong hai số a,b:
If a>b then max:=a else max:=b;
- Lưu ý:
+ Trước else không có dấu chấm phẩy (;)
+ Trong trường hợp có nhiều câu lệnh If lồng nhau thì Else sẽ gắn với If
không có Else gần nhất
2. Câu lệnh Case:
- Cú pháp khai báo:

- Ví dụ minh hoạ:
+ VÝ dô 1:
Case so of
1: begin
Writeln(‘So 1’);
Writeln(‘La so dau tien’);
end;
Trang 27
PROGRAM Max_min; Tim so lon nhat va so nho nhat c?a hai so
Var a, b, Max, Min : Real;
Bài
Begin tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Program Sap_xep;
Write(‘
Var Nhap a va b :’);
so1,so2,tam:Integer; Readln(a,b);
IfBegin
a < b then 2: Writeln(‘So 2’);
End;XEP 2 SO NGUYEN');
Writeln('SAP
begin
Writeln('-------------------');
Max:=
+ Ví b;
dụ 2: Min:= a;
Write('-Nhap
end so thu nhat: '); Readln(so1);
Casesoch
Write('-Nhap thuof hai : '); Readln(so2);
else tr??c else kh?ng c? d?u ;
If so1 > so2 Then ‘0’ ..’9’: Writeln(‘ Ch la mot chu so ‘);
beginBegin
Max:= a; tam:=so1;
‘A’:
Min:= b;
Writeln(‘ Chu cai A ‘);
end; ‘B’,’C’: Writeln(‘ch la mot trong 2 chu cai B,C’);
so1:=so2;
in ra man hinh so2:=tam;
giaElse
tri max va min Writeln(‘ ch khong phai la chu so hay chu
Writeln(‘ End;
So lon nhat la: ‘ , Max:6:2); 2 so thap phan
cai A,B, C ‘);
Writeln;
Writeln(‘ SoEnd;nho nhat la: ‘ , Min:6:2);
Writeln('Ban vua nhap cac so sau');
Readln;
- MộtWriteln(so1:10);
số lưu ý:
End. Writeln(so2:10);
+ Biểu thức phải là các kiểu vô hướng đếm được (là các kiểu dữ liệu cơ
Readln
bản đã học trừ kiểu real, kể cả kiểu liệt kê hoặc đoạn con sẽ học sau)
End.
+ C¸c hằng phải cùng kiểu (tương thích) với kiểu của biểu thức
B/ BÀI TẬP MẪU
Bài số 1:
ViÕt chương trình nhập vào hai số a và b, tìm và in ra mµn h×nh số nhỏ
nhất và số lớn nhất của chúng (Mở rộng tìm max, min của 3 số, 4 số)
Híng dÉn: Ðể tìm số lớn nhất của hai số a và b, ta so s¸nh gi¸ trÞ 2 sè a,b
Chương trình minh hoạ:

Bài tập 2:
Viết chương trình sắp xếp 2 số nguyên theo thứ tự tăng dần
Chương trình minh hoạ:

Bài số 3:
Viết chương trình nhập vào 3 số a,b,c bất kỳ và kiểm tra xem 3 số đó có
Trang 28
Program Tien_dien;
Program Tam_giac; T?nh ti?n ?i?n
UsesString[18];
Var Bài Ho_ten:
tập Pascal crt; cơ sở
phần Biên soạn: Bộ môn CNPM – UTEHY
Varchiso2,
chiso1, a,b,c:real;
Ldtt, Tien : Real;
Begin phải làBEGIN
độ dài ba cạnh của một tam giác hay không. Thông báo ra màn hình :
clrscr;
Write(‘
“ThoảNhap
mãn” ho hayva ten :’);
“Không Readln(Ho_ten);
thoả mãn” trong các trường hợp tương ứng
Writeln('Nhap do dai 3 canh tam giac ');
Write(‘ Nhap ch? s?=th?ng
Write('a tr??c, ch? s? th?ng n?y: ‘);
'); readln(a);
Hướng dẫn:
Readln( chiso1,Write('bchiso2);
= '); readln(b);
-
Ldtt:=chiso2-Ta biết, điều kiện để a,b,c là ba cạnh của một tam giác là mỗi cạnh phải
chiso1;
Write('c = '); readln(c);
dương và60
If Ldtt<= Iftổng hai Tien:=Ldtt*5
(a>0)
then cạnh
And thì lớn hơn
(b>0) cạnh còn lại.
And(c>0)
else - ThểAnd hiện (a+b>c)
nhận xét trênAnd(b+c>a) Andlogic
bằng biểu thức (a+c>b) Then
của Pascal ta có các biểu
ifthức
Ldttsau: Writeln('Thoa
<=160a>0, thenb>0, man: Day
Tien:=60*5+(Ldtt la 3 canh
c>0, a+b>c, b+c>a,- a+c>b
60)*8 cua tam giac ')
Else Writeln('Khong thoa man! ');
else
Chương readln;
trình minh hoạ:
Tien:=60*5 + 100*8 + (Ldtt - 160) * 10;
Bài số END.
4:
Writeln(‘ H? v? t?n l? ‘, Ho_ten);
Writeln(‘NhậpTi?n vào
ph?ihọ tr?tên
l? một chủ hộ, chỉ số điện kế tháng trước (chiso1) và chỉ số
‘ , Tien:10:2);
điện kế tháng này (chiso2), tính tiền điện tháng này cho hộ, biết rằng :
Readln;
End. Mỗi kw trong 60 kw đầu tiên có đơn gía là 5đ,
Từ kw thứ 61 đến kw thứ 160 có đơn giá 8đ,
Từ kw thứ 161 trở lên có đơn gía 10đ.
Híng dÉn:
Ví dụ, ông A có chỉ số điện tháng trước là chiso1=1020 và chỉ số điện tháng
này là chiso2=1070, lượng điện tiêu thụ tính ra là Ldtt= 1070-1020=50, do lượng
điện tiêu thụ < 60 nên số tiền sẽ là:
Tien = 50*5= 250đ.
Nếu chiso2=1150 thì Ldtt = 1150-1020=130, do lượng điện tiêu thụ vượt qúa
60 kw nhưng chưa vượt qúa 160 kw nên tiền điện được tính là:
Tien=60*5 + (130-60) *8 = 860 đ.
Nếu chiso2=1234, thì Ldtt = 1234-1020= 214, do lượng điện tiêu thụ vượt qúa
160 kw nên tiền điện sẽ là:
Tien=60*5 + 100*8 + (214-160)*10= 300+800+54*10= 1640 đ.
Chương trình minh hoạ:

Trang 29
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bµi tËp 5:
Nhập vào ba hệ số A, B, C, (A <> 0) rồi giải và biện luận phương trình bậc
hai: Ax2 + Bx + C = 0
Hướng dẫn:
- Việc đầu tiên là phải tính Delta : Delta = B2 - 4AC
Sau đó biện luận theo Delta:
+ Nếu Delta<0 : phương trình vô nghiệm
−B
+ Nếu Delta=0 : phương trình có nghiệm kép :
X 1, 2
=
2A
+ Nếu Delta > 0: phương trình có hai nghiệm :

− B + delta − B − delta
X 1
=
2A X 2
=
2A
Chương trình minh hoạ:
0100090000037800000002001c0000000000040000000301080005000000
0b0200000000050000000c022005f806040000002e0118001c000000fb021
000070000000000bc02000000000102022253797374656d0005f80600005
7890000ac5d110004ee8339e8011c000c020000040000002d01000004000
000020101001c000000fb02ceff0000000000009001000000000440001254
696d6573204e657720526f6d616e00000000000000000000000000000000
00040000002d010100050000000902000000020d000000320a2d00000001
00040000000000f8061d0520001600040000002d010000030000000000
Chú ý:
Trong chương trình có ba lệnh IF xét riêng từng trường hợp Delta âm, bằng
không hoặc dương. Chú ý rằng khi Delta=0 thì phải làm hai lệnh:
X1:=-B/(2*A);
Writeln(‘ Có ng. kép X1=X2= ‘ , X1:8:2);
nên hai lệnh này phải được đặt giữa hai từ khóa begin và end để tạo thành một
câu lệnh ghép.
Tương tự, khi Delta>0 thì phải làm năm lệnh, và do đó cả năm lệnh cũng phải
để trong khối begin và end.

Bài tập 6:

Trang 30
PROGRAM Phan_loai;
Var Ho_ten: String[20];
Namsinh,
Bài tập PascalNamnay,
phần cơ sở Tuoi : Integer ; Biên soạn: Bộ môn CNPM – UTEHY
Phanloai : String[14];
Begin Tính điểm trung bình các môn học của một học sinh và đưa ra lời nhận xét
Program Diem_Trung_binh;
Write(‘ Nh?p h? v? t?n: ‘); Readln(Ho_ten);
Const Hướng dẫn:
Write(‘
MucDiem = Nh?p
5; n?m sinh v? n?m nay : ‘); Readln(Namsinh, Namnay);
Tuoi:=Namnay
DiemDat Khai báo
=10; một
- Namsinh; số biến kiểu logic chứa kết quả sau khi so sánh các điểm
môn học
DiemLoai
If Tuoi< với
0 then =2;các tiêu chuẩn
writeln( ‘Nh?p đánh
sai giá‘)
Var else
Chương trình minh hoạ:
Ten:String[24];
begin
Van,Toan,Tongdiem:Real;
Case Tuoi of
Dat,Loai,Hocdeu:Boolean;
Begin 0 Bài
,1tập 7:
: Phanloai:= ‘s? sinh’;
Writeln('TINH DIEM
2 ..9 : Nhập TRUNG
Phanloai:= BINH
‘nhi VA NHAN XET');
?ong’;
vào họ tên và năm sinh của một người, cho biết người này thuộc lứa
Writeln('--------------------------------');
10
tuổi..15
nào:: sơ
Write('-Cho Phanloai:=
sinh,
biet ho nhi ‘thieu
ten:đồng, ni?n’;
thiếu
'); Readln(Ten);niên, thanh niên, trung niên hay người lớn tuổi,
16 ..32
Write('-Cho
biết rằng:: Phanloai:=
biet diem ‘thanh
mon Van nien’;
: '); Readln(Van);
Write('-Cho
33 ..50 : Phanloai:= ‘trung nien’; Readln(Toan);
biet diem mon Toan: ');
Tongdiem:=Van+Toan
else Phanloai:= tuổi từ 0
Sơ sinh có ‘nguoi lonđến 1
tuoi’;
Dat:=(Tongdiem >=DiemDat);
end; h?t Nhi
Loai:=(Van Case đồng : có tuổi
< DiemLoai) từ 2 đến
Or (Toan 9
< DiemLoai)
Writeln(Ho_ten,
Hocdeu:=(Van #32có, tuổi
>MucDiem)
Thiếu niên Tuoi,
Andtừ#32
(Toan
10 đến ,>Phanloai);
Mucdiem)
15
Writeln('+Hoc
end; sinh: ',ten);
Write('+Tong
Readln; Thanhso diem: tuổi từ 16 đến 32
niên có',Tongdiem:5:2);
If Dat And (Not Loai) Then
End. Begin Trung niên có tuổi từ 33 đến 50
Write('
Người lớn Duoc
tuổi cólen lop');
tuổi trên 50.
If hocdeu Then Write(' Hoc deu cac mon')
Hướng dẫn: Else Write(' Hoc chua deu cac mon');
End
Else Ta nhận thấy có rất nhiều kết quả tương ứng với các giá trị khác nhau, do
đó taWrite(' Khong
lựa chọn câu duoc len lop');
lệnh Case ... of
Writeln;
Chương trình
Writeln(' minh <Enter>
Bam phim hoạ: de ket thuc');
Readln
End.

Trang 31
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

C/ CÂU HỎI VÀ BÀI TẬP TỰ GIẢI

I - CÂU HỎI TRẮC NGHIỆM


Câu 1: Lệnh nào sau đây in ra màn hình số lớn nhất giữa A và B :
a) If A > B then write(B) else write(A);
b) If A > B then write(A) else write(B);
c) If A > B then Readln(A) else Readln(B);
d) If A < B then writeln(A) else writeln(B);
Câu 2: Cho N là biến kiểu nguyên, chọn câu đúng cú pháp :
a) If N < 10 then write (' Nho hon 10 ') ; else write (' Lon hon 10 ');
b) If N < 10 Write (' Nho hon 10 ') else then write (' Lon hon 10 ');
c) If N < 10 then write (' Nho hon 10 ') else write (' Lon hon 10 ');
d) If N < 10 then N := 10 else N > 20 then write (' N > 20 ');
Câu 3: Kiểm tra nếu ba số a, b, c đều lớn hơn 1 thì in số 1, chọn lệnh nào :
a) if (a > 1) and ( b > 1) and ( c > 1) then write(1);
b) if (a > 1) or (b > 1) or (c > 1) then write(1);
c) if a > 1 and b > 1 and c > 1 then write(1);
d) if a, b , c đều > 1 then write(1);
Câu 4: Cho i là biến nguyên. Sau khi thực hiện các lệnh :
i:=2;
Case i of

Trang 32
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

1: i:=i+1;
2: i:=i+2;
3: i:=i+3;
end;
Gía trị sau cùng của i là :
a) 2
b) 3
c) 4
d) 5
Câu 5: Cho N là biến nguyên, sau khi thực hiện các lệnh:
N:= 9;
If N< 0 then writeln(‘ So am‘)
else
Case N mod 2 of
0: Writeln(‘ Chan’);
1: Writeln(‘ Le ‘);
end;
Kết qủa in lên màn hình là:
a) Chan
b) Le
c) So am
d) không in gì cả
Câu 6: Cho hàm số:

Nhóm lệnh nào tính đúng y :


a) if x > 0 then y:=x ; b) if x <= -1 then y:=2*x +1
if x > -1 then y:=Sin(x) else
else if x <=0 then y:=Sin(x)
y:= 2*x+1; else y:=x;
Câu 7: Giả sử i là biến nguyên, sau khi thực hiện các lệnh :
i:=5;
Case i of

Trang 33
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

1: i:=i+1;
2: i:=i+2;
3: i:=i+3;
else i:=2*i;
End;
thì gía trị sau cùng của i là :
a) 10
b) 6
c) 8
d) 9
Câu 8: Cho ch biến ký tự, i biến nguyên, sau khi thực hiện các lệnh:
i:= -15;
ch:='E';
Case i of
0..14 : ch:='D';
15..20: ch:='C';
21..24: ch:='B';
else ch:='A';
End;
thì gía trị sau cùng của ch là :
a) 'A'
b) 'B'
c) 'C'
d) 'E'
Câu 9: Cho ch biến ký tự, i biến nguyên. Ðể gán trị cho biến ch, thì lệnh :
Case i of
0,1,2 : ch:='A';
3..8 : ch:='B';
else ch:='C';
end;
tương đương với nhóm lệnh nào :
a) If i<0 then ch:=’C’ b) if (i >= 0) and (i<= 2) then ch:='A';
else if (i>=3) and (i<=8) then ch:='B'
if i<=2 then ch:=’A’ else

Trang 34
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

else ch:='C';
if i<=8 then ch:=’B’
else ch:=’C’ ;
Câu 10: Khi chạy chương trình :
Var S, i : Integer;
Begin
i := 3; S:= 40;
if ( i > 5 ) then S:= 5 * 3 + ( 5 - i ) * 2
else
if ( i > 2 ) then S:= 5 * i
else S:= 0;
End.
Giá trị sau cùng của S là :
a) 0
b) 19
c) 40
d) 15
II. bµi tËp
Bài tập 1:
ViÕt ch¬ng tr×nh tÝnh vµ in ra mµn h×nh gi¸ trÞ lín nhÊt vµ
nhá nhÊt cña 4 sè

Bài tập 2:
Viết chương trình nhập và kiểm tra xem 3 toạ độ 3 điểm A(xa,ya),
B(xb,yb), C(xc,yc) có phải là 3 đỉnh của một tam giác hay không? Nếu đúng là 3
đỉnh của tam giác thì thông báo đó là tam giác loại gì: vuông, cân hay đều?
Hướng dẫn:
- Tính độ dài các cạnh a,b,c là độ dài của vecto BC, AC, AB
- So sánh các cạnh a,b,c với các tính chất của các loại tam giác

Bµi tËp 3:
Nhập một chữ cái, nếu là chữ thường thì đổi thành chữ hoa, ngược lại, nếu
là chữ hoa thì đổi thành chữ thường. Ví dụ : nhập A in ra a, nhập b thì in ra B.

Bài tập 4:

Trang 35
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Viết chương trình giải phương trình bậc nhất: ax + b =0

Bài tập 5:
Viết chương trình giải bất phương trình bậc nhất: ax + b >0

Bài tập 6:
Nhập các hệ số, giải và biện luận các hệ phương trình sau theo quy tắc Cramer :

Bµi sè 7:

ViÕt ch¬ng tr×nh nhập số thực x và tính : y=3 x

Hướng dẫn: Dùng hàm ex và Lnx, xét ba trường hợp x=0, x>0,
x<0).

B¸i sè 8:
ViÕt ch¬ng tr×nh nhập số thực x và tính:
2

y=
3
x −4

B¸i sè 9:
ViÕt ch¬ng tr×nh nhập x thực và tính y theo công thức :

Bái số 10:
Viết chương trình để máy tính nói chuyện với người:
- Mỏy “nói” bằng các câu trên màn hình
- Người “nói” bằng cách gõ từ bàn phím
Nội dung cuộc trò chuyện:

Trang 36
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Máy hỏi “Bạn có gia đình chưa?”, nếu chưa thì khuyên “bạn hãy bình tĩnh
và thận trọng”, nếu có rồi thì hỏi xem có mấy con. Nếu có số con <=2 thì bảo là
“Được đấy”, nếu trên 2 con thì bảo “Nhiều quá”

Bái số 11:
Viết chương trình nhập họ tên một chủ hộ, định mức điện hàng tháng của
hộ, chỉ số điện kế tháng trước và tháng này. Hãy tính tiền điện cho hộ, biết rằng:
Mỗi kw trong định mức có đơn gía là 5đ,
100 kw đầu tiên trên định mức có đơn giá 8đ,
Từ kw thứ 101 trên định mức trở lên có đơn gía 10đ.
B¸i sè 12:
ViÕt ch¬ng tr×nh nhập Họ tên, Chức vụ (giám đốc, trưởng phòng, phó
phòng hay nhân viên - khi nhập gõ tắt là: GD, TP, PP, NV ) và Mức lương tháng
của một người.Tính:
Phụ cấp lương cho ngưới đó như sau :
PC = 50% Mức lương tháng nếu là GD
= 40% " " " TP
= 30% " " " PP
= 20% " " " NV
Tính Tổng thu nhập tháng theo công thức :
TONGTN = Mức lương + PC
In Họ tên,Chức vụ, Mức lương , Phụ cấp và Tổng thu nhập lên
màn hình .
B¸i sè 13:
ViÕt ch¬ng tr×nh tính tiền thuê máy cho một lớp học như sau :
Nhập GBD ( giờ bắt đầu làm) : 6 <= GBD <= 20

GKT ( giờ kết thúc làm) : GBD < GKT <= 21


SLM ( số lượng máy ).
Cho biết đơn gía :
2.5 ngàn đồng/ 1 giờ/ 1 máy, áp dụng trước 16 giờ

3 ngàn đồng/ 1 giờ/ 1 máy, áp dụng sau 16 giờ.


Giải quyết bài toán trong hai trường hợp :
a) GBD, GKT đều nguyên ?
b) GBD, GKT không nguyên ?

Bái số 14:

Trang 37
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Viết chương trình nhập vào một số nguyên từ 1 đến 10 và in ra màn hình nghĩa
tiếng Anh tương ứng. Ví dụ: nhập vào số 2 thì in ra màn hình: 2 => Two

Bái số 15:
ViÕt ch¬ng tr×nh nhập Họ tên, các điểm Toán, Lý, Hóa ( kiểu nguyên )
cho một người. Tính Tổng điểm ba môn :
TONG = TOAN + LY + HOA và phân loại như sau :
Kém : khi TONG= 0, 1, 2, ...,14
Trung bình : khi TONG= 15, 16, ..., 20
Khá : khi TONG= 21, 22, ..., 26
Giỏi : khi TONG  27
In lên màn hình Họ tên, các điểm TOAN, LY, HOA, TONG và
Phân loại.
B¸i sè 16:
Cũng hỏi như bài 10 nhưng phân loại như sau :
TONG <15 :-Loại Kém
15 <= TONG<21 :-Nếu có một môn bị điểm < 5 : loại Kém, không có môn nào bị
điểm<5 : loại Trung bình.
21<= TONG<27 :-Nếu có một môn bị điểm < 7 : loại Trung bình, không có môn
nào bị điểm < 7 : loại Khá.
TONG >= 27 :-Nếu có một môn bị điểm < 9 : loại Khá, không có môn nào bị
điểm < 9 : loại Giỏi.
B¸i sè 17:
ViÕt ch¬ng tr×nh nhập một tháng, cho biết tháng đó thuộc mùa nào (Xuân,
Hạ, Thu, Ðông), biết rằng tháng 2, 3, 4 là mùa Xuân, tháng 5, 6, 7: mùa Hè, tháng
8, 9, 10: mùa Thu, và tháng 11, 12, 1: mùa Ðông.
B¸i sè 18:
ViÕt ch¬ng tr×nh nhập một ký tự bất kỳ, cho biết ký tự đó thuộc loại
nào: là chữ hoa, là chữ thường, là chữ số hay các ký tự khác.
Bµi tËp 19:
Nhập vào tháng và năm, cho biết tháng đó trong năm đó có bao nhiêu ngày.
Híng dÉn:
Theo dương lịch :
Các tháng 4, 6, 9, và 11: có 30 ngày,
Các tháng 1, 3, 5, 7, 8, 10 và 12: có 31 ngày,
Riêng tháng 2 thì bình thường có 28 ngày, nhưng nếu là năm nhuận thì có 29

Trang 38
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

ngày.
Cách xác định một năm là nhuận như sau:
* hoặc là năm chia hết cho 400 (ví dụ năm 1600, năm 2000).
* hoặc là năm không chia hết cho 100 và chia hết cho 4 ( ví dụ các năm
1988, 1992, 1996 đều là năm nhuận).
Trong chương trình ta dùng một biến lôgic có tên là Nhuan để xác định có phải
là năm nhuận hay không.

Bái số 20:
Viết chương trình đọc ngày, tháng năm, sau đó viết ra màn hình đó là ngày thứ
mấy trong tuần
Hướng dẫn:
Sau đây là một cách tính Ngày trong tuần:
Nếu tháng <3 thì tháng:= tháng +12 và Năm: = Năm –1;
Thứ = ABS (Ngày + 2 tháng + 3 (tháng +1) DIV 5 + năm + năm DIV 4)
MOD 7
trong đó Thứ =0 tương ứng với ngày chủ nhật, 1-> thứ Hai ....
Công thức trên chỉ có giá trị từ ngày 1.3.1900. Điều đó cũng đủ để chúng
ta áp dụng trong thực tế. Nào bạn hãy bắt tay vào viết chương trình và thử xem
ngày bạn ra đời là thứ mấy trong tuần!

Trang 39
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

CÁC CÂU LỆNH LẶP

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC

 Phân tích được cú pháp của câu lệnh lặp xác định và không xác
định
 So sánh được điểm giống và khác nhau giữa các dạng l ệnh
 Sử dụng thành thạo các câu lệnh l ặp để thể hiện giải thuật
 Vận dụng được để viết các chương trình theo yêu cầu

A/ NHẮC LẠI LÝ THUYẾT

1. Câu lệnh lặp xác định FOR


- Cú pháp:
FOR biến := gtdau TO gtcuoi DO <công_việc>; {dạng 1 }
hoặc FOR biến := gtcuoi DOWNTO gtdau DO <công_việc>; {dạng 2 }
- Yêu cầu:
biến phải thuộc kiểu dữ liệu đơn giản đếm được, thường là kiểu nguyên,
ký tự hay lô gic, không thể là kiểu thực hay chuỗi.
gtdau, gtcuoi là các biểu thức có cùng kiểu dữ liệu với biến,
Công_việc có thể là một lệnh đơn giản, lệnh có cấu trúc, hoặc là một lệnh
ghép gồm nhiều lệnh đặt trong khối begin và end.
- Cách thức hoạt động của FOR d ạng 1:
Bước 1: Gán giá trị biến := gtdau;
Bước 2: Nếu biến <= gtcuoi thì làm công_việc, rồi sang bước 3;
Nếu biến > gtcuoi thì không làm công_việc mà chuyển sang lệnh
tiếp theo ở phía dưới.

Trang 40
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bước 3 : Tăng gía trị của biến : biến:=Succ(biến);


Quay lại bước 2.
Tóm lại, <công_việc> sẽ được làm đi làm lại, bắt đầu khi biến= gtdau, và
kết thúc khi biến =gtcuoi+1, cả thảy là gtcuoi-gtdau+1 lần. Vì thế, người ta gọi
FOR là vòng lặp có số lần lặp đã biết trước.
- D¹ng 2 ho¹t ®éng t¬ng tù
- VÝ dô minh ho¹.
+ Ví dụ 1: Bài toán tính tổng :
Hãy tính tổng : S= 12 + 22+ 32+...+ 102
Lệnh: S:=S + i*i; được làm cả thảy 10 lần, ứng với i=1, 2, ..., 10. Qúa
trình này được diễn đạt bằng lệnh FOR, như sau:
For i:=1 To 10 DO S:=S+ i*i ;
Một cách tổng quát, để tính tổng :S= 12 + 22+ 32+...+ N2 , trong đó N là
một số nguyên dương bất kỳ, ta dùng hai lệnh:
S:=0;
For i:=1 To N DO S:=S+ i*i ;
2. C©u lÖnh lÆp kh«ng x¸c ®Þnh víi ®iÒu kiÖn tríc
- Cú pháp:
WHILE <Ðiềukiện> DO <công_việc> ;
Ý nghĩa : Chừng nào <Ðiềukiện> còn đúng thì cứ thực hiện <công_việc> , cho
đến khi Ðiềukiện sai thì không thực hiện <công_việc> nữa mà chuyển sang lệnh
tiếp theo ở phía dưới.
- Một số lưu ý:
+ Nếu <Ðiềukiện> không bao giờ sai thì <công_việc> sẽ phải làm mãi, lúc
đó ta có vòng lặp vô hạn. Trong trường hợp này, để dừng chương trình, hãy gõ
đồng thời hai phím Ctrl và Pause ( viết tắt là ^Pause).
+ Ðể tránh các vòng lặp vô hạn, trong thân của vòng WHILE cần có ít nhất
một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong <Ðiềukiện> để
đến một lúc nào đó thì <Ðiềukiện> sẽ sai và do đó vòng lặp sẽ kết thúc.
+ Có thể ví vòng lặp này như câu nói “còn nước còn tát”
- Ví dụ minh hoạ :
Tính S=N!:
While i<= N do begin
S:=S*i;
i:=i+1;
end;
Trang 41
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Sự khác nhau của lệnh WHILE so với FOR là ở chỗ: trong lệnh FOR, biến i
được tự động gán gía trị ban đầu và sau mỗi bước lặp được tự động tăng lên,
còn trong WHILE thì không, ta phải viết các lệnh đó.
Tất cả các bài toán giải quyết được bằng lệnh FOR thì đều giải quyết được
bằng lệnh WHILE. Ðặc điểm chung của các bài toán dạng này là số lần lặp của
các vòng lặp đã được biết trước.
Lệnh WHILE đặc biệt thích hợp với các vòng lặp có số lần lặp chưa biết trước,
trong khi lệnh FOR không giải quyết được. Ðây chính là điểm mạnh của lệnh
WHILE.
3. C©u lÖnh lÆp kh«ng x¸c ®Þnh víi ®iÒu kiÖn sau
- Cú pháp:
REPEAT
<công_việc>
UNTIL <Ðiềukiện> ;
- Ý nghĩa: Chừng nào Ðiềukiện còn sai thì cứ làm <công_việc>, cho đến khi
Ðiềukiện đúng thì không làm <công_việc> nữa mà chuyển sang lệnh kế tiếp ở
phía dưới.
<công_việc> cũng được gọi là thân của vòng lặp REPEAT, nếu nó gồm
nhiều lệnh thì các lệnh đó không cần phải đặt trong khối begin và end.
- Một số lưu ý:
+ Nếu <Ðiềukiện> không bao giờ đúng thì <công_việc> sẽ phải làm liên tục
không dừng, lúc đó ta có vòng lặp vô hạn. Trong trường hợp này, muốn dừng
chương trình, hãy gõ đồng thời hai phím Ctrl và Pause (^Pause).
+ Ðể tránh các vòng lặp vô hạn, trong thân của lệnh REPEAT cần có ít nhất
một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong <Ðiềukiện> để
đến một lúc nào đó thì <Ðiềukiện> sẽ đúng và do đó vòng lặp sẽ kết thúc.
Các vòng lặp có số lần lặp biết trước đều có thể giải được bằng lệnh
REPEAT. Ðặc biệt, cũng như lệnh WHILE, lệnh REPEAT rất thích hợp với các
vòng lặp có số lần lặp không biết trước
+ Vòng lặp này có thể ví như “tiền trảm hậu tấu” hay “làm trước hỏi sau”
- Ví dụ minh hoạ
Ví dụ 1: Ðảm bảo tính hợp lý của dữ liệu nhập từ bàn phím.
+Khi giải phương trình bậc hai Ax2+Bx+C=0, ta thường giả thiết A<> 0, khi
tính S=N!, ta thường yêu cầu N> 0. Sự hạn chế phạm vi đối với các dữ liệu nhập
sẽ đảm bảo tính hợp lý của chúng và làm giảm bớt các phức tạp khi biện luận.
+ Ðể buộc người sử dụng phải nhập A <> 0, nếu nhập A=0 thì bắt nhập lại
cho tới khi nhập A<> 0 mới thôi, ta dùng cấu trúc :

Trang 42
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Repeat
Write(‘Nhập A khác không : ‘);
Readln(A);
Until A<> 0;
Ðể đảm bảo chắc chắn nhập N thỏa điều kiện 0<N<20, ta dùng cấu trúc :
Repeat
Write(‘ Nhập N (0<N<20) : ‘);
Readln(N);
If (N<=0) or (N>=20) then write(#7);
Until (0<N) and (N<20) ;
Lệnh write( chr(7) ) hay write(#7) có công dụng phát ra tiếng kêu bip để cảnh
báo người dùng đã nhập dữ liệu sai yêu cầu.
Trong trường hợp này ta có thể dùng vòng lặp While, nhưng do đặc điểm
của vòng lặp While kiểm tra kiều kiện trước khi lặp, do đó N phải có giá trị trước
vòng lặp. Vì thế, đối với trường hợp này, việc dùng vòng lặp Repeat sẽ hợp lý
hơn.
Ví dụ 2: Thiết kế để chạy nhiều lần một chương trình.
Trong Turbo Pascal, mỗi lần muốn chạy chương trình ta phải gõ cặp phím
Ctrl và F9 (viết tắt là ^F9), điều này sẽ bất tiện nếu cần chạy chương trình nhiều
lần ứng với các bộ dữ liệu thử khác nhau. Cấu trúc sau đây cho phép ta chạy
chương trình một số lần theo ý muốn:
REPEAT
{ Các lệnh của chương trình}
Write(‘ Tiếp tục nữa không (Y/N) ? :’);
Readln(Traloi); {5}
UNTIL (Traloi =‘N’) or ( Traloi=‘n’);
Ở đây, Traloi là một biến kiểu ký tự (Char);
Sau khi thực hiện xong {các lệnh của chương trình }, nếu muốn chạy tiếp
thì ta gõ phím ‘Y ‘ , nếu muốn dừng thì gõ ‘N’ .
Chú ý : lệnh Readln(Traloi); ở dòng thứ {5} có thể thay bằng:
Traloi:=Readkey;
Hàm Readkey thuộc thư viện CRT cho kết qủa là một ký tự gõ từ bàn phím, nó
khác lệnh Readln(Traloi) ở chỗ là khi nhập ký tự ta không cần phải Enter.
So sánh các lệnh For, While và Repeat
+ Lệnh For dùng cho các vòng lặp có số lần lặp đã biết trước

Trang 43
PROGRAM Tinh_tong1; T?nh t?ng c?c b?nh ph??ng c?c s? t? nhi?n <=N
Var N, i : Integer;
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
S : LongInt;
Begin
+ Lệnh While hay Repeat tổng quát hơn lệnh For, dùng được cho tất cả các
Write(‘ Nh?p N :’); Readln(N);
loại vòng lặp, nhưng thường dùng cho các vòng lặp có số lần lặp chưa biết trước.
S:=0;
+ Lệnh
For i:=1 toWhile
N do và Repeat ;khác nhau ở điểm sau: lệnh While kiểm tra điều kiện
S:=S+i*i
trước, nếu‘,đúng
Writeln(‘S= S); mới thực hiện các lệnh ghi trong thân của nó ( <công_việc> ),
Readln;
còn lệnh Repeat thực hiện <công_việc> rồi mới kiểm tra điều kiện. Vì thế, lệnh
End. Repeat sẽ thực hiện các lệnh ghi trong thân của nó ít nhất được một lần.
+ Ngoài ra, lệnh While kết thúc khi điều kiện sai, lệnh Repeat kết thúc khi
điều kiện đúng.

B/ BÀI TẬP MẪU

Bài tập 1:
Viết chương trình tính tổng : S= 12 + 22+ 32+...+ N2
Ch¬ng tr×nh minh ho¹:

Ta có thể dùng vòng lặp While hoặc Repeat để tính tổng này. Khi đó các
đoạn lặp thay thế cho câu lệnh For như sau:
I:=1;
While i<=n do begin
S:=S+i*i;
i:=i+1; {thay đổi giá trị biểu thức điều kiện}
End;
hoặc
i:=1;
Repeat
S:=S+i*i;
I:=i+1;
Until (i>n);
Mở rộng bài toán tính tổng: Tính tổng đan dấu :
S = 12 - 22 + 32 - 42 +...+(-1)N-1 N2
Ta viết:
Trang 44
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

S = 12 + (- 22 ) + 32 + (- 42 ) + ... +(-1)N-1 N2
Nhận thấy, số hạng thứ i của vế phải có gía trị tuyệt đối bằng i2 , mang
dấu cộng nếu i lẻ, mang dấu trừ nếu i chẵn. Nói cách khác, ta sẽ cộng dồn i2 vào
S nếu i lẻ, và cộng dồn (- i2 ) vào S nếu i chẵn. Việc xác định i lẻ hay chẵn dựa
vào hàm Odd(i) hay kết qủa của phép toán i Mod 2. Vậy, các lệnh sẽ dùng là :
S:=0;
For i:=1 To N DO
if i mod 2 <> 0 then S:=S+ i*i else S:= S- i*i ;
Các bạn hãy viết chương trình để tính tổng đan dấu này.
Bµi tËp 2
ViÕt ch¬ng tr×nh tính tích: S= 10! .
Híng dÉn:
Ta viết S=1*2*3*...*10.
Qúa trình thực hiện từ bước 1 đến bước thứ 10 được mô tả bằng câu
lệnh For :
For i:=1 to 10 do S:=S * i ;
Một cách tổng quát, để tính tích: S= 1*2*...*N , trong đó N là một số
nguyên dương bất kỳ, ta dùng hai lệnh:
S:=1;
For i:=1 To N DO S:=S* i ;
- Ch¬ng tr×nh minh ho¹:

Trang 45
PROGRAM Tinh_tong2; T?nh S=N!
Var phần cơ sở
Bài tập Pascal Biên soạn: Bộ môn CNPM – UTEHY
N, i : Integer;
S : LongInt;
Begin
Write(‘Nh?p s? d??ng N : ‘); Readln(N);
S:=1;
For i:=1 to N do S:=S * i ;
Writeln(‘Giai thua = ‘, S);
Readln;
End.

Bµi tËp 3:
Nhập số tự nhiên N, dùng lệnh WHILE tính S=N!:
Ch¬ng tr×nh minh ho¹:
0100090000037800000002001c00000000000400000003010800050000000b0
200000000050000000c022005f806040000002e0118001c000000fb021000070
000000000bc02000000000102022253797374656d0005f806000057890000ac
5d110004ee8339e8011c000c020000040000002d01000004000000020101001
c000000fb02ceff0000000000009001000000000440001254696d6573204e657
720526f6d616e0000000000000000000000000000000000040000002d010100
050000000902000000020d000000320a2d0000000100040000000000f8061d0
520001600040000002d010000030000000000

Bµi tËp 4:
ViÕt ch¬ng tr×nh tìm bội số chung nhỏ nhất của hai số nguyên dương M và N.
Híng dÉn:
Bài toán này có những cách giải khác nhau, dưới đây là một cách đơn
giản. Trước hết, hãy xem cách tìm BSCNN của hai số M=5 và N=9.
Vì N>M nên ta sẽ tìm trong tập các bội số của N : { 9, 18, 27, 36, 45, ...} số nhỏ
nhất chia hết cho M, đó là số 45.
Một cách tổng quát, gọi Max là số lớn nhất của M và N. Ðầu tiên ta gán :
BSCNN:=0;
Sau đó cứ làm lệnh BSCNN:=BSCNN+Max ; cho đến khi BSCNN chia hết
cho cả M và N thì dừng.
Trong chương trình ta dùng lệnh repeat để nhập hai số M, N đảm bảo
Trang 46
PROGRAM BSCNN; T?m BSCNN c?a M v? N
Var M,Program
N, Max, BSCNN : Integer;
In_tam_giac; In tam giac can dac
Begin Usesphần
Bài tập Pascal crt; cơ sở Biên soạn: Bộ môn CNPM – UTEHY
Repeat Var m,i,j:integer;
Write(‘
dương. BEGIN
Nh?p M v? N d??ng :’);
clrscr;
Readln(M, N);minh ho¹:
Ch¬ng tr×nh
Until (M>0) and biet
Write('Cho so dong: '); readln(m);
(N>0);
clrscr;
If N>M then Max:=N else Max:=M;
For i:=1 to m do
BSCNN:=0;begin gotoxy(40-i,i);
Repeat For j:=1 to 2*i-1 do write('*');
BSCNN:=BSCNN
writeln; + Max;
Until (BSCNN
end; mod N=0) and (BSCNN mod M=0) ;
Writeln(‘gotoxy(10,24);
B?i s? chung nh?Writeln('An
nh?t= ‘,mot phim; bai ki de ket thuc!');
BSCNN)
Readln;repeat until keypressed;
readln;
End.
END.

Bµi sè 5
Viết chương trình dưới đây cho phép thực hiện một số lần việc : in tam
giác cân đặc có chiều cao m (0<m<20) :

Chương trình minh hoạ:

Trang 47
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

C. CÂU HỎI VÀ BÀI TẬP TỰ GIẢI

I. CÂU HỎI TRẮC NGHIỆM


Câu 1: Cho S và i là biến nguyên. Khi chạy đoạn chương trình :
s:=0;
for i:=1 to 10 do s := s+i;
writeln(s);
Kết quả in lên màn hình là :
a) s = 11
b) s = 55
c) s = 100
d) s = 101
Câu 2: Cho S, i và N>0 là các biến nguyên. Ðể tính S = N!, chọn câu nào :
a) S := 1; For i := 1 to N do S := S * i;
b) S := 0; For i := 1 to N do S := S * i;
c) S := 1; For i := 1 to N do S := S * N;
d) S := 1; For i:= 1 to N do S := S + i;
Câu 3: Cho S = 12 + 22 + ... + 1002 . Nhóm lệnh nào tính sai Giá trị của S:
a) S:=0; FOR i:=1 TO 100 DO S := S + i*i;
b) S:=0; FOR i:=1 TO 100 DO S := S + SQR(i);
c) S:=0; FOR i:=100 DOWNTO 1 DO S := S + i*i;
d) S:=1; FOR i:=1 TO 100 DO S := S + i*i;

Câu 4-Khi chạy chương trình :


Var S, i, j : Integer;
Begin
S := 0;
for i:= 1 to 3 do
for j:= 1 to 4 do S := S + 1 ;
End.
Giá trị sau cùng của S là :
a) 0
b) 12

Trang 48
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

c) 3
d) 4
Câu 5: Cho S và i biến kiểu nguyên. Khi chạy đoạn chương trình :
S:= 0; i:= 1;
while i<= 6 do
begin
S:= S + i;
i:= i + 2;
end;
Giá trị sau cùng của S là :
a) 6
b) 9
c) 11
d) 0
Câu 6: Khi chạy chương trình :
Var S, i : Integer;
Begin
S:= 0; i:= 1;
Repeat
S:= S + i * i;
i:= i + 1;
Until i > 4 ;
End.
Giá trị sau cùng của S là :
a) 0
b) 14
c) 16
d) 30
Câu 7: Cho i là biến nguyên. Khi chạy đoạn chương trình :
i := 5;
Repeat
i := i + 1;
Until i > 4 ;
Giá trị sau cùng của i là :

Trang 49
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

a) 6
b) 4
c) 5
d) 0
Câu 8: Cho m, n, i là các biến nguyên. Khi chạy đoạn chương trình :
m:=4; n:=5; i:=5;
Repeat
i:=i+1;
Until (i Mod m = 0) and (i Mod n = 0);
Giátrị sau cùng của i là :
a) 20
b) 5
c) 4
d) 0
Câu 9: Cho chương trình :
Var A : Real;
Begin
...
While A = 0 do
begin
write ('nhap A # 0:');
Readln (A);
end;
End.
Ðể lệnh Readln(A) được thực hiện ít nhất một lần, phải điền vào chỗ . . . lệnh
nào trong các lệnh dưới đây ? :
a) A:=0;
b) A:=1;
c) A:=-1;
d) A <> 0;
Câu 10: Giảsử các khai báo biến đều hợp lệ. Ðể tính S = 10!, chọn câu nào :
a) S := 1; i := 1; b) S := 1; i := 1;
while i<= 10 do S := S * i; while i<= 10 do i := i + 1;
i := i + 1; S := S * i;

Trang 50
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

c) S := 0; i := 1; d) S := 1; i := 1;

while i<= 10 do while i<= 10 do

begin begin

S := S * i; S := S * i;

i := i + 1; i := i + 1;

end; end;

Trang 51
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

II.BÀI TẬP TỰ GIẢI


Bài tập 1
Viết chương trình xếp các dấu * thành một hình thoi n dòng, n nhập từ bàn
phím
Bài tập 2
In bảng mã ASCII thành hai cột : Mã Ký tự , yêu cầu hiển thị từng trang
một, (mỗi trang 22 dòng) rồi dừng lại chờ ta gõ Enter mới hiện trang kế tiếp, cứ
thế cho đến hết.
Bµi tËp 3:
ViÕt ch¬ng tr×nh nhập một số nguyên dương N. Tính :

Bài tập 4:
Viết chương trình nhập số n nguyên đảm bảo sao cho n dương. ( Nếu nhập
n <0 thì chương trình phải bắt nhập laị ), rồi tính :
S1 = 12 + 32 + 52 + 72 + ...+ (2n+1)2
(−1)
n −1
1 1 1
S = − + −... +
2 2 2 2 2
2 4 6 2n
Bµi tËp 5:
ViÕt ch¬ng tr×nh nhập một số nguyên dương n . Tính :

S4 = 1.2.3 + 2.3.4 + 3.4.5 +....+ n(n+1)(n+2)


Bµi tËp 6:
ViÕt ch¬ng tr×nh nhập một số nguyên dương n . Tính :

Bµi tËp 7:
ViÕt ch¬ng tr×nh nhập số x thực và số n nguyên lớn hơn 1, tính gần

đúng ex theo công thức :


Bµi tËp 8:
ViÕt ch¬ng tr×nh nhập n, k nguyên đảm bảo phải dương và k<= n. Tính
tổ hợp chập k của n theo công thức :

Trang 52
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bµi tËp 9:
Cho dãy Fibonaci xác đinh như sau:
F0=0, F1=1, Fn = Fn-1 + Fn-2 , với n >= 2

ViÕt ch¬ng tr×nh nhập số nguyên N>0 và tính S= F0 + F1 + F2 +...+ Fn .

Bµi tËp 10:


ViÕt ch¬ng tr×nh tìm và in lên màn hình tất cả các số nguyên trong
phạm vi từ 10 đến 99 sao cho tích của hai chữ số của nó thì bằng hai lần tổng
của hai chữ số của nó. Ví dụ : số N=36 có hai chữ số là 3 và 6, và 3*6 = 2*(3+6).
Tương tự đối với số 44 .
Bµi tËp 11:
ViÕt ch¬ng tr×nh nhập N nguyên đảm bảo lớn hơn 1. Tính tổng các số
lẻ <= N. Ví dụ : nếu N=5 thì tổng S=1+3+5 = 9, nếu N=8 thì S=1+3+5+7=16.
Bµi tËp 12:
ViÕt ch¬ng tr×nh nhập số thực A đảm bảo 0<A< 2, tìm số n nhỏ nhất
thỏa mãn :

Bµi tËp 13:


ViÕt ch¬ng tr×nh nhập vào tuổi cha và tuổi con hiện nay đảm bảo sao
cho tuổi cha lớn hơn hai lần tuổi con. Hỏi sau bao nhiêu năm nữa thì tuổi cha
bằng hai lần tuổi con. Ví dụ tuổi cha là 30, tuổi con là 5, sau 20 năm tuổi cha là 50
sẽ gấp đôi tuổi con 25.
Bµi tËp 14:
ViÕt ch¬ng tr×nh tìm bội số chung nhỏ nhất của hai số nguyên dương
m, n nhập từ bàn phím. Suy ra ước số chung lớn nhất của chúng.
( Hd : BSCNN * USCLN = m* n ).
Bµi tËp 15:
ViÕt ch¬ng tr×nh nhập m, n nguyên ( 0 < m, n < 20 ) . In lên màn hình
tam giác cân có chiều cao m, và hình chữ nhật có chiều dài n, chiều rộng là m :

Bµi tËp 16:


Năm âm lịch tính theo Can và Chi. Có 10 Can là: Giáp, Ất, Bính, Ðinh,

Trang 53
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Mậu, Kỷ, Canh, Tân, Nhâm, Qúy, và có 12 Chi là: Tý, Sửu, Dần, Mão, Thìn, Tỵ,
Ngọ, Mùi, Thân, Dậu, Tuất , Hợi. Hãy viÕt ch¬ng tr×nh nhập vào một năm
dương lịch cho biết năm âm lịch tương ứng, biết rằng năm 1999 là năm Kỷ Mão.

CHƯƠNG TRÌNH CON

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC


 Phân tích được cấu trúc của chương trình con
 So sánh được giữa thủ tục và hàm
 Biết cách phân tích bài toán lớn thành các bài toán nhỏ để xử lý
 Phân biệt được các loại biến và tham số
 Phân tích được lời gọi chương trình con
 Viết được các thủ tục và hàm theo yêu cầu

A/ NHẮC LẠI LÝ THUYẾT


1. Cấu trúc.
Cấu trúc chung của Procedure và Function như sau:
Procedure Tên_Thủ_Tục( Khai báo các tham số hình thức);
(*Khai báo: Label, Const, Type, Var và thậm chí cả Procedure và Function*)

Begin
… (* Thân chương trình con *)
End;

Function Tên_Hàm( Khai báo các tham số hình thức): kiểu_dữ_liệu_của_hàm;
(*Khai báo: Label, Const, Type, Var và thậm chí cả Procedure và Function*)

Begin
… (* Thân chương trình con *)
End;
Chú ý: Thân của chương trình con được đặt giữa Begin và End với End kết thúc
bằng dấu (;) chứ không phải là dấu chấm (.) như của chương trình chính.
Câu hỏi đặt ra là khi nào chương trình con là Procedure hay Function?
2. Khai báo.
Theo qui định của Pascal chuẩn, cấu trúc của một chương trình thì các
chương trình con được khai báo như sau:
Trang 54
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

PROGRAM Tên_Chương_Trình;
LABEL (* Khai báo nhãn *);

CONST (* Khai báo hằng *);

TYPE (* Mô tả và định nghĩa các kiểu cấu trúc dữ liệu mới của người sử dụng *);

VAR (* Khai báo các biến *);

(*-------------------------------------Các chương trình con--------------------------------------*)
PROCEDURE Tên_Thủ_Tục( Khai báo các tham số nếu cần);
(*Khai báo: Label, Const, Type, Var và thậm chí cả Procedure và Function*)

Begin
… (* Thân chương trình con *)
End;

(*------------------------------------------------------------------------------------------------------*)
FUNCTION Tên_Hàm( Khai báo các tham số nếu cần): kiểu_dữ_liệu_của_hàm;
(*Khai báo: Label, Const, Type, Var và thậm chí cả Procedure và Function*)

Begin
… (* Thân chương trình con *)
End;
(*------------------------------------Thân chương trình chính------------------------------------*)
BEGIN

END.
3) Các đặc trưng của hàm:
Các yếu tố đặc trưng cho một hàm gồm có:
- Tên hàm
- Kiểu dữ liệu của các tham số
- Kiểu dữ liệu của gía trị hàm
Ví dụ :

Trang 55
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Hàm Sqrt(x): cho căn hai của x. Tên hàm là Sqrt, tham số x là nguyên hay
thực còn gía trị hàm kiểu thực, ví dụ Sqrt(4)=2.0.
- Hàm Readkey : không có tham số, gía trị hàm kiểu ký tự, hàm nhận một ký tự
được gõ từ bàn phím.
Tóm lại, hàm có thể không có tham số hoặc có một đến nhiều tham số, nhưng
hàm luôn trả về một gía trị duy nhất.
Ví dụ:
For k:=1 to 10 do S := S+ Sqrt(k);
y:= 3* Sqr(2) - Sin(pi/4) ;
Write( Chr(65) );
Chú ý Trong hàm không có khai báo sử dụng thư viện chuẩn (Uses).
4) Kiểu dữ liệu của tham số và gía trị hàm:
- Kiểu dữ liệu của kết qủa của hàm không thể là mảng (array), bản ghi (record),
tập hợp (set) hay tập tin (file).
Khai báo hàm như dưới đây là sai:
Function F( x: Integer) : array[1..10] of Real;
- Kiểu dữ liệu của kết qủa của hàm có thể là các kiểu đơn giản, chuỗi, hay con
trỏ. Nếu là kiểu liệt kê, đoạn con hay chuỗi (trừ kiểu String) thì phải định nghĩa
trước thông qua từ khóa Type.
Ví dụ, các khai báo như sau là sai:
Function F( x: Real) : String[20];
Function F( x: Real) : 1..31;
Mà phải định nghĩa kiểu trước :
Type
Str20= String[20];
Ngay = 1..31;
rồi mới khai báo:
Function F( x: Real) : Str20;
Function F( x: Real) : Ngay;
Tuy nhiên, với kiểu String thì khai báo sau là đúng:
Function F( x: Real) : String;
- Kiểu dữ liệu của tham số trong hàm và thủ tục thì không hạn chế. Nhưng nếu
là kiểu chuỗi (trừ kiểu String) hay kiểu tự xây dựng thì phải được định nghĩa trước
bằng từ khóa Type.
Ví dụ, khai báo sau là sai:

Trang 56
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Function F( x : array[1..10] of Real) : Integer ;


Function F( St : String[20]) : Char ;
Mà phải định nghĩa kiểu trước :
Type
Kmang =Array[1..10] of Real;
Kstr20= String[20];
rồi mới khai báo:
Function F( x : Kmang) : Integer ;
Function F( St : Kstr20) : Char ;
Tuy nhiên, với kiểu String thì khai báo sau là đúng:
Function F( St : String) : Boolean ;
- Ví dụ minh hoạ:
Ví dụ 1: Nhập dãy các số thực x1, x2, ..., xn, tính tổng :

Phân tích: Giả sử đã có hàm Canba(z) tính căn bậc ba của z, tức là :

khi đó, tổng S được tính như sau:


S:=0;
For i:=1 to N do S:=S + Canba( x[i] );
Ở đây hàm Canba được tính N lần ứng với các tham số thực sự là các gía trị
x[i], i=1,..., N.
Vấn đề còn lại là phải viết hàm tính căn ba của z. Hàm này có tên là Canba,
tham số z kiểu thực, và gía trị hàm cũng kiểu thực, nó được xây dựng như sau:
FUNCTION Canba( z: Real) :Real;
{ Hàm tính căn bậc ba của z}
Var F: Real;
Begin
If z=0 then F:= 0;
If z>0 then F:= exp( 1/3*Ln(z) );
If z<0 then F:= - exp( 1/3*Ln(-z) );
Canba:=F ;
End;

Trang 57
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Một số chú ý khi viết hàm:


* Ta chọn chương trình con là hàm khi cần nhận lại một gía trị duy nhất
thông qua tên hàm, nhờ đó có thể dùng tên hàm trong các biểu thức. Ví dụ, vì
Gt(4) là một gía trị nên ta có thể viết :
k:= Gt(4) - 1 ;
Write( ‘ Giai thừa của 4 là ‘, Gt(4) );
Vì tên hàm chứa gía trị hàm nên trong thân của hàm phải có ít nhất một lệnh
gán :
TênHàm:= Biểuthức ;
* Về phong cách lập trình, trong hàm nên tránh dùng các lệnh nhập hay in dữ
liệu (Readln, Write). Các tham số hình thức chính là các dữ liệu phục vụ cho các
tính toán trong hàm, chúng sẽ có gía trị cụ thể khi gọi hàm. Việc nhập dữ liệu hay
in kết qủa thường để trong thân chương trình chính.

5. Các bước cần làm khi viết một CTC:


Để giúp người mới lập trình có một số quyết định khi lập chương
trình con, chúng ta có thể tiến hành theo hai bước sau:
Bước 1: Đặt câu hỏi: Lựa chọn CTC là Procedure hay Function?
- Chương trình con là Function khi và chỉ khi thoả mãn đồng thời các
yêu cầu sau:
+ Nếu ta muốn nhận là một kết quả (và chỉ một mà thôi)
+ Kết quả đó phải là kiểu vô hướng hoặc kiểu con trỏ
+ Có cần dùng tên CTC (chứa kết quả) để viết trong các biẻu thức
không?
Còn nếu không thoả mãn các tính chất trên thì CTC là Procedure
Bước 2: Vấn đề tham số của CTC:
CTC có cần tham số không? Nếu đối tượng của CTC là các biến toàn
cục thì các biến này không cần đưa vào làm tham số. Còn nếu CTC phải
thực hiện với nhiều đối tượng theo cùng một qui cách thì phải khai báo
tham số (hình thức)
- Nếu có tham số thì Tham số biến (tham biến) hay Tham số giá trị
(tham trị)?
+ Các tham số đóng vai trò cung cấp “tư liệu đầu vào” sẽ là các
tham trị
+ Các kết quả thu lại được thì chắc chắn đó là tham biến

Trang 58
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

- Ví dụ minh hoạ:
Viết CTC tính bình phương của một số
Nếu dùng Function, ta có:
Function Binh_phuong (X:real):Real;
Begin
Binh_phuong:=X*X;
End;
Nếu dùng Procedure, ta có:
Procedure Binh_phuong (X:real; Var Kq:Real);
Begin
Kq:=X*X;
End;
Trong cả 2 trường hợp, ta đều có tham số X là tham trị (cung cấp dữ
liệu đầu vào). Nếu dùng Function thì bản thân tên của hàm đã được dùng
làm biến chứa kết quả tính toán. Còn nếu dùng Procedure thì ta phải dùng 2
tham số, trong đó Kq là tham biến (kết quả thu được) dùng để chứa kết quả.
Sau đây, sử dụng để tính tổng bình phương 2 số: c = a2 + b2 trong hai
trường hợp:
Nếu dùng Function:
C:= Binh_phuong(a) + Binh_phuong(b);
Nếu dùng Procedure với biến trung gian Z :
Binh_phuong(a,z); c:=z; {c = a2 }
Binh_phuong(b,z); c:=c+ z; {c = a2 + b2}
Rõ ràng cách dùng Function có lợi hơn trong trường hợp này vì nó có
thể dùng trực tiếp trong biểu thức tính toán.
6. TẦM TÁC ĐỘNG VÀ TRUYỀN THAM SỐ
- Biến toàn cục và biến địa phương :
+ Các biến được khai báo trong chương trình chính gọi là biến toàn cục
(global Variable), chúng dùng được ở mọi nơi kể từ lúc khai báo cho đến khi kết
thúc chương trình.
+ Các biến được khai báo trong một chương trình con gọi là biến địa phương
(local Variable). Các tham số trị hình thức của chương trình con cũng là biến địa
phương. Các biến địa phương chỉ tồn tại trong thời gian chương trình con đang
thực hiện, khi chương trình con thực hiên xong thì các biến địa phương sẽ bị xóa
khỏi bộ nhớ.
* Phạm vi tác dụng của các khai báo :

Trang 59
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Hình 6.1
Ví dụ 7:
Nhập hai ma trận A, B cấp MxN, tính ma trận hiệu C=A-B, in ba ma trận lên
màn hình. Cho biết ma trận nào gồm toàn số 0.
Phân tích: Có bốn việc chính phải làm:
Nhập hai ma trận A và B. Về bản chất, đây chỉ là một loại công việc nên
có thể viết thành một thủ tục để gọi hai lần.
Tính ma trận C=A-B. Ðây là một việc nhưng chuyên biệt có thể viết thành
một thủ tục để chương trình sáng sủa.
In ba ma trận A, B và C. Về bản chất đây chỉ là một loại công việc nên
có thể viết thành một thủ tục và gọi ba lần.
Kiểm tra xem ma trận nào toàn số 0 ? : Câu trả lời là một gía trị lôgic
đúng hay sai (True hay False), vậy phải viết dạng hàm và gọi ba lần
ứng với các đối số là A, B và C.
Rõ ràng nếu không sử dụng thủ tục và hàm thì chương trình trên sẽ viết rất dài
dòng.
- Tham số và truyền tham số
Trong khai báo ở đầu của chương trình con, các tham số hình thức có từ
khóa Var đứng trước gọi là tham số biến, ngược lại, nếu không có từ khóa Var đi
trước thì gọi là tham số trị.
Ví dụ, trong khai báo hàm tính lũy thừa zk, ta viết :
Function Lt(z : Real ; k: Byte) : Real;
thì z và k đều là các tham số trị hình thức .
Còn theo khai báo của thủ tục Doicho :
Procedure Doicho(Var u, v : Real) ;

Trang 60
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

thì u và v đều là các tham số biến hình thức.

1. Tham số trị và truyền tham số


Trong lời gọi chương trình con các tham số trị thực sự có thể là biến, hằng hay
biểu thức.
Các biến được truyền vào chương trình con dưới dạng tham số trị thì không bị
thay đổi. Nói cách khác, mọi sự thay đổi của tham số trị hình thức trong chương
trình con không làm thay đổi gía trị của tham số thực sự tương ứng được truyền
vào từ chương trình chính.
2. Tham số biến và truyền tham số
Trong lời gọi chương trình con các tham số biến thực sự chỉ có thể là biến,
không thể là hằng hay biểu thức.
Ví dụ, các lệnh sau đây là sai :
Doicho(3, 4); { Sai vì 3 và 4 là các hằng}
Doicho(a+1, b); { Sai vì a+1 là một biểu thức}
Vậy, các biến được truyền vào chương trình con dưới dạng tham số biến thì sẽ
thay đổi theo tham số biến hình thức tương ứng trong chương trình con.
Thông thường, ta dùng tham số biến khi muốn nhận lại một gía trị mới sau khi
thực hiện chương trình con.
Thực chất của sự truyền tham số đối với các tham số biến là sự truyền địa chỉ.
Chương trình con sẽ dùng các ô nhớ của chính các biến được truyền vào dưới
dạng tham số biến.

Trang 61
PROGRAM
Bài tập Pascal phần cơVIDU1;
sở Biên soạn: Bộ môn CNPM – UTEHY
Uses crt;
Var A,B,C,D:Integer; Z: real;
B/ BÀI TẬP MẪU
------------------------------------------------
Procedure Tieu_de;
Begin
Bài tập 1:
Writeln('********************************');
Viết
Writeln(' trình đọc
chương MINH HOA từng cặp số nguyên
CHUONG TRINH A,B
CON và C,D
'); sau đó tính tỉ số của
từng cặpWriteln('********************************');
và thông báo kết quả ra màn hình.
End;
Hướng dẫn:
------------------------------------------------
Chương trình
Procedure trên được chia
Nhap_Dl(Var thành các công việc nhỏ:
X,Y:integer);
Var OK:char;
+ In ra một số dòng tiêu đề giúp cho người dùng dễ sử dụng
Begin
Repeat
+ Nhập dữ liệu cho từng cặp số nguyên
Write('Tu so = '); readln(X);
+ Tính tỉ số của từng cặp số
Write('Mau so = '); readln(Y);
Chương trìnhWrite('Co sua so lieu khong (Co/khong) ?');
minh hoạ:
OK:=Readkey;
Writeln;
Until (OK='K') or (OK ='k');
End;
0100090000037800000002001c00000000000400000003010800050000000b020
------------------------------------------------
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
Function Chia(X,Y:integer):Real;
Begin
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
If Y<>0 then Chia:= X/Y
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
Else
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
Begin
000000000000000000000000000000000040000002d0101000500000009020000
Writeln(#7,'Khong chia duoc vi mau so = 0 ');
Halt; Thu tuc Halt dung chuong trinh lai
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
End;
010000030000000000
End;
------------------------------------------------
Bài số 2:
Viết chương trình in ra màn hình dãy các ký tự trên nhiều dòng với các màu
chữ khác nhau
Hướng dẫn:
- Các hình thức in và trình bày từng ký tự là giống nhau
- Thao tác in được sử dụng nhiều lần cho từng loại ký tự
Vì thế, ta viết một thủ tục tự tạo bao gồm các câu lệnh thực hiện các công
việc giống nhau, phần khác nhau sẽ được truyền thông qua tham số hình thức
của thủ tục
Chương trình minh hoạ:

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100

Trang 62
Program
Bài tậpChu_vi_Dien_tich;
Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY
PROGRAM
Var Pt_bac2;
d,r,p,s:Integer; tiep:Char;
Uses crt;
(*------------------*)
Var a,b,c,delta,x1,x2:real;
PROCEDURE Chuvi(x,y:Integer);
Procedure
Begin Nhap_he_so;
Begin p:=(x+y)*2;
Write('nhap
End; he so a,b,c:');
Repeat
(*------------------*)
readln(a,b,c);
PROCEDURE Dientich(x,y:Integer);
Bài
Begin tập 3then write(' Moi nhap lai: ');
if a=0
Until
s:=x (a<>0)
* y;chương trình tính diện tích và chu vi hình chữ nhật khi biết độ dài 2
Viết
End;
End;
cạnh
Procedure delta_duong;
(*------------------*)
Begin
BEGINHướng dẫn:
Writeln('Phuong
Repeat trinh co 2 nghiem phan biet ');
Bài toán trên
x1:=(-b+sqrt(delta))/(2*a); bao gồm 2 công việc chính: Tính diện tích và tính chu vi. Vì
Writeln('TINH CHU VI, DIEN TICH HINH CHU NHAT');
x2:=(-b-sqrt(delta))/(2*a);
thế ta chia nhỏ thành
Writeln(' Sucác chương
dung trình con tương ứng. Tham số hình thức của
thu tuc');
Writeln('x1
các chương = ',x1:6:2,
con này'x2 = ',x2:6:2);
Writeln('------------------------------------');
trình là các cạnh
End;Write('-Nhap chieu rong: ');
Chương trình
Procedure minh hoạ:
delta_khong;
Readln(r);
Begin Write('-Nhap chieu dai : ');
Writeln('Phuong
BàiReadln(d);
tập 4 trinh co nghiem kep: ');
writeln('x1
Chuvi(r,d); = ',-b/(2*a):6:2);
= x2
Viết chương trình giải và biện luận phương trình bậc hai ax2 + bx + c = 0
End;Dientich(r,d);
Procedure
Writeln;
(trong delta_am;
đó a<>0) (a,b,c được nhập từ bàn phím)
Begin Writeln('+Chu vi hinh chu nhat= ',p);
writeln('phuong
Writeln('+Dientrinh tich vo
hinhnghiem');
chu nhat= ',s);
End; Writeln;
Hướng dẫn:
BEGIN Write(' Co thuc hien tiep khong ? (c/k) ');
clrscr; Nghiệm của phương trình bậc hai tìm được sẽ phụ thuộc vào dấu của biệt
Readln(tiep);
Nhap_he_so;
số delta.
Until Do đó,
(tiep='k') Orta(tiep='K');
sẽ chia thành các chương trình con tương ứng với các trường
END.delta:=
hợp củab*b delta:- 4*a*c;
if delta>0 then delta_duong
else- ifThủ tục delta_duong:
delta<0 then delta_am biệt số delta>0 phương trình có 2 nghiệm phân biệt
- Thủelse delta_khong;
tục delta_khong: delta = 0, phương trình có nghiệm kép
Readln;
END. - Thủ cụ delta_am: delta<0, phương trình vô nghiệm
Chương trình minh hoạ:

Trang 63
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

C/ BÀI TẬP TỰ GIẢI

Bµi tËp 1.
LËp ch¬ng tr×nh tÝnh min/max cña hµm sè trªn ®o¹n [a, b] b»ng
c¸ch dïng thñ tôc vµ hµm. C¸c gi¸ trÞ a vµ b ®a tõ bµn phÝm, t×m
min/max tuú chän.

Bµi tËp 2. LËp thñ tôc ®æi c¸c to¹ ®é t¬ng øng cña hai vÐc t¬ a vµ b.

Bµi tËp 3.
Cho hai ®iÓm A(x1,y1) vµ B(x2,y2). LËp hµm tÝnh ®é dµi ®o¹n
AB, dïng hµm nµy ®Ó tÝnh diÖn tÝch tam gi¸c khi biÕt to¹ ®é.

Bµi tËp 4. Sö dông CTC ®Ó viÕt ch¬ng tr×nh gi¶i ph¬ng tr×nh bËc hai
Bµi tËp 5.
LËp thñ tôc kiÓm tra xem 3 ®iÓm A(xa, ya), B(xb,yb), C(xc,yc) cã
th¼ng hµng kh«ng. LËp ch¬ng tr×nh dïng thñ tôc trªn nhËp to¹ ®é n
®iÓm trªn mÆt ph¼ng (n<=L(X), L(X) lµ bËc cña kh«ng gian X) råi
kiÓm tra xem cã ba ®iÓm nµo th¼ng hµng. §a c¸c ®iÓm nµy ra mµn
h×nh.
Bài tập 6.
Viết chương trình tính tổng:
S= 1! + 2! + 3! + ... +n! (với n<=13)
Trong đó n nhập từ bàn phím
Hướng dẫn:
Viết hàm Giaithua(k) để tính từng số hạng
Bài tập 7.
Viết chương trình vẽ một đường thẳng đứng (bằng ký tự *) có chiều dài 5
tại cột 4 và cho di chuyển đến cột 20
Hướng dẫn:
- Viết thủ tục Insao(x,y) để in ra màn hình dấu “*’ ở tạo độ x,y
- Dùng hàm gotoxy(x,y): di chuyển con trỏ màn hình đến cột x, hàng y

Trang 64
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

KIỂU DỮ LIỆU MẢNG

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC

 BiÕt ®îc c¸ch thøc tæ chøc d÷ liÖu kiÓu m¶ng


 Khai b¸o thµnh th¹o kiÓu d÷ liÖu m¶ng
 Ph©n tÝch ®îc c¸ch thøc truy nhËp ®Õn c¸c thµnh phÇn cña
m¶ng
 Sö dông ®îc kiÓu d÷ liÖu m¶ng ®Ó gi¶i quyÕt c¸c xö lý th-
¬ng gÆp: nhËp m¶ng, in m¶ng; t×m kiÕm, ®æi chç, s¾p
xÕp c¸c phÇn tö; thªm, bít phÇn tö; tÝnh to¸n trªn c¸c phÇn

A/ NHẮC LẠI LÝ THUYẾT


1. Mảng một chiều.
* Khai báo mảng một chiều :
Mảng một chiều, còn gọi là dãy, hay đơn giản là mảng, có thể khai báo theo một
trong hai cách (đây là cách khai báo đơn giản):
- Cách 1: Khai báo trực tiếp theo cách sau :
VAR
Tênmảng : Array[m1 . . m2] of Tênkiểudữliệu ;
Ở đây m1, m2 là hai hằng xác định phạm vi của chỉ số, chúng có chung một
kiểu dữ liệu.
+ Ví dụ minh hoạ:
Cho khai báo dưới đây:
Var A : Array[0..10] of Real;
Hten: Array[1..5] of String[18];
B: Array[‘a’..’d’] of Integer;
Theo khai báo trên, ta có ba mảng:
Mảng thứ nhất tên là A, gồm 11 phần tử cùng kiểu Real, ứng với các chỉ
số 0, 1, 2, ..., 10, đó là:
A[0], A[1], A[2], ..., A[10]
Mảng thứ hai tên là HTen gồm 5 phần tử cùng kiểu dữ liệu là String[18]
ứng với các chỉ số từ 1 đến 5:
Hten[1], Hten[2], Hten[3], Hten[4], Hten[5]

Trang 65
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Mảng thứ ba tên là B, gồm 4 phần tử cùng kiểu Integer ứng với các chỉ số
‘a’, ‘b’, ‘c’, ‘d’:
B[‘a’], B[‘b’], B[‘c’], B[‘d’]
- Cách 2 : Khai báo qua một kiểu dữ liệu mới, gồm hai bước:
Bước 1: Ðịnh nghĩa kiểu dữ liệu mảng :
TYPE
Tênkiểumảng = Array[m1 . . m2] of Tênkiểudữliệu;
Bước 2: Khai báo biến có kiểu dữ liệu là kiểu mảng:
VAR
Tênmảng : Tênkiểumảng ;
Ví dụ, đối với các mảng A, B và Hten ở trên ta có thể khai báo theo cách 2, như
sau:
Type
Mang1 = array[0..10] of Real;
Mang2 = array[1..5] of String[18];
Mang3 = array[‘a’..’d’] of Integer;
Var
A : Mang1;
Hten: Mang2;
B: Mang3;
+Khai báo mảng có gán trị ban đầu:
Pascal cho phép vừa khai báo mảng vừa gán gía trị ban đầu cho các phần tử
mảng, chẳng hạn như dưới đây:
Const
X : array[1..5] of Integer = (12, 14, 16, 18, 20) ;
Khi đó X là một mảng gồm 5 phần tử cùng kiểu nguyên và có giá trị X[1]=12,
X[2]=14, X[3]=16, X?4]=18, X[5]=20.
Mặc dù từ khóa ở đây là Const song X lại được dùng như là một biến mảng,
tức là các phần tử của X có thể thay đổi gía trị được. Ví dụ, trong chương trình ta
có thể gán:
X[1]:= 2;
X[2]:=5+20;
* Truy xuất các phần tử mảng:
Các xử lý trên mảng được quy về xử lý từng phần tử mảng. Ðể xác định một
phần tử của mảng, ta dùng cách viết :

Trang 66
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Tênmảng [ chỉ số của phần tử ]


- Ví dụ minh hoạ : có thể gán :
A[0]:= 15.8;
A[1]:= 2*A[0];
Hten[3]:= ‘Nguyen Thi Loan’;
B[‘a’]:=100;
Chỉ số của một phần tử có thể là một biến, một hằng, hay một biểu thức. Ví dụ,
cho i là biến kiểu nguyên, khi đó ta có thể dùng các lệnh:
i:=6;
A[i]:=100.25;
Hai lệnh trên tương đương với một lệnh:
A[6]:=100.25;
Nếu biến i có giá trị là 6 thì lệnh :
A[ i div 2 +1] := 4.5; tương đương với lệnh:
A[4]:=4.5; vì biểu thức i div 2 +1 có gía trị là 4.
Khi nhập dữ liệu cho các phần tử của một mảng , ta có thể dùng câu lệnh
For, While hay Repeat.
Ví dụ, nhập dữ liệu cho các phần tử của mảng A:
For i:=0 to 10 do
begin
Write(‘Nhập phần tử thứ ‘ , i , ‘: ‘);
Readln(A[i]);
end;
hoặc (dùng While) :
i:=0;
While i<= 10 do
begin
Write(‘Nhap phần tử thứ ‘, i, ‘: ‘);
Readln(A[i]);
i:=i+1;
end;
Tương tự để nhập dữ liệu cho các phần tử của mảng B, ta viết:
For ch:=‘a’ to ‘d’ do
begin

Trang 67
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Write(‘Nhap phần tử thứ ‘, ch, ‘: ‘);


Readln(B[ch]);
end;
Ðể in các gía trị của mảng A lên màn hình, ta viết :
For i:=0 to 10 do Write(A[i]:6:2);
Các gía trị của mảng A sẽ được in liên tiếp nhau trên cùng một dòng. Còn nếu
muốn in mỗi phần tử trên một dòng, ta thay lệnh Write bằng Writeln.
Tương tự, mảng B được in lên màn hình bằng lệnh :
For ch:=‘a’ to ‘d’ do Write(B[ch]);
Một số lưu ý : Turbo Pascal cho phép gán một mảng này cho một mảng
khác.
Nếu X, Y là hai biến mảng cùng một kiểu mảng thì lệnh:
X := Y;
có nghĩa là lấy gía trị của từng phần tử của mảng Y gán cho phần tử tương ứng
trong mảng X. Ví dụ, cho khai báo:
Var
X, Y : Array[1..10] of Real;
Khi đó, lệnh: X := Y;
tương đương với lệnh :
For i:=1 to 10 do X[i] :=Y[i];
2. Mảng hai chiều.
- Khai báo mảng hai chiều:
Mảng hai chiều, còn gọi là ma trận, là sự mở rộng trực tiếp của mảng một
chiều. Ta cũng có hai cách khai báo.
 Cách 1: Khai báo trực tiếp theo cách sau :
VAR
Tênmảng : Array[n1..n2 , m1..m2] of Tênkiểudữliệu;
- Ví dụ minh hoạ:, cho khai báo :
Var
X : array[1..2, 1..3] of Real;
Y : array[‘a’..’c’ , 1..3] of String[15];
Kết quả ta nhận được hai mảng hai chiều:
Mảng X gồm 6 phần tử cùng kiểu dữ liệu thực:
X[1,1], X[1,2], X[1,3]
X[2,1], X[2,2], X[2,3]
Trang 68
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Mảng Y gồm 9 phần tử cùng kiểu chuỗi String[15] :


Y[‘a’,1], Y[‘a’,2], Y[‘a’, 3]
Y[‘b’,1], Y[‘b’,2], Y[‘b’, 3]
Y[‘c’,1], Y[‘c’,2], Y[‘c’, 3]
 Cách 2: Biến mảng được khai báo thông qua một kiểu mảng đã được
định nghĩa trước đó bằng từ khóa TYPE, tức là:
TYPE
Tênkiểumảng= Array[n1..n2 , m1..m2] of Tênkiểudliệu;
VAR
Tênmảng : Tênkiểumảng ;
- Ví dụ minh hoạ: Hai mảng X và Y nói trên có thể được khai báo theo hai
bước sau:
Type
Kmang1 = array[1..2, 1..3] of Real;
Kmang2 = array[‘a’..’c’ , 1..3] of String[15];
Var
X : Kmang1; Y : Kmang2;
Chú ý: - Có thể xem mảng hai chiều là mảng một chiều mà mỗi phần tử
của nó lại là một mảng một chiều.
Hai mảng X, Y nói trên có thể khai báo như sau:
Type
Kmang1 = array[1..2] of array[1..3] of Real;
Kmang2 = array[‘a’..’c’] of array[1..3] of String[15];
Var
X : Kmang1;
Y : Kmang2;
Hiểu theo cách này thì X là một mảng gồm hai phần tử X[1] và X[2] mà mỗi
phần tử này lại là một mảng gồm 3 phần tử :
X[1] là mảng có 3 phần tử kiểu thực X[1][1], X[1][2], X[1][3]
X[2] là mảng có 3 phần tử kiểu thực X[2][1], X[2][2], X[2][3]
Ðiều tương tự cũng áp dụng cho biến mảng Y.
Hai cách viết X[i][j] và X[i,j] cùng chỉ một phần tử.
- Khai báo và gán giá trị ban đầu:
Có thể khai báo và gán giá trị ngay cho một mảng hai chiều, chẳng hạn:
Type
Trang 69
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Kmang1 = array[1..2, 1..3] of Real;


Const
X : Kmang1 = ( (1.5, 2.5, 3.5), (5.0, 6.5, 7.0) );
Khi đó X là một mảng hai chiều có 6 phần tử cùng kiểu thực và có giá trị là:
X[1,1]=1.5, X[1,2]=2.5, X[1,3]=3.5
X[2,1]=5.0, X[2,2]=6.5, X[2,3]=7.0
Cần nhấn mạnh rằng mặc dù từ khóa ở đây là Const song X và các phần tử
của X có thể dùng như các biến, tức là các phần tử của X có thể thay đổi giá trị
được.
- Các thao tác trên mảng 2 chiều :
Ðể xác định một phần tử trong mảng hai chiều, ta viết:
Tênbiếnmảng[chỉ số 1, chỉ số 2]
- Ví dụ minh hoạ:
X[1,1]:=12.5;
X[2,1]:=X[1,1]+15;
Y[‘a’,1]:=‘Tran Thi Mai’;
Ðể nhập dữ liệu cho một mảng hai chiều, ta phải dùng hai vòng lặp duyệt theo
hai chỉ số, chẳng hạn muốn nhập dữ liệu cho mảng X, ta viết:
For i:=1 to 2 do
For j:=1 to 3 do
begin
Write(‘nhập phần tử hàng ‘, i, ‘ cột ‘, j , ‘: ‘);
Readln(X[i, j]);
end;
Tương tự, lệnh nhập dữ liệu cho mảng Y được viết là:
For ch:=‘a’ to ‘c’ do
For j:=1 to 3 do
begin
Write(‘nhập phần tử hàng ‘, ch , ‘ cột ‘, j , ‘: ‘);
Readln(X[ch, j]);
end;
trong đó ch là biến kiểu ký tự, còn i và j là các biến nguyên.
Ðể in mảng X lên màn hình, trình bày giống như cách viết ma trận, mỗi hàng in
trên một dòng, ta dùng lệnh :
For i:=1 to 2 do
Trang 70
Type Kmang = Array[1..20] of Real;
Var
Var A:
A: Kmang;
Kmang;
Bài tậpi, Pascal
N, Dem phần: cơ
Integer;
sở Biên soạn: Bộ môn CNPM – UTEHY
Begin
Repeatbegin
Write(‘ For Nh?pj:=1s?toph?n
3 do t? N : ‘); j]:3:1);Readln(N);
write(X[i, { in hàng thứ i}
Until (N>0) and ( N<21);
Writeln; { xuống dòng, chuẩn bị in hàng tiếp theo }
` nh?p
nh?pm?ngm?ng
For i:=1 end;
to N do do
begin
Write(‘Nh?p A[‘ , i , ‘ ]: ‘); Readln( A[i] );
B. BÀI
end; TẬP MẪU
BàiIntập m?ng
1: A
Writeln(‘ M?ng A l? : ’);
Vi ết i:=1
For chươngto N trình
do nhập
do một mảng A có N phần tử, in mảng A lên màn hình, và
Write(A[i]:3:0);
Write(A[i]:3:0);
đếm xem mảng A có bao nhiêu số dương :
Writeln;
??m s?
Chương d??ng
trình minh hoạ:
Dem:=0;
Bài tập 2
For i:=1 to N do do IfIf A[i]>0
A[i]>0 then
then Dem:=Dem+1;
Dem:=Dem+1;
Writeln(‘ S? s? d??ng = ‘ , Dem ); của dãy A1, A2, ..., An.
Vi ết chương trình tìm số lớn nhất
HưReadln;
ớng d ẫn:
End.
Gọi Max là biến chứa số lớn nhất phải tìm, thế thì :
Bước 1: Gán Max:=A[1];
Bước 2: Nếu Max<A[2] thì gán Max:=A[2];
Bước 3: Nếu Max<A[3] thì gán Max:=A[3];
...
Bước n: Nếu Max<A[n] thì gán Max:=A[n];
Khởi đầu, Max được gán giá trị A[1]. Sang bước 2, Max được so sánh với A[2]
để chọn ra số lớn nhất giữa A[1], A[2] và lưu vào biến Max. Sang bước 3, Max
được tiếp tục so sánh với A[3] để tìm ra số lớn nhất giữa A[1], A[2], A[3], .v.v. Kết
qủa, sau bước n, biến Max sẽ chứa số lớn nhất của dãy A[1], A[2], ..., A[n].
Quá trình trên được mô tả bằng hai lệnh:
Max:=A[1];
For i:=2 to n do if Max<A[i] then Max:=A[i];
Bài tập 3:
Bài toán sắp xếp mảng tăng dần (hay giảm dần)
Hướng dẫn:
Cho dãy A[1], A[2],..., A[n], nói rằng A là một dãy tăng nếu A[1] A[2] ...
A[n], tương tự, A là dãy giảm nếu A[1] <A[2] < ... <A[n]. Dãy đồng nhất
A[1]=A[2]= ... =A[n] là trường hợp đặc biệt, vừa là dãy tăng, vừa là dãy giảm.
Ví dụ:
Dãy 1 3 3 5 5 6 6 6 là dãy tăng
Dãy 9 9 8 5 5 4 0 0 là dãy giảm
Trang 71
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Dãy 1 3 3 2 5 4 6 6 là dãy không tăng không giảm.


Bài toán đặt ra là: cho một dãy A[1], A[2], ..., A[n] bất kỳ, hãy thực hiện các
hoán đổi các gía trị của các phần tử trong mảng A để A lập thành một dãy tăng.
Ví dụ, cho dãy A có 5 phần tử A[1]=9, A[2]=7, A[3]=5, A[4]=8, và A[5]= 2, cần
thực hiện các hoán đổi như thế nào để có A[1]=2, A[2]=5, A[3]=7, A[4]=8 và
A[5]=9.
Có những phương pháp sắp xếp mảng khác nhau, ở đây chỉ xin giới thiệu một
phương pháp, tuy chưa phải là hay nhưng đơn giản và dễ hiểu cho những người
mới lập trình, đó là phương pháp lựa chọn trực tiếp (Straight selection sort).
Ý tưởng của phương pháp là như sau:
Bước 1: Tìm số nhỏ nhất trong các phần tử A[1], A[2],.., A[n] và để vào
vị trí đầu tiên A[1].
Bước 2: Tìm số nhỏ nhất trong các phần tử A[2], A[3],.., A[n] và để vào
vị trí thứ hai A[2].
.v.v.
Bước n-1: Tìm số nhỏ nhất trong hai phần tử A[n-1], A[n] và để vào vị trí
n-1. Sau bước này thì A[n] sẽ là gía trị lớn nhất.
Chẳng hạn, xét dãy A có 4 phần tử: {5,3,4,1}:
Bước 1: Nếu A[1]>A[2] thì đổi A[1] với A[2], được: {3,5,4,1}
Nếu A[1]>A[3] thì đổi A[1] với A[3]: không đổi
Nếu A[1]>A[4] thì đổi A[1] với A[4], được: {1,5,4,3}
Bước 2: Nếu A[2]>A[3] thì đổi A[2] với A[3], được: {1,4,5,3}
Nếu A[2]>A[4] thì đổi A[2] với A[4], được: {1,3,5,4}
Bước 3: Nếu A[3]>A[4] thì đổi A[3] với A[4], được: {1,3,4,5}
Sau ba bước, dãy A đã được sắp xếp xong.
Tóm lại, thuật toán sắp xếp dãy A tăng được viết như sau:
For i:=1 to N-1 do
For j:=i+1 to N do
if A[i]>A[j] then
begin { Ðổi chỗ A[i] và A[j] }
Z:=A[i];
A[i]:=A[j];
A[j]:=Z;
end;
Trong đó N là số phần tử của dãy A còn Z là một biến trung gian có cùng kiểu

Trang 72
PROGRAM Tong_mt; T?nh t?ng hai ma tr?n
Program Ma_tran1;
Uses Uses
CRT; crt;For i:=1 to m do
BàiVar
tập Pascal
A,phần For
B, Ccơ:sở j:=1 to n do
Array[1..10, 1..10] of Real; Biên soạn: Bộ môn CNPM – UTEHY
Type
i, j , N, M begin
Matran = :Array[1..30,1..30]
Integer; of real;
dữ liệu với các phần tửwrite('A[',i,',',j,']=
của mảng A. ');
Begin Var
readln(a[i,j]);
tập 4:A: matran;
BàiClrscr;
end;
Repeat i,j,m,n:integer;
Viết clrscr;
chương trình nhập vào ma trận A có n hàng, m cột các phần tử là số
BEGIN
Write(‘Nh?p
thực. Đưaclrscr; s?
A rah?ng
màn N,
Writeln('Ma
ma trận s? các
tran
hình, c?t
A nhuM
số :liệu
‘); được
sau: '); Readln(N,
nhập từ bànM);
phím
UntilWrite('So For
( N>0) and i:=1
( to
N<11) m do
and ( M>0) and (M<11);
Chương trình minh hang
hoạ: cua ma tran A, m= '); readln(m);
For i:=1 to Nbegin
Write('So do
cot cua ma tran A, n= '); readln(n);
For j:=1 to MFor
Writeln('Nhapdoj:=1 cactophan
n do tuWrite(A[i,j]:8:1);
cua A: ');
Writeln;
begin
end;
Write(‘Nh?p A[‘ , i, ‘,’ , j , ‘]: )
readln; Readln(A[i,j]);
end; END.

Bài tập 5:
Viết chương trình nhập vào hai ma trận A, B cấp NxM. Tính ma trận C là
tổng của hai ma trận A và B, in ma trận C lên màn hình.
Hướng dẫn:
Công thức tính các phần tử của ma trận C= A+B :
C[i,j ] = A[i, j] + B[i, j] với i=1,..., N, và j=1,..., M
Chương trình minh hoạ:

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
04ee8339e8011c000c020000040000002d01000004000000020101001c000000fb
02ceff0000000000009001000000000440001254696d6573204e657720526f6d61
6e0000000000000000000000000000000000040000002d0101000500000009020
00000020d000000320a2d0000000100040000000000f8061d0520001600040000
002d010000030000000000
Bài tập 6:
Tìm số lớn nhất (số nhỏ nhất) trong ma trận A:
Hướng dẫn:
Trang 73
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Giả sử A là ma trận N hàng, M cột, và Max là biến chứa số lớn nhất phải
tìm. Khởi đầu ta gán A[1,1] cho Max, sau đó duyệt tất cả các phần tử của ma
trận, nếu phần tử nào lớn hơn Max thì lưu nó vào Max, tức là:
Max:=A[1,1];
For i:=1 to N do
For j:=1 to M do
if Max< A[i, j] then Max:=A[i, j];
Writeln(‘ Số lớn nhất là ’, Max);

C. BÀI TẬP TỰ GIẢI


Bài tập 1:
Viết chương trình đếm số lần xuất hiện của gía trị x trong dãy A1, A2, ...,
An .
Ví dụ gía trị x=6 xuất hiện 3 lần trong dãy 6 7 1 2 6 0 6 1.
Hướng dẫn:
Ta dùng biến Dem kiểu nguyên để đếm số lần xuất hiện của x.
Dem:=0;
For i:=1 to N do If A[i]=x then Dem:=Dem+1;
Nhận xét: Ðẳng thức A[i]=x là điều kiện để biến Dem được tăng thêm 1, vậy
bài toán trên có thể mở rộng là: hãy đếm số phần tử của mảng A thỏa mãn một
điều kiện cho trước. Trong lệnh For ở trên, khi thay đẳng thức A[i]=x bằng A[i]
thỏa điều kiện , ta được thuật toán tổng quát hơn :
Dem:=0;
For i:=1 to N do If A[i] thỏa điều kiện then Dem:=Dem+1;
Bài tập 2:
Viết chương trình nhập số tự nhiên n và một dãy số thực x1, x2, ..., xn.

Tìm số lớn nhất và số nhỏ nhất của dãy

Ðếm trong dãy có bao nhiêu số dương, bao nhiêu số âm, bao nhiêu số 0 ? Loại
nào nhiều nhất ?
Bài tập 3:
Viết chương trình nhập một dãy số nguyên x1, x2, ..., xn. In riêng các số chẵn và
các số lẻ, mỗi loại trên một dòng.
Bài tập 4:
Viết chương trình nhập một số nguyên dương N, xây dựng dãy số nguyên x0,
Trang 74
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

x1, ..., xn trong đó xi là số Fibonaci thứ i: x0=1, x1=1, xi =xi-1 + xi-2 với mọi i > 2. In
dãy x lên màn hình.
Bài tập 5:
Viết chương trình nhập một dãy số x1, x2,..., xn. Tính :

Bài tập 6:
Viết chương trình nhập một dãy số bất kỳ x1, x2,..., xn.

In đảo ngược dãy đó, ví dụ cho dãy 1 5 3 8, in ra: 8 3 5 1.

Sắp xếp dãy tăng dần, in dãy.


Sắp xếp dãy giảm dần, in dãy.

Bài tập 7:
Viết chương trình nhập hai dãy số bất kỳ x1, x2,..., xn và y1, y2,..., yn. Xây dựng dãy
thứ ba z1, z2, .., zn là tổng của hai dãy trên (zi= xi + yi), in ba dãy lên màn hình, mỗi
dãy trên một dòng.
Bài tập 8:
Viết chương trình cho hai đa thức :
Pn(x) = anxn + an-1 xn-1 + ...+ a1 x + a0 (an  0 )

Qm(x) = bmxm + bm-1 xm-1 + ...+ b1 x + b0 (bm  0 )

Gọi R(x) = Pn(x) + Qm(x).

Nhập các số tự nhiên n và m, các hệ số ai và bj của hai đa thức Pn(x) và


Qm(x), in bậc và các hệ số của đa thức R(x).

Bài tập 9:
Viết chương trình nhập x thực, n nguyên dương và một mảng các hệ số a0,
a1, ..., an , rồi tính gía trị của đa thức :

P = anxn + an-1 xn-1 + ...+ a1 x + a0 . theo sơ đồ Hoocner :

P=(...( (anx + an-1) x+ an-2)x + ...+ a1 )x + a0 .

Ví dụ :
P = 2x4 + 3x3 - 4x2 +7x + 9
= (((2x + 3)x - 4 )x + 7)x + 9 .
Bài tập 10:
Trang 75
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Viết chương trình nhập một dãy số bất kỳ x1, x2,..., xn , cho biết dãy có đối
xứng không?, dãy có lập thành một cấp số cộng không?. Ví dụ dãy 1 3 5 4 5 3 1 là
đối xứng, dãy 1 3 5 7 là một cấp số cộng.
Bài tập 11:
Viết chương trình nhập một dãy số bất kỳ x1, x2,..., xn , cho biết dãy thuộc
loại nào: tăng, giảm hay không tăng, không giảm ?

Bài tập 12:


Viết chương trình nhập một dãy số nguyên dương x1, x2,..., xn .

Tách dãy x thành hai dãy: dãy A gồm các số chẵn, dãy B gồm các số lẻ,
sắp xếp dãy A tăng dần, dãy B giảm dần, in hai dãy A và B trên hai dòng
khác nhau.
Nối hai dãy A và B theo thứ tự đó thành một dãy duy nhất và gán trở lại vào dãy
x, in dãy x.
Ví dụ nhập dãy x={ 5, 7, 0, 2, 1, 6, 4, 9 } thì dãy A={ 0, 2, 4, 6}, dãy B={ 9, 7, 5,
1}, và x={ 0, 2, 4, 6, 9, 7, 5, 1}.
Bài tập 13:
Viết chương trình nhập hai số m, n và hai ma trận Am,n và Bm,n . In các ma
trận A, B, C=A+2B và D=A-B lên màn hình.
Bài tập 14:
Viết chương trình:

Nhập và in ma trận Am,n .


Tìm số nhỏ nhất và số lớn nhất trong ma trận .
Tính tổng của tất cả các phần tử trong ma trận.
Ðếm trong ma trận có bao nhiêu số dương, bao nhiêu số 0, bao nhiêu số âm.
Bài tập 15:
Viết chương trình:
Nhập và in ma trận Am,n

Tìm và in số lớn nhất trong từng hàng của ma trận.


Tìm và in số lớn nhất trong từng cột của ma trận.
Tìm và in số nhỏ nhất trên đường chéo chính của ma trận.
Bài tập 16:
Viết chương trình nhập và in ma trận vuông An,n .

A có phải là ma trận đối xứng không


A có phải là ma trận đơn vị không?
(A là đối xứng nếu Aij=Aji với mọi i,j =1,..., n. A là ma trận đơn vị nếu tất cả các
phần tử
trên đường chéo chính đều bằng 1 và các phần tử còn lại đều bằng 0).
Trang 76
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Trang 77
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

KIỂU DỮ LIỆU CHUỔI

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC


 BiÕt ®îc c¸ch thøc tæ chøc d÷ liÖu kiÓu chuçi
 Khai b¸o thµnh th¹o kiÓu d÷ liÖu chuçi
 Ph©n tÝch ®îc c¸c thñ tôc vµ hµm xö lý trªn kiÓu chuçi
 VËn dông thµnh th¹o kiÓu chuçi ®Ó viÕt ch¬ng tr×nh gi¶i
quyÕt c¸c thao t¸c trªn chuçi

A/ NHẮC LẠI LÝ THUYẾT


1. Chuỗi và khai báo biến chuỗi :
- Khái niệm:
Một dãy các ký tự đặt trong cặp nháy đơn gọi là một hằng chuỗi, hay đơn
giản là một chuỗi. Dưới đây là ba chuỗi :
‘Ngon ngu Pascal’
‘Tin hoc 1998’
‘12345678’
Chuỗi không có ký tự nào ‘‘ (chỉ gồm hai dấu nháy đơn liên tiếp) gọi là chuỗi
rỗng.
Số ký tự có trong chuỗi gọi là độ dài của chuỗi. Chuỗi ‘ABCD’ có độ dài 4,
chuỗi ‘Pascal’ có độ dài là 6. Chuỗi rỗng có độ dài bằng không.
- Cú pháp khai báo:
Biến nhận gía trị là các hằng chuỗi gọi là biến kiểu chuỗi. Cách khai báo
như sau:
Var
Tênbiếnchuỗi : String[N] ; hoặc:
Tênbiếnchuỗi : String ;
trong đó N là một hằng nguyên (0 <= N <= 255) ấn định số ký tự tối đa mà biến có
thể nhận và gọi là độ dài tối đa của biến chuỗi. Nếu không có chỉ thị [N] thì chuỗi
có độ dài tối đa là 255 ký tự.
- Ví dụ minh hoạ, cho khai báo :
Var
St : String[17];
Diachi : String;

Trang 78
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Khi đó St là biến chuỗi có độ dài tối đa là 17 ký tự, còn biến Diachi có độ dài
tối đa là 255 ký tự.
Cần phân biệt độ dài với độ dài tối đa của biến chuỗi: độ dài tối đa được xác
định ngay khi khai báo là khả năng có thể chứa của biến chuỗi, còn độ dài của
chuỗi là số ký tự đang thực có trong chuỗi.
Nếu gán:
St := ‘Nguyen Thi Mai’;
Diachi := ‘Quan 1, Thanh pho Ho Chi Minh’;
thì biến St có độ dài là 14 ký tự, mặc dù khả năng nó có thể chứa tới 17 ký tự.
Tương tự, biến Diachi có độ dài là 29 ký tự còn độ dài tối đa cho phép là 255.
Khi gán cho biến chuỗi một hằng chuỗi dài hơn độ dài tối đa của nó thì các ký
tự thừa sẽ bị bỏ qua.
Ví du, nếu gán:
St := ‘Quan 1, Thanh pho Ho Chi Minh’;
thì gía trị của biến St sẽ là St=‘Quan 1, Thanh pho’.
Turbo Pascal có sẵn hàm Length(chuỗi) cho ngay độ dài thực của chuỗi mà
không cần phải dùng đến byte 0. Ví dụ :
Length(St)=14.
Chú ý Cũng có thể khai báo chuỗi thông qua việc định nghĩa một kiểu dữ liệu
mới bằng từ khóa Type. Chẳng hạn có thể khai báo chuỗi St nói trên theo cách
sau:
Type
KStr17 = String[17];
Var
St : KStr17 ;
Khi một biến chuỗi được dùng làm đối số của hàm hay thủ tục thì nó cần phải
được khai báo theo cách này ( trừ các biến chuỗi có kiểu String ).
2. Truy nhập vào từng phần tử của chuỗi :
- Giống như mảng, mỗi phần tử của chuỗi được truy nhập thông qua tên chuỗi
và chỉ số của phần tử.
Gọi N =Length(St), khi đó ký tự thứ i (i=1, 2, ..., N) của St được ký hiệu là
St[i].
- Ví dụ, cho :
St :=‘ABC’;
thì N=3 và St[1]=‘A’, St[2]=‘B’, St[3]=‘C’.
Lệnh St[1]:=‘a’; sẽ biến đổi St thành St=‘aBC’.
Trang 79
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Như vậy mỗi ký tự St[i] được dùng như một biến kiểu ký tự, và chuỗi có thể
xem là một mảng các ký tự. Chẳng hạn để in chuỗi ta có thể in từng ký tự như
sau:
For i:=1 to Length(St) do write(St[i]);
Ðiều này cho thấy chuỗi là một kiểu dữ liệu có tính cấu trúc.
Nhưng mặt khác, mỗi chuỗi lại có thể xem là một gía trị duy nhất, vì có thể nhập
và in chuỗi trực tiếp bằng các lệnh:
Readln(St);
Write(St);
Ðặc điểm này cho thấy chuỗi còn là một kiểu dữ liệu có tính đơn giản.
3. Các thao tác trên chuỗi :
+ Phép cộng (nối) chuỗi:
Khi cộng hai chuỗi, ta được một chuỗi mới gồm các ký tự của hai chuỗi
ban đầu ghép lại.Ví dụ :
‘tin’ + ‘hoc’ =‘tinhoc’
‘1234’+ ‘5678’ = ‘12345678’
+ Phép so sánh chuỗi:
Khi so sánh hai chuỗi, ta so sánh từng cặp ký tự của hai chuỗi từ trái qua
phải. Nếu phát hiện ra một cặp ký tự khác nhau thì chuỗi nào chứa ký tự
nhỏ hơn sẽ nhỏ hơn. Ví dụ:
‘Hong’ > ‘Han’ vì ‘o’ > ‘a’
‘thanh’ > ‘thao’ vì ‘n’ > ‘o’
Nếu so sánh hết chiều dài của chuỗi ngắn hơn mà không có cặp nào khác
nhau thì chuỗi ngắn hơn sẽ nhỏ hơn, ví dụ:
‘an’ < ‘anh’
‘chu’ < ‘chung’
Hai chuỗi bằng nhau khi chúng cùng độ dài và các ký tự ở các vị trí tương
ứng thì bằng nhau.
4. Các hàm liên quan đến chuỗi :
+ Hàm Length(St) : cho độ dài của chuỗi St.
Ví dụ: Length(‘ABCD’)=4 vì chuỗi ‘ABCD’ có 4 ký tự.
Chuỗi rỗng có độ dài bằng 0.
+Hàm Pos(S, St):
Cho vị trí đầu tiên tìm thấy chuỗi S trong chuỗi St, nếu không tìm thấy thì
hàm cho kết qủa bằng 0.

Trang 80
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Ví dụ:
Pos(‘Ab’, ‘cdAb3Abm’) = 3,
Pos(‘Ab’, ‘1bA3b’) = 0.
+ Hàm Copy(St, k, m) : cho m ký tự của St tính từ vị trí k.
Ví dụ: Copy (‘ABCDEF’, 4, 2) =‘DE’.
Nếu k> Length(St) thì kết qủa sẽ là một chuỗi rỗng
Nếu m> số ký tự đứng sau kể từ vị trí k thì hàm Copy chỉ lấy các ký tự từ vị
trí k đến hết chiều dài của St, ví dụ :
Copy (‘ABCD’, 3, 10) = ‘CD’
+Hàm Concat( St1, St2, ..., Stn) :
Ghép nối các chuỗi St1, St2, ..., Stn theo thứ tự đó thành một chuỗi duy
nhất. Vậy :
Concat( St1, St2, ..., Stn) = St1+St2+...+Stn.
5. Các thủ tục liên quan đến chuỗi :
+ Thủ tục Delete(St, k, m) :
Xóa m ký tự trong biến chuỗi St bắt đầu từ vị trí thứ k. Ví dụ, sau khi thực
hiện các lệnh:
St:=‘ TurboPascal’;
Delete(St, 1, 5);
thì gía trị của St=‘Pascal’ vì 5 ký tự đầu đã bị xóa.
Nếu k > Length(St) thì không xóa gì cả.
Nếu m > số ký tự đứng sau kể từ vị trí k thì xóa hết từ vị trí k đến cuối
chuỗi.
Ví dụ, sau khi thực hiện ba lệnh :
St:=‘Turbo Pascal’;
Delete(St, 10, 20);
Write(St);
thì in ra chữ Turbo Pas vì St đã bị xóa đi 3 ký tự cuối nên chỉ còn
St=‘Turbo Pas’.
+ Thủ tục Insert(S, St, k) :
Chèn chuỗi S vào biến chuỗi St tại vị trí k. Ví dụ, cho :
St:=‘ABCD’;
Sau khi thực hiện lệnh:
Insert(‘**’, St, 3);
thì St bị biến đổi thành St=‘AB**CD’.

Trang 81
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Nếu k> Length(St) thì S được nối vào cuối của St. Ví dụ, sau khi thực hiện
hai lệnh :
St:=‘XYZ’;
Insert(‘ABC’, St, 6);
thì St=‘XYZABC’.
+ Thủ tục Str(x, St):
Biến đổi số nguyên hay thực x thành kiểu chuỗi và gán cho biến chuỗi St.
Ví dụ, sau khi thực hiện lệnh :
Str(4752, St);
thì kết qủa là St= ‘4752’.
Số x có thể được định dạng như khi in ra màn hình.
Lệnh Str(4752 : 6, St);
cho kết qủa St=‘ 4752’ (trước số 4752 có 2 ký tự trắng) .
Nếu x là biến thực và gía trị của x=34.95 thì lệnh : Str(x:7:3,St);
cho kết qủa St=‘ 34.950’ (trước số 34.950 có 1 ký tự trắng) .
+ Thủ tục Val(St, x, k ):
Biến đổi chuỗi số St thành số nguyên hay thực và gán cho biến nguyên
hay thực x. Số nguyên k dùng để phát hiện lỗi: nếu đổi được thì k=0,
ngược lại, gía trị của k là vị trí có lỗi trong chuỗi St.
Ví dụ, cho ba biến n, k, j kiểu nguyên và biến x kiểu thực, sau khi thực hiện
các lệnh :
St:=‘385’;
Val(St, n, j);
Val(‘12.59’, x, k);
thì n=385, j=0, x=12.59 và k=0.
Nếu gán St := ‘3a7’; và thực hiện lệnh:
Val(St, n, k);
thì gía trị của n không xác định còn k=2 là vị trí của chữ a trong chuỗi St,
tại đó không đổi ra số được.

B/ BÀI TẬP MẪU


Bài tập 1:
Vi ết chương trình đ ổi một chuỗi ra chữ hoa hay chữ thường.
Hướng dẫn:
Ðể đổi cả chuỗi St thành chữ hoa, ta đổi từng ký tự của chuỗi đó ra chữ
hoa, tức là :

Trang 82
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

For i:=1 to Length(St) do St[i]:=Upcase(St[i]);


Tương tự, để đổi cả chuỗi St thành chữ thường, ta cũng đổi từng ký tự
của chuỗi St ra chữ thường:
For i:=1 to Length(St) do
if ( St[i]>=‘A’) and (St[i]<=‘Z’) then St[i]:=Chr( Ord(St[i]) + 32) ;
Bài tập 2:
Chuẩn hóa một chuỗi ký tự .
Hướng dẫn:
Cho chuỗi St có nhiều ký tự trắng thừa ở đầu, ở cuối và giữa các từ, như
St=‘ nguyen van tuan ‘. Chuẩn hóa chuỗi St là xóa hết các ký tự trắng thừa
ở đầu và ở cuối, và giữa hai từ chỉ giữ lại đúng một ký tự trắng, như St
=‘nguyen van tuan’.
a) Xóa các ký tự trắng ở đầu chuỗi :
Ðể xóa một ký tự trắng ở đầu của chuỗi St, ta dùng lệnh:
If St[1]=#32 then Delete(St,1,1);
Muốn xóa hết các ký tự trắng ở đầu chuỗi ta dùng lệnh:
While St[1]=#32 do Delete(St,1,1);
Diễn giải: chừng nào ký tự đầu tiên của St vẫn còn là ký tự trắng thì cứ
xóa nó đi cho đến khi ký tự đầu tiên là khác trắng.
Sở dĩ phải dùng vòng lặp While là vì số ký tự trắng ở đầu chuỗi là không
biết trước.
b) Xóa các ký tự trắng ở cuối chuỗi :
Tương tự, muốn xóa tất cả các ký tự trắng ở cuối của chuỗi St, ta dùng
lệnh:
While St[ length(St) ]= #32 do Delete(St, length(St), 1);
Diễn giải: chừng nào ký tự cuối cùng của St còn là khoảng trắng thì cứ
xóa nó đi cho đến khi ký tự cuối cùng là khác trắng.
c) Xóa các ký tự trắng thừa ở giữa hai từ trong chuỗi :
Muốn xóa các ký tự trắng thừa để giữa hai từ chỉ còn đúng một ký tự
trắng ta làm như sau: tìm trong St chỗ nào có hai ký tự trắng thì xóa đi
một, và lặp lại thao tác trên cho đến khi trong St không còn chỗ nào có hai
ký tự trắng liên tiếp. Tức là :
k:=Pos(‘ ‘, St); { ‘ ‘ là 2 ký tự trắng }
While k > 0 do
begin
Delete(St, k, 1);
Trang 83
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

k:=Pos(‘ ‘, St);
end;
Bài tập 3:
Đếm trong chuỗi St có bao nhiêu chữ pascal.
Hướng dẫn:
Vì chữ pascal có 6 ký tự, nên ta so sánh từng cụm 6 ký tự của St với chuỗi
pascal, bắt đầu từ vị trí 1:
Dem:=0;
For i:=1 to Length(St) do
if Copy (St, i, 6) =‘pascal’ then Inc(Dem);
Writeln(‘ Số chữ pascal là ‘ , Dem);

Bài tập 4:
Tìm kiếm và thay thế.
Tìm trong chuỗi St xem có chứa chữ ‘basic’ không, nếu có thì thay bằng
chữ ‘pascal’, nếu không có thì in câu ‘không có’. Ví dụ St=‘ngon ngu basic duoc
dung pho bien’, sau khi thay thế ta được St = ‘ngon ngu pascal duoc dung pho
bien’.
Hướng dẫn:
Ta dùng hàm Pos để tìm xem trong St có chứa chữ ‘basic’ không. Thủ tục
Delete sẽ xóa chuỗi ‘basic’ khỏi St, và thủ tục Insert sẽ chèn chuỗi ‘pascal’ vào St
tại vị trí đang xét:
Bài tập 5
Viết chương trình in ra mã ASCII của các ký tự từ ‘a’..’z’
Hướng dẫn:
Dùng hàm Ord(ch): lấy mã của ký tự ch
Chương trình minh hoạ:

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
0100000300000000000100090000037800000002001c000000000004000000030

Trang 84
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

C. BÀI TẬP TỰ GIẢI


Bài tập 1:
Nhập chuỗi St, in St theo thứ tự đảo ngược. Ví dụ : St = ‘ABCD’, in ra
‘DCBA’
Bài tập 2:
Nhập chuỗi St, xây dựng chuỗi St1 gồm các ký tự của St nhưng đảo ngược
thứ tự. Ðổi chuỗi St thành chữ hoa và?đổi chuỗi St1 thành chữ thường. Ví dụ cho
St=‘AbcD12’, thì St1=‘21DcbA’, sau khi đổi ta được St= ‘ABCD12’ và
St1=‘21dcba’.
Bài tập 3:
Nhập chuỗi St, kiểm tra chuỗi có đối xứng không. Ví dụ: các chuỗi
‘BCD1DCB’ và ‘ABCCBA’ là đối xứng, còn ‘ABCDBA’ là không đối xứng.
Bài tập 4:
Nhập chuỗi St, đếm xem trong chuỗi có bao nhiêu chữ a không phân biệt
viết hoa hay viết thường, và cho biết vị trí của các chữ a đó. Ví dụ St=‘Anh van la
quan trong’ có 4 chữ a tại các vị trí 1, 6, 10, 14.
Bài tập 5:
Nhập chuỗi St, cho biết trong St có bao nhiêu ký số ‘0’, ‘1’, ‘2’, ..., ‘9’ mỗi
loại. Ví dụ St=‘13163’, in ra: có 2 ký số 1, có 2 ký số 3, có 1 ký số 6, các loại khác
không có.
Bài tập 6:
Nhập chuỗi St, xóa bỏ các ký tự trắng thừa ở đầu và cuối chuỗi, và sao cho
giữa hai từ chỉ có đúng một ký tự trắng, đổi chuỗi thành chữ thường, riêng các
chữ đầu từ thành chữ hoa.
Ví dụ : St =‘ Hom nAy tHUC taP ‘. In ra: ‘Hom Nay Thuc Tap’.
Bài tập 7:
Nhập một chuỗi St, đếm xem trong St :
có bao nhiêu chữ cái A,B,C,..,Z
Trang 85
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

có bao nhiêu chữ số 0,1, 2, 3,.., 9


có bao nhiêu ký tự trắng
có bao nhiêu các ký tự khác.
Trong bốn loại trên thì loại nào nhiều nhất ?
Bài tập 8:
Nhập hai chuỗi St và St1. Cho biết chuỗi St1 xuất hiện mấy lần trong St, và
tại các vị trí nào?. Ví dụ St=‘pas12pas34’, chuỗi St1 =‘pas’ xuất hiện 2 lần tại các vị
trí 1, 6.
Bài tập 9:
Nhập ba chuỗi St, St1, St2. tìm xem trong chuỗi St có chứa chuỗi St1
không?, nếu có thì thay thế St1 bằng St2.
Ví du: cho St=‘ABC1234E’, St1=‘1234’ và St2 =‘*’.
Sau khi thay thế ta được St=‘ABC*E’.

Bài tập 10:


Nhập một mảng gồm N tên các sinh viên. Hãy chuẩn hóa tất cả các tên
này, đổi ra chữ hoa hết, sắp xếp và in lên màn hình theo thứ tự a, b, c, ... . Ví dụ
nhập năm tên: lan, an, anh, thanh, bich, in ra : AN, ANH, BICH, LAN, THANH.
Bài tập 11:
Nhập một chuỗi St gồm nhiều từ. Giả thiết St có không qúa 20 từ, mỗi từ
dài không qúa 10 ký tự. Xây dựng một mảng A chứa các từ của St, với A[i] chứa
từ thứ i của St. Sắp xếp và in các từ của mảng A theo trật tự giảm của độ?dài của
từ.
Ví dụ cho St=‘ Thanh pho da Nang’ thì : A[1]=‘Thanh’, A[2]= ‘pho’, A[3]=‘Da’,
A[4]=‘Nang’. In ra: Thanh Nang pho Da.
Bài tập 12:
Nhập một số nguyên dương N, đổi ra số nhị phân (hệ đếm 2) tương ứng.
Ví dụ : N = 15, đổi ra 1111.
Bài tập 13:
Nhập một số nguyên dương N, đổi ra số thập lục phân (hệ đếm 16) tương
ứng : Ví dụ : N = 59, đổi ra 3B.

KIỂU DỮ LIỆU BẢN GHI

MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC


 BiÕt ®îc c¸ch thøc tæ chøc d÷ liÖu kiÓu m¶ng
 Khai b¸o thµnh th¹o kiÓu d÷ liÖu m¶ng
 Ph©n tÝch ®îc c¸ch thøc truy nhËp ®Õn c¸c thµnh phÇn cña

Trang 86
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

m¶ng
 Sö dông ®îc kiÓu d÷ liÖu m¶ng ®Ó gi¶i quyÕt c¸c xö lý th-
¬ng gÆp: nhËp m¶ng, in m¶ng; t×m kiÕm, ®æi chç, s¾p
xÕp c¸c phÇn tö; thªm, bít phÇn tö; tÝnh to¸n trªn c¸c phÇn

A/ NHẮC LẠI LÝ THUYẾT


1. C ú ph áp khai b áo:
Kiểu bản ghi được mô tả bằng cách dùng từ khóa RECORD kèm theo một
danh sách khai báo các tên trường và kiểu dữ liệu tương ứng, kết thúc bằng từ
khóa END; , tức là:
TYPE
Tênkiểu = RECORD
Têntrường1 : Kiểudliệu1;
Têntrường2 : Kiểudliệu2;
...
Têntrườngk : Kiểudliệuk;
End;
- Ví dụ minh hoạ:
Ví dụ 1: Ta định nghĩa một kiểu KSVIEN như sau:
TYPE
KSVIEN = RECORD
Hoten:String[20];
Maso : String[8];
Toan, Ly, DTB: Real;
End;
Theo mô tả trên, ta có một kiểu dữ liệu mới đặt tên là KSVIEN có cấu trúc bản
ghi gồm 5 trường (thuộc tính) là:

Trang 87
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Ví dụ 2:
Ta mô tả thời gian là kiểu KDATE có ba trường ngày , tháng, năm như sau:
TYPE
KDATE = RECORD
Ngay : 1..31;
Thang : 1..12;
Nam : Integer;
End;
2. Sử dụng bản ghi :
Kiểu bản ghi sau khi đã được định nghĩa có thể dùng khai báo cho các biến.
Ví dụ :

Var
X, Y, Z : KSVIEN;
Trong đó KSVIEN là bản ghi đã mô tả ở phần trên.
Theo khai báo này, X ,Y và Z là ba biến kiểu bản ghi KSVIEN, mỗi biến đều có
5 trường Hoten, Maso, Toan, Ly và DTB.
Ðể thâm nhập vào một trường của bản ghi ta viết tên biến kiểu bản ghi, sau đó
là dấu chấm ‘.’ và tên trường, tức là :
Tênbiến .Têntrường
Các lệnh dưới đây gán gía trị cho từng trường của biến X :
X.Hoten :=‘Nguyen Van An’;
X.Maso :=‘1973208’;
X.Toan :=8.0;
X.Ly :=7.0;
X.DTB :=(X.Toan+X.Ly)/2;
Ðể nhập dữ liệu cho trường Hoten của biến Y, ta viết:
Write(‘Nhap ho ten sinh vien Y : ‘);
Readln(Y.Hoten);
Ðối với các bản ghi lồng nhau, cách truy xuất đến từng trường cũng tương tự.
- V í d ụ minh ho ạ:
Ví dụ: Cho khai báo biến S kiểu KSACH:
Var S : KSACH ;
Ðể truy nhập đến các trường Ngay, Thang, Nam của Ngay_muon ta viết :
S.Ngay_muon.Têntrường
Chẳng hạn gán :
S.Ngay_muon.Ngay := 2;
S.Ngay_muon.Thang := 9;
S.Ngay_muon.Nam := 1999;
Hai biến bản ghi cùng kiểu có thể gán cho nhau. Lệnh :
Y:=X;
gán gía trị của từng trường của biến X cho trường tương ứng của biến Y. Vậy
lệnh trên tương đương với khối 5 lệnh sau :
begin
Y.Hoten :=X.Hoten;
Y.Maso :=X.Maso;
Y.Toan :=X.Toan;
Y.Ly :=X.Ly;
Y.DTB :=X.DTB;
end;
Các bản ghi có thể so sánh bằng nhau hoặc khác nhau:
- Câu lệnh WITH :
Trang 88
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Khi làm việc với nhiều trường của một biến bản ghi thì cách thâm nhập ở trên tỏ
ra rườm rà vì phải viết nhiều lần tên biến trước tên trường.
Ðể đơn giản cách viết, Pascal đưa ra câu lệnh :
WITH Tênbiến DO LệnhP;
Tên biến thuộc kiểu bản ghi.
Nếu LệnhP có truy xuất đến các trường của Tên biến thì không cần phải viết
Tên biến và dấu chấm trước các tên trường.
Ví dụ, thay vì viết:
X.Hoten:= ‘Nguyen Van An’;
ta có thể viết :
WITH X DO Hoten:= ‘Nguyen Van An’;
Ðể in các trường của biến X lên màn hình, ta viết:
WITH X DO
Begin
Writeln(‘ Họ và tên :’ , Hoten);
Writeln(‘ Mã số sinh viên :’ , Maso);
Writeln(‘ Ðiểm Toán :’ , Toan: 4:1);
Writeln(‘ Ðiểm Lý :’ , Ly: 4:1);
Writeln(‘ Ðiểm trung bình : ‘ , DTB :4:1);
End;
Tất cả các tên trường nằm trong khối begin và end được hiểu là các trường
của biến X (nếu không ghi rõ tên biến nào khác).
Các lệnh sau gán các gía trị cho các trường của biến S kiểu KSACH là một bản
ghi lồng nhau:
WITH S DO
begin
Ma_so_sach:=‘TH-435’;
Ten_doc_gia:=‘Nguyen van Mai’;
Nam_xban :=1999;
Gia_tien:= 15000;
WITH Ngay_muon DO
begin
Ngay:=2;
Thang:=9;
Nam:=1999;
end;
end;
- Mảng các bản ghi :
Trong thực tế, ta thường phải quản lý một danh sách sinh viên của một lớp, một
danh sách các quyển sách trong thư viện. Ví thế mảng các bản ghi được dùng rất
phổ biến.
Khi khai báo :
VAR DS : Array[1..50] of KSVIEN;
hoặc :
TYPE
KMang = Array[1..50] of KSVIEN;
VAR DS: KMang;
thì ta có một mảng DS gồm 50 phần tử DS[1],..., DS[50] cùng kiểu bản ghi
KSVIEN. Mỗi DS[i], i=1,..., 50 là một bản ghi có 5 trường Hoten, Maso, Toan, Ly,
DTB lưu trữ các thông tin về sinh viên thứ i trong danh sách.
Ðể nhập dữ liệu ( Hoten, Maso, Toan, Ly ) rồi tính Ðiểm trung bình cho 50 sinh
viên này, ta dùng vòng lặp For phối hợp với câu lệnh WITH :
Trang 89
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

For i:=1 to 50 do
WITH DS[i] DO
begin
Write(‘Nhap ho ten sinh vien thu ‘,i,’ : ‘); Readln(Hoten);
Write(‘Nhap ma so sinh vien thu ‘,i,’ : ‘); Readln(Maso);
Write(‘Nhap điểm Toan, Ly sinh vien thu ‘,i,’ : ‘);
Readln(Toan, Ly);
DTB:=(Toan + Ly)/2;
end;
Ðể sắp xếp danh sách sinh viên theo trật tự giảm của DTB sao cho người có
DTB cao thì đứng trước, người có DTB thấp thì đứng sau, ta có thể áp dụng
phương pháp sắp xếp mảng, song chỉ lấy trường DTB làm tiêu chuẩn so sánh:
For i:=1 to 49 do
For j:=i+1 to 50 do
If DS[i].DTB < DS[j].DTB then
begin { Ðổi chỗ DS[i] và DS[j] }
Z:=DS[i];
DS[i]:=DS[j];
DS[j]:=Z;
end;
Ở đây Z là biến bản ghi cùng kiểu với các phần tử DS[i].
Khi sắp xếp theo DTB tăng hoặc giảm thì trường DTB được gọi là "khóa"
( key) sắp xếp.
Một cách tương tự, có thể sắp xếp danh sách sinh viên theo khóa là điểm Toan,
hoặc điểm Ly, hoặc Maso, hoặc theo Hoten.
Ðể in danh sách đã sắp xếp lên màn hình, ta dùng lệnh :
For i:=1 to 50 do WITH DS[i] DO
Writeln( i:2, Hoten:25, Maso:9 , Toan:5:1, Ly:5:1, DTB:5:1);

B/ BÀI TẬP MẪU

Bài tập 1:
Nhập vào một chuỗi St , cho biết trong St có những chữ hoa nào. Ví dụ St =
‘ABc3BAFdzA’ thì có các chữ hoa là A, B, F.
Ch ư ơng tr ình minh ho ạ:

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb0210000700000
00000bc02000000000102022253797374656d0005f806000057890000ac5d1100
04ee8339e8011c000c020000040000002d01000004000000020101001c000000fb
02ceff0000000000009001000000000440001254696d6573204e657720526f6d61
6e0000000000000000000000000000000000040000002d0101000500000009020
00000020d000000320a2d0000000100040000000000f8061d0520001600040000
002d010000030000000000

Trang 90
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

Bài tập 2.
Viết chương trình nhập một danh sách sinh viên lớp Z gồm họ tên, năm
sinh, điểm thi vào trường (gồm điểm toán, lý, hoá). In danh sách này ra màn hình.

Chương trình minh hoạ:


Procedure Nhapdl;
Begin
Program Ban_ghi; Write('So sinh vien: '); readln(n);
Uses crt; Writeln('Nhap du lieu: ');
Type For i:=1 to n do
Tulieu= Record With Sinhvien[i] do
ten:string; begin
diem:real; Write('Ho ten: '); readln(ten);
End; Write('Diem thi: '); readln(diem);
end;
Var Sinhvien : Array[1..100] of tulieu;
n,i:integer; End;

0100090000037800000002001c00000000000400000003010800050000000b020
0000000050000000c022005f806040000002e0118001c000000fb02100007000000
0000bc02000000000102022253797374656d0005f806000057890000ac5d110004
ee8339e8011c000c020000040000002d01000004000000020101001c000000fb02
ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0
000000000000000000000000000000000040000002d0101000500000009020000
00020d000000320a2d0000000100040000000000f8061d0520001600040000002d
010000030000000000

C. BÀI TẬP TỰ GIẢI

Bài tập 1:
Nhập một chuỗi St, xây dựng ba tập hợp:
Trang 91
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

S1 là tập các chữ hoa có trong St

S2 là tập các chữ thường có trong St


S3 là tập các chữ số có trong St
In các gía trị của mỗi tập S1, S2, S3 trên một dòng.
Bài tập 2:
Nhập vào một mảng A1, A2, ..., A10 các số nguyên dương < 10. Hãy in các
gía trị của mảng này theo thứ tự tăng dần sao cho các phần tử trùng nhau chỉ
được in một lần. Ví dụ : cho mảng 1, 6, 4,1, 9, 6, 6, 0, 3, 9 , in ra: 0,1, 3, 4, 6, 9
Hướng dẫn : xây dựng tập hợp gồm các phần tử của mảng A
Bài tập 3:
Viết chương trình thực hiện trò chơi sau:
Người chơi nhập một số k trong phạm vi từ 1 đến 9

Tạo một tập S gồm ba số ngẫu nhiên trong phạm vi từ 1 đến 9


Kiểm tra xem k có thuộc tập S không?. Nếu thuộc thì người chơi thắng, ngược
lại là thua. In k và tập S lên màn hình.
Hướng dẫn: Trong thư viện CRT có hàm Random(n) trả về một số ngẫu nhiên j
thuộc phạm vi: 0 < j < n .
Bµi tập 4
LËp ch¬ng tr×nh nhËp danh s¸ch n sinh viªn líp Z bao gåm hä tªn,
n¨m sinh, ®iÓm thi vµo trêng(lµ ®iÓm to¸n + ®iÓm lý + ®iÓm ho¸). §a
danh s¸ch ra mµn h×nh.

Bµi tập 5
LËp tr×nh ®äc vµo m¸y mét danh s¸ch N sinh viªn vµ ®iÓm thi
m«n tin häc tõ bµn phÝm råi ®a ra mµn h×nh c¸c sinh viªn kh«ng
®¹t(díi ®iÓm 5) kÌm theo ®iÓm. BiÓu mÉu ®a ra cã d¹ng :

DANH SACH SINH VIEN KHONG DAT MON TIN HOC


-----------------------------------------------------------------
: TT : HO VA TEN : DIEM THI :
: 1 : NGUYEN VAN A : 4 :
: 2 : NGUYEN VAN B : 3 :

Bµi tập 6:
LËp mét ch¬ng tr×nh nhËp tõ bµn phÝm danh s¸ch sinh viªn gåm:
Hä vµ tªn, N¨m sinh. §a ra mµn h×nh hä vµ tªn sinh viªn lín tuæi nhÊt.
Bµi tập 7:
LËp ch¬ng tr×nh nhËp tõ bµn phÝm danh s¸ch sinh viªn bao gåm:
Hä vµ tªn, N¨m sinh, Giíi tÝnh, Quª qu¸n. §a ra mµn h×nh danh s¸ch c¸c

Trang 92
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

n÷ sinh viªn sinh sau n¨m 1980.


Bµi tập 8:
LËp ch¬ng tr×nh lµm c¸c viÖc sau :
a) NhËp tõ bµn phÝm mét danh s¸ch thuèc gåm c¸c trêng
TEN_THUOC : Sting[30] ; (tªn thuèc)
NAM_HET_HAN: Interger; (N¨m hÕt h¹n)
SO_LUONG : Interger; (Sè lîng)
DON_GIA : Real; (§¬n gi¸)
KÕt thóc nhËp khi gÆp tªn thuèc = '*'.
b) §a danh s¸ch thuèc ra mµn h×nh.
c) §a ra mµn h×nh tªn c¸c thuèc ®· hÕt h¹n(n¨m hÕt h¹n nhá h¬n
n¨m hiÖn t¹i)
d) TÝnh tæng gi¸ trÞ cña nh÷ng thuèc ®· hÕt h¹n
e) Xo¸ khái danh s¸ch nh÷ng thuèc hÕt h¹n sö dông vµ ®a ra
mµn h×nh danh s¸ch thuèc cha hÕt h¹n sö dông.

Bµi tập 9:
Mét tam gi¸c ®ù¬c xem nh mét tËp hîp gåm ba ®iÓm trªn mÆt
ph¼ng. H·y tæ chøc d÷ liÖu kiÓu b¶n ghi ®Ó chøa c¸c to¹ ®é cña tam
gi¸c. LËp ch¬ng tr×nh lµm c¸c c«ng viÖc sau:
a) NhËp mét tam gi¸c tõ bµn phÝm
b) KiÓm tra xem tam gi¸c cã tÝnh chÊt g× trong c¸c tÝnh chÊt
sau:
+ Tam gi¸c ®iÒu
+ Tam gi¸c vu«ng
+ Tam gi¸c cã mét gãc t
Bµi tập 10:
Cho mét danh s¸ch hµng ho¸ gåm tªn mÆt hµng, sè lîng, ®¬n gi¸,
thµnh tiÒn.
LËp ch¬ng tr×nh thùc hiÖn c¸c viªc sau:
a) NhËp d÷ liÖu tõ bµn phÝm, kÕt thóc nhËp khi tªn mÆt
hµng="/" vµ sè mÆt hµng kh«ng vît qu¸ 200.
b) §a ra mµn h×nh tªn vµ sè lîng cña c¸c mÆt hµng cã sè lîng nhá
nhÊt.
c) §äc thªm mét hµng míi (tªn, sè lîng, ®¬n gi¸) chÌn mÆt hµng
nµy vµo dßng thø k, víi k ®äc tï bµn phÝm.
d) TÝnh tæng gi¸ trÞ hµng ho¸ cã trong danh s¸ch.

Bµi tập 11:


Trong mét bÖnh viÖn cã 3 phßng kh¸m(1, 2, 3), khi bÖnh nh©n

Trang 93
Bài tập Pascal phần cơ sở Biên soạn: Bộ môn CNPM – UTEHY

®Õn kh¸m bÖnh, nh©n viªn ®ãn tiÕp ph¶I nhËp th«ng tin bÖnh nh©n
vµo m¸y tÝnh bao gåm c¸c th«ng tin:
Ho_va_ten: String[50]; (hä vµ tªn)
Tuoi : Integer; (Tuæi bªnh nh©n)
Gioi_tinh : String[5]; (Nam/n÷)
Que_quan : String[50]; (Quª qu¸n)
Phong_kham : Integer; (phßng kh¸m sè: 1, 2, 3)
LËp ch¬ng tr×nh lµm c¸c c«ng viÖc sau:
a) NhËp th«ng tin bÖnh nh©n tõ bµn phÝm, kÕt thóc nhËp
khi ho_va_ten ='/'.
b) §a ra mµn h×nh danh s¸ch bÖnh nh©n ®Õn kh¸m (tªn,
tuæi, giíi tÝnh, quª qu¸n) cña c¸c phßng kh¸m 1, 2, 3.

Trang 94

You might also like