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

DE CUONG ON THI HSG TIN 11

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

BÀI TẬP TURBO PASCAL
LÀM QUEN VỚI TURBO PASCAL
Bài tập 1.1: Viết chương trình tính chu vi và diện tích của hình chữ nhật có chiều dài hai
cạnh là a, b được nhập từ bàn phím
Bài tập 1.2: Viết chương trình tính chu vi, diện tích hình vuông có cạnh a được nhập từ
bàn phím
Bài tập 1.3:Viết chương trình tính chu vi và diện tích hình tròn có bán kính r được nhập từ
bàn phím
Bài tập 1.4: Viết chương trình tính diện tích của tam giác có ba cạnh là a,b,c được nhập từ
bàn phím
Bài tập 1.5: Viết chương trình cho phép tính trung bình cộng của bốn số.
Bài tập 1.6: Viết chương trình cho phép tính trung bình cộng của bốn số với điều kiện chỉ
được sử dụng hai biến.
Bài tập 1.7: Viết chương trình cho phép tính trung bình nhân của bốn số với điều kiện chỉ
được sử dụng hai biến.
Bài tập 1.8: Viết chương trình nhập hai số, đổi giá trị hai số rồi in ra hai số.
Bài tập 1.9: Giải bài tập 1.8 mà chỉ được sử dụng hai biến (Tức không được dùng thêm
biến tạm).
Bài tập 1.10: Viết chương trình cho biết chữ số hàng trăm, hàng chục, hàng đơn vị của
một số có ba chữ số. Ví dụ khi nhập số 357 thì máy in ra:
- Chữ số hàng trăm: 3.
- Chữ số hàng chục: 5.
- Chữ số hàng đơn vị: 7.
CÂU LỆNH ĐIỀU KIỆN
Bài tập 2.1:Viết chương trình in ra số lớn hơn trong hai số được nhập từ bàn phím.
Bài tập 2.2:Viết chương trình in ra số lớn nhất trong bốn số nhập từ bàn phím.
Bài tập 2.3:Viết chương trình in ra số lớn nhất trong bốn số nhập từ bàn phím với điều
kiện chỉ được dùng hai biến.
Bài tập 2.4: Viết chương trình xét xem một tam giác có là tam giác đều hay không khi biết
ba cạnh của tam giác.
Bài tập 2.5: Viết chương trình xét xem một tam giác có là tam giác cân hay không khi biết


ba cạnh của tam giác.
Bài tập 2.6:Viết chương trình xét xem một tam giác có là tam giác vuông hay không khi
biết ba cạnh của tam giác.
Bài tập 2.7:Viết chương trình giải phương trình ax + b = 0 Các hệ số a, b được nhập từ
bàn phím.
Bài tập 2.8:Viết chương trình giải phương trình ax2 + bx + c = 0 Với các hệ số a,b,c được
nhập từ bàn phím.
Bài tập 2.9: Viết chương trình dịch các ngày trong tuần sang tiếng anh
2
3
4
5
6
7
8
Monday Tuesday Wednesday Thursday Friday
Saturday Sunday
Bài tập 2.10: Viết chương trình cho phép tính diện tích các hình: Hình vuông; Hình chữ
nhật; Hình tròn; Tam giác; Hình thang. Người dùng chọn hình cần tính diện tích từ bảng
chọn, sau đó khai báo các thông số liên quan và nhận được diện tích của hình:


LẶP VỚI SỐ LẦN BIẾT TRƯỚC
- Đây là vòng lặp căn bản và được sử dụng nhiều nhất trong kiến thức phổ thông. Vòng lặp
for dùng để lặp với số lần định trước, có cấu trúc như sau:
for <biến đếm>:= <giá trị đầu> to <giá trị cuối> do <câu lệnh>;
- Dạng khác (giảm dần biến đếm của vòng lặp for):
for <biến đếm>:= <giá trị cuối> downto <giá trị đầu> do <câu lệnh>;
VD:
For i:=1 to 10 do x:=x+1;

For i:=10 downto 1 do x:=x+1;
Bài tập 3.1:Viết chương trình in ra các số chẵn nhỏ hơn hoặc bằng n.Với n được nhập.
Bài tập 3.2:Viết chương trình in ra các số lẻ nhỏ hơn hoặc bằng n. Với n được nhập. Sao
cho 15 số lẻ được in trên một dòng.
Bài tập 3.3:Viết chương trình in ra tổng các số lẻ nhỏ hơn hoặc bằng n. Với n được nhập.
Bài tập 3.4:Viết chương trình in ra tất cả các ước của một số n.Với n được nhập từ bàn
phím
Bài tập 3.5:Một số có tổng các ước nhỏ hơn nó bằng chính nó được gọi là số hoàn chỉnh.
Ví dụ: 6 có các ước nhỏ hơn nó là 1, 2, 3. Tổng là 1 + 2 + 3 = 6.
Viết chương trình xét xem một số n được nhập từ bàn phím có phải là số hoàn chỉnh
không.
Hướng dẫn:
- Dùng biến n lưu số cần xét.
- Biến S có giá trị ban đầu bằng 0.
- Cho i chạy từ 1 đến n-1. nếu i là ước của n thì cộng thêm i vào S.
- Nếu S = n thì S là số hoàn chỉnh.
Bài tập 3.6:Viết chương trình tìm các số hoàn chỉnh nhỏ hơn n. Với n được nhập từ bàn
phím.
Hướng dẫn: Cho biến i chạy từ 1 đến n. Xét i. Nếu nó là số hoàn chỉnh thì in ra.
Bài tập 3.7: In bảng cửu chương n.Với n nhập từ bàn phím
Bài tập 3.8: Lần lượt in các bảng cửu chương.
Hướng dẫn :
- Cho biến i chạy từ 2 đến 9
- In bảng cửu chương i.
Bài tập 3.9: Viết chương trình xét xem một số n có phải là số nguyên tố không?
a.Hướng dẫn:
- Cho biến i chạy từ 2 đến n – 1 nếu n không chia hết mọi số i thì thì n là số nguyên
tố.
- Sử dụng biến ok có kiểu boolean và có giá trị ban đầu là true. Cứ mỗi lần xét phép
chia n cho i thì

Bài tập 3.10: Viết chương trình in ra tất cả các số nguyên tố bé hơn hoặc bằng n?
Bài tập 3.11: Một phép chia có tổng của số bị chia và số chia bằng 72. Biết rằng thương là
3 và số dư là 8. Tìm số chia và số bị chia.
Bài tập 3.12: Một phép chia có thương bằng 82, số dư là 47. Số bị chia nhỏ hơn 4000. Tìm
số chia
Bài tập 3.13: Có bao nhiêu số tự nhiên có 3 chữ số chia hết cho 3.
Bài tập 3.14: Tính xy. Với y là số nguyên (Xét trường hợp: y=0, y<0, y>0).
Bài tập 3.15: Tính A=n1+n2+…+nn


Bài tập 3.16: Tôi nghĩ 1 số có 3 chữ số. Nếu bớt số đó đi 7 thì được số chia hết cho 7. Nếu
bớt số đó đi 8 thì được số chia hết cho 8. Nếu bớt số đó đi 9 thì được số chia hết cho 9.
Tìm số đó.
Bài tập 3.17: Một người gửi tiết kiệm với số tiền là a triệu, lãi suất mỗi tháng là k%. Hãy
cho biết số tiền người đó rút ra được sau thời gian t tháng. Biết rằng lãi suất sau mỗi tháng
sẽ được cộng vào gốc.
Bài tập 3.18: Viết chương trình tìm các số Py_Ta_Go nhỏ hơn 32000
Bài tập 3.19: Viết chương trình tính biểu thức:  x+ x+ ... + x
n

Bài tập 3.20: Một cụ già đã hơn 100 tuổi, rất yêu môn toán. Khi được phỏng vấn về tuổi
của mình, cụ cho biết: “Nếu thêm ngày sinh của tôi vào tổng các bình phương các chữ số
tuổi tôi thì được kết quả là chính tuổi tôi”. Tính xem cụ bao nhiêu tuổi và ngày sinh của
cụ.
Bài tập 3.21: Tìm các số (Amstrong) có 3 chữ số thỏa mãn: abc =a3+b3+c3
Bài tập 3.22: Hai số tự nhiên M và N được gọi là 2 số bạn bè nếu tổng các ước của M
bằng N và ngược lại tổng các ước của N bằng M (Chú ý: Không tính ước là 1 và chính
nó). Tìm các số M và N trong phạm vi <100000. vd: 284 và 220 là số bạn bè.
Bài tập 3.23: Nhập số nguyên dương N. Tìm số nguyên k nhỏ nhất thỏa mãn điều kiện
3k>N. Đưa ra màn hình số k và giá trị 3k

Bài tập 3.24: Nhập một số nguyên dương n bất kỳ và kiểm tra xem n có phải là số chính
phương không.
Bài tập 3.25: Số siêu nguyên tố là số nguyên tố mà khi bỏ một số tuỳ ý các chữ số bên
phải của nó thì phần còn lại vẫn tạo thành một số nguyên tố.
Ví dụ 7331 là một số siêu nguyên tố có 4 chữ số vì 733, 73, 7 cũng là các số nguyên tố.
Nhiệm vụ của bạn là viết chương trình nhập dữ liệu vào là một số nguyên N (0< N <10) và
đưa ra kết quả là một số siêu nguyên tố có N chữ số cùng số lượng của chúng.
Ví dụ khi chạy chương trình:
Nhap so N: 4↵
Cac so sieu nguyen to có 4 chu so la:
2333 2339 2393 2399 2939 3119 3137
3733 3739 3793 3797 5939 7193 7331 7333 7393
Tat ca co 16 so


LẶP VỚI SỐ LẦN CHƯA BIẾT TRƯỚC
1. Vòng lặp while
- Cú pháp: while <điều kiện> do <câu lệnh>;
- Câu lệnh sẽ được lặp lại nhiều lần cho đến khi nào điều kiện còn đúng (nếu điều kiện sai
thì các lệnh này sẽ không thực hiện nữa). Đối với lệnh này điều kiện sẽ được kiểm tra
trước khi thực hiện lệnh nên nên điều kiện sai thì không có lệnh nào được thực hiện.
vd: Tính tổng các số liên tiếp từ 1 đến 100
var i: byte;
S: longint;
begin
S:= 0;
i:= 1;
while i <= 100 do
begin
S:= S + i;

i:= i +1;
end;
write('Tong tu 1 den 100 la:',S);
readln;
end.
2. Vòng lặp repeat
- Cú pháp:
repeat
<câu lệnh>;
until <điều kiện>;
- Câu lệnh giữa repeat và until sẽ được lặp lại nhiều lần khi nào điều kiện sai, nếu điều
kiện đúng thì ngưng (ngược với vòng lặp while). Đối với lệnh này điều kiện sẽ được kiểm
tra sau khi thực hiện các lệnh giữa repeat và until nên ít nhất các lệnh sẽ được thực hiện
trước 1 lần rồi mới kiểm tra điều kiện đúng hay sai (nếu sai thì thực hiện tiếp vòng lặp,
đúng thì ngưng).
vd: Tính tổng các số liên tiếp từ 1 đến 100
var i,n: integer;
S: real;
begin
S:=0; i:=1;
repeat
S:=S+i; i:=i+1;
until i>100;
writeln('Tong = ',S);
readln;
end.
Bài tập 4.1:Viết chương trình in ra các số lẻ nhỏ hơn hoặc bằng n ( Với n được nhập).
a. Hướng dẫn:
- Sử dụng kiến thức số lẻ đầu tiên bằng 1. Số lẻ sau bằng số trước cộng với 2.
- Cho biến i có giá trị ban đầu bằng 1.

- Dùng vòng lặp while do với điều kiện i < n và công việc bên trong là in i và tăng i
lên 2.
Nhận xét:


- Mọi vòng lặp For ... to ... do đều có thể thay thế bằng vòng lặp while ... do.
- Trong vòng lặp while nhất thiết phải có một câu lệnh làm thay đổi điều kiện lặp. Ở
đây là i:=i+2. Nếu không có sẽ dẫn đến trường hợp lặp vô hạn. Chương trình chạy mãi mà
không có lối ra (Không thoát ra khỏi vòng lặp được).
Bài tập 4.2: Viết chương trình tính n! với n! được định nghĩa như sau:
- n! = 1 với n = 0
- n! = 1.2.3...n (Tích của n số từ 1 đến n).
Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:
Bài tập 4.3: Viết chương trình tính n! với n! được định nghĩa như sau:
- n!! = 1 với n = 0
- n!! = 1.3.5..n với n lẻ.
- n!! = 2.4.6..n với n chẵn.
Yêu cầu: Sử dụng vòng lặp với số lần chưa biết trước:
Bài tập 4.4: Viết chương trình cho phép tính tổng của nhiều số (Chưa biết bao nhiêu số).
Nhập số 0 để kết thúc quá trình nhập.
Bài tập 4.5: Viết chương trình tìm ước chung lớn nhất (UCLN) của hai số với yêu cầu sử
dụng thuật toán Euclid.
Thuật toán Euclid: Nếu a chia hết cho b (a chia b dư 0) thì UCLN(a,b) bằng b
Nếu a chia b dư r thì UCLN(a,b) = UCLN(b,r)
Bài tập 4.6: Dãy Fibonacy có hai phần tử đầu là 1, 1. Các phần tử sau bằng tổng hai phần
tử đứng ngay trước nó: 1, 1, 2, 3, 5, 8, 13, 21, ...
Viết chương trình in ra dãy Fibonacy có phần tử lớn nhất nhỏ hơn n?
Bài tập 4.7: Viết chương trình nhập vào số nguyên dương N, in ra ước số lớn nhất của số
N (khác N).
Bài tập 4.8: Viết chương trình nhập vào 1 số nguyên rồi đếm số các chữ số của số đó

(VD: 1999 có 4 chữ số)
Bài tập 4.9: Viết chương trình nhập vào 1 số nguyên rồi in ra số đảo ngược của số đó.
Bài tập 4.10: Viết chương trình tìm tất cả các số có 3 chữ số sao cho tổng tất cả các chữ số
bằng tích của chúng. VD: a+b+c = a*b*c
Bài tập 4.11: Viết chương trình nhập vào một 1 số nguyên , kiểm tra xem số nguyên đó
có phải là số đối xứng không?
VD: 12321 là số đối xứng.
Bài tập 4.12: Viết chương trình tìm và in ra màn hình tất cả hoán vị của 12345
Bài tập 4.13: Số nguyên n được gọi là số may mắn nếu tổng các chữ số ở vị trí chẵn bằng
tổng các chữ số ở vị trí lẻ. Viết chương trình kiểm tra xem n có là số may mắn không.
VD 1353 là số may mắn
Bài tập 4.14: Một số nguyên dương được gọi là số đẹp nếu tổng các chữ số của nó (trong
hệ thập phân) chia hết cho số chữ số. Ví dụ, 15 là một số đẹp vì 1+5 chia hết cho 2.
Yêu cầu: Cho số nguyên dương n(n<=10^6). Hãy tìm số đẹp thứ n.
Dữ liệu: nhập từ bàn phím nguyên dương .
Kết quả: xuất ra màn hình số đẹp thứ n.
Bài tập 4.15: Số đẹp là số chỉ chứa hai chữ số 6, 8. Ví dụ dãy số đẹp theo thứ tự là 6, 8,
66, 68, 86, 88,... Yêu cầu tìm số đẹp thứ k.
Ví dụ k=4 thì số tìm được là 68
Hãy lập trình giải bài toán trên.


BIẾN MẢNG VÀ DÃY SỐ
Cú pháp:
TYPE <Kiểu mảng> = ARRAY [chỉ số] OF <Kiểu dữ liệu>;
VAR <Biến mảng>:<Kiểu mảng>;
hoặc khai báo trực tiếp:
VAR
<Biến mảng> : ARRAY [chỉ số] OF <Kiểu dữ liệu>;
Ví dụ:

TYPE Mangnguyen = Array[1..100] of Integer;
VAR
A: Mangnguyen;
hoặc:
VAR
A: Array[1..100] of Integer;
- Để truy cập đến phần tử thứ k trong mảng một chiều A, ta sử dụng cú pháp: A[k].
Bài tập 5.1: Viết chương trình cho phép nhập n số và in ra theo thứ tự ngược lại. Ví dụ
nhập 3, 5, 7 thì in ra 7, 5, 3.
Mã chương trình:
Program mang_1;
uses crt;
var n, i: integer;
M: array[1..100] of real;
Begin
write('Nhap so n: '); readln(n);
for i:=1 to n do
Begin
write('M[',i,']='); readln(M[i]);
end;
for i:= n downto 1 do write(m[i],’ ,’);
readln
end.
Bài tập 5.2: Viết chương trình nhập dãy n số và in ra tổng các số lẻ trong dãy số vừa nhập.
Mã chương trình:
Program Mang_Tong_Le;
uses crt;
var i, n : byte;
M : array[1..100] of integer;
Tong : longint;

begin
write('Nhap so phan tu cua day: '); readln(n);
for i:=1 to n do
begin
write('M[',i,']'); readln(M[i]);
end;
tong:=0;
for i:=1 to n do if M[i] mod 2 =1 then
tong:=tong+M[i];
write('Tong cac so le trong day la: ',tong);
readln
end.
Bài tập 5.3: Viết chương trình nhập n số, xoá số thứ k trong n số vừa nhập. In ra n-1 số


còn lại.
n= 10 (Nhập 10 phần tử)
Ví dụ: Nhập 2, 3, 4, 5, 6, 8, 7, 6, 5, 4.
k= 8 (Xoá phần tử thứ 8).
In ra: 2, 3, 4, 5, 6, 8, 7, 5, 4.
Bài tập 5.4: Viết chương trình cho phép nhập nhập một dãy gồm n số nguyên. Nhập thêm
một số và chèn thêm vào dãy sau phần tử k.
Bài tập 5.5: Viết chương trình cho phép nhập n số và cho biết số nhỏ nhất trong các số vừa
nhập là số thứ mấy.
Bài tập 5.6: Viết chương trình cho phép nhập n số sắp xếp và in ra các số đã nhập theo thứ
tự tăng dần.
Bài tập 5.7: Viết chương trình in dãy n số fibonacy.
Dãy Fibonacci là dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và 1 hoặc 1 và 1, các
phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó
A1=1; a2=1; a3=a1+a2; a4=a2+a3;…


Bài tập 5.8: Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm một
số nguyên X. Kiểm tra xem x có thuộc mảng A không?
Bài tập 5.9: Nhập vào mảng A có n phần tử. Tìm phần tử xuất hiện nhiều nhất trong mảng
Bài tập 5.10: Nhập vào mảng A có n phần tử. Hãy xóa các phần tử trùng nhau trong mảng
và in kết quả ra màn hình.
Bài tập 5.11: Viết chương trình kiểm tra số chính phương trong mảng N phần tử. In các
số đó ra màn hình và chỉ số của nó.
Bài tập 5.12: Nhập vào mảng A có n phần tử. sắp xếp các số chẵn chia hết cho 3 lên đầu,
sắp xếp các số lẻ chia hết cho 3 xuống cuối dãy và các số còn lại ở giữa. in ra màn hình
dãy trước và sau khi sắp xếp.
Bài tập 5.13: Nhập vào số N (0liệu khi nhập. In ra phần tử là số nguyên tố.
Bài tập 5.14: Viết chương trình nhập vào 2 mảng số nguyên A, B đại diện cho 2 tập hợp
(không thể có 2 phần tử trùng nhau trong một tập hợp). Trong quá trình nhập, phải kiểm
tra: nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng. In ra màn
hình các phần tử là giao của 2 tập hợp A, B.
Bài tập 5.15: Nhập vào một mảng các số nguyên.
a/ Xếp lại mảng đó theo thứ tự giảm dần.
b/ Nhập vào một số nguyên từ bàn phím. Chèn số đó vào mảng sao cho mảng vẫn
có thứ tự giảm dần. (không được xếp lại mảng)
Bài tập 5.16: Viết chương trình chuyển đổi số tự nhiên N cho trước sang hệ cơ số 2
Bài tập 5.17: Viết chương trình nhập vào một dãy số nguyên có n phần tử.
a. Đưa những phần tử lẻ ra đầu danh sách, những phần tử chẵn về cuối danh sách và in kết
quả ra màn hình.
b. Sắp xếp các phần tử lẻ đầu danh sách theo thứ tứ tăng dần, sắp xếp các phần tử chẵn
cuối danh sách theo thứ tự giảm dần. In danh sách ra màn hình.
Bài tập 5.18: Nhập một số A có n chữ số. Tạo ra số B lớn nhất trong n chữ số của A
VD: A =657546565 => B=766655554



CHƯƠNG TRÌNH CON
I. KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON
- Chương trình con (CTC) là một đoạn chương trình thực hiện trọn vẹn hay một chức
năng nào đó. Trong Turbo Pascal, có 2 dạng CTC:
- Thủ tục (PROCEDURE): Dùng để thực hiện một hay nhiều nhiệm vụ nào đó.
- Hàm (FUNCTION): Trả về một giá trị nào đó (có kiểu vô hướng, kiểu string). Hàm có
thể sử dụng trong các biểu thức.
- Ngoài ra, trong Pascal còn cho phép các CTC lồng vào nhau.
1. Biến toàn cục (global variable): Còn được gọi là biến chung, là biến được khai báo ở
đầu chương trình, nó được sử dụng bên trong chương trình chính và cả bên trong chương
trình con. Biến toàn cục sẽ tồn tại trong suốt quá trình thực hiện chương trình.
· 2. Biến cục bộ (local variable): Còn được gọi là biến riêng, là biến được khai báo ở đầu
chương trình con, và nó chỉ được sử dụng bên trong thân chương trình con hoặc bên trong
thân chương trình con khác nằm bên trong nó (các chương trình con lồng nhau). Biến cục
bộ chỉ tồn tại khi chương trình con đang hoạt động, nghĩa là biến cục bộ sẽ được cấp phát
bộ nhớ khi chương trình con được gọi để thi hành, và nó sẽ được giải phóng ngay sau khi
chương trình con kết thúc.
· 3. Tham số thực (actual parameter) là một tham số mà nó có thể là một biến toàn cục,
một biểu thức hoặc một giá trị số (cũng có thể biến cục bộ khi sử dụng chương trình con
lồng nhau) mà ta dùng chúng khi truyền giá trị cho các tham số hình thức tương ứng của
chương trình con.
· 4. Tham số hình thức (formal parameter) là các biến được khai báo ngay sau Tên
chương trình con, nó dùng để nhận giá trị của các tham số thực truyền đến. Tham số hình
thức cũng là một biến cục bộ, ta có thể xem nó như là các đối số của hàm toán học.
II. LỜI GỌI CHƯƠNG TRÌNH CON
Để chương rrình con được thi hành, ta phải có lời gọi đến chương trình con, lời gọi chương
trình con thông qua tên chương trình con và danh sách các tham số tương ứng (nếu có).
Các qui tắc của lời gọi chương trình con:
· Trong thân chương trình chính hoặc thân chương trình con, ta chỉ có thể gọi tới các

chương trình con trực thuộc nó.
· Trong chương trình con, ta có thể gọi các chương trình con ngang cấp đã được thiết lập
trước đó.
1. Thủ tục (Procedure):
Thủ tục là một đoạn cấu trúc chương trình được chứa bên trong chương trình Pascal như là
một chương trình con. Thủ tục được đặt tên và có thể chứa danh sách tham số hình thức
(formal parameters). Các tham số này phải được đặt trong dấu ngoặc đơn ( ). Ta có thể
truy xuất thủ tục bằng cách gọi tên của thủ tục. Chương trình sẽ tự động truy xuất thủ tục
đúng tên đã gọi và thực hiện các lệnh chứa trong thủ tục đó. Sau khi thực hiện thủ tục
xong, chương trình sẽ trở lại ngay lập tức sau vị trí câu lệnh gọi thủ tục đó.
Có 2 loại thủ tục:
+ Thủ tục không tham số
+ Thủ tục có tham số.
a. Cấu trúc của thủ tục không tham số
PROCEDURE < Tên thủ tục > ;
{ Các khai báo hằng, biến, kiểu cục bộ... }
BEGIN
{ ... các lệnh trong nội bộ thủ tục ... }
END ;


Ví dụ : Tìm số lớn nhất trong 3 trị số nguyên
Program So_ln ;
Var a, b, c : integer ;
yn : char ;
Procedure maximum ;
Var max : integer ;
Begib
if a > b then max := a else max := b ;
if c > max then max := c ;

Writeln ( ‘ So lon nhat la ‘, max ) ;
end ;
BEGIN
yn := ‘Y‘ ;
While (upcase(yn) = ‘Y ‘) do
Begin
Writeln ( ‘Nhap 3 so nguyen : ‘ ) ;
Readln (a, b, c ) ;
maximum ;
Write ( ‘ Tiep tuc nhap 3 so moi khong (y/n) ? ‘ ) ;
Readln (yn) ;
End ;
END.
Trong chương trình trên, thủ tục maximum được khai báo trước khi nó được truy xuất, các
biến a, b, c được gọi nhập vào ở chương trình chính và biến max được định nghĩa bên
trong thủ tục. Điều này cho ta thấy, không phải lúc nào cũng cần thiết khai báo biến ngay
đầu chương trình chính.
b. Cấu trúc của thủ tục có tham số
Khi viết một thủ tục, nếu có các tham số cần thiết, ta phải khai báo nó (kiểu, số lượng, tính
chất, ...). Các tham số này gọi là tham số hình thức (formal parameters). Một thủ tục có thể
có 1 hoặc nhiều tham số hình thức. Khi các tham số hình thức có cùng một kiểu thì ta viết
chúng cách nhau bởi dấu phẩy (,). Trường hợp các kiểu của chúng khác nhau hoặc giữa
khai báo tham số truyền bằng tham biến và truyền bằng tham trị (sẽ học ở phần sau ) thì ta
phải viết cách nhau bằng dấu chấm phẩy (;).
Ví dụ : Tính giai thừa của một số
Program Tinh_Giai_thua ;
Var n : integer ; gt : real ;
Procedure giaithua (m : integer );
Var i : integer ;
Begin

gt := 1 ;
For i := 1 to m do gt := gt * i ;
end;
BEGIN
Write(‘Nhap so nguyen n (0 <= n < 33) = ‘ ) ; Readln (n);
If n>=0 then
Begin
giaithua (n);
Writeln (‘Giai thua cua ‘, n, ‘ la : ‘, gt: 10 : 0) ;


End
Else Writeln( ‘ khong tinh duoc giai thua!‘ ) ;
Readln;
END.
Trong chương trình trên m là các tham số hình thức của thủ tục giaithua. Khi gọi thủ tục
giaithua(n) thì tham số thực n được truyền tương ứng cho tham số hình thức m.
2. Hàm (Function) :
Hàm là một chương trình con cho ta 1 giá trị kiểu vô hướng. Hàm tương tự như thủ tục
nhưng trả về một giá trị thông qua tên hàm và lời gọi hàm tham gia trong biểu thức.
- Tên hàm là tên tự đặt cần tuân thủ theo nguyên tắc đặt tên trong Pascal.
- Kiểu kết quả là một kiểu vô hướng, biểu diễn kết quả giá trị của hàm.
- Một hàm có thể có 1 hay nhiều tham số hình thức, khi có nhiều tham số hình thức cùng
một kiểu giá trị thì ta có thể viết chúng cách nhau bằng dấu phẩy (,). Trường hợp các tham
số hình thức khác kiểu thì ta viết chúng cách nhau bằng dấu chấm phẩy (;).
- Trong hàm có thể sử dụng các hằng, kiểu, biến đã được khai báo trong chương trình
chính nhưng ta có thể khai báo thêm các hằng, kiểu, biến dùng riêng trong nội bộ hàm.
Chú ý là phải có một biến trung gian có cùng kiểu kết quả của hàm để lưu kết quả của hàm
trong quá trình tính toán để cuối cùng ta có 1 lệnh gán giá trị của biến trung gian cho tên
hàm.

Ví dụ : FUNCTION TINH (x, y : integer ; z : real ) : real ;
Đây là một hàm số có tên là TINH với 3 tham số hình thức x, y, z. Kiểu của x và y là kiểu
số nguyên integer còn kiểu của z là kiểu số thực real. Hàm TINH sẽ cho kết quả kiểu số
thực real.
Ví dụ : Bài toán tính giai thừa.
Program giaithua;
Var x : integer ;
Function gt(n : integer):integer ;
Var heso, tichso : integer ;
Begin
tichso:= 1 ;
If n <= 1 Then gt := 1
Else
Begin
For heso := 2 to n do
tichso:= tichso * heso ;
gt := tichso;
End ;
End ;
BEGIN
Write (‘ Nhap vao so nguyen duong x = ‘ ); Readln (x) ;
Writeln (‘ Voi x = ‘, x , ‘ thi giai thua se la : x ! = ‘, gt(x))
Readln;
END.
Khi khai báo kiểu dữ kiệu cho các tham số hình thức trong thủ tục và hàm, ta cần phải chú
ý điểm sau:
Nếu kiểu dữ liệu của các tham số hình thức là các kiểu dữ liệu có cấu trúc (kiểu array,
string, kiểu record,... ) thì việc khai báo kiểu dữ liệu cho các tham số hình thức nên được
khai báo theo cách gián tiếp, tức là phải thông qua từ khóa



TYPE.
Ví dụ : Procedure Xuat1(hoten : string[25]);
Procedure Xuat2(mang: array[1..10] of integer);
Hai chương trình con Xuat1 và Xuat2 đều bị lỗi ở phần khai báo kiểu dữ liệu cho hai tham
số hình thức là hoten và mang. Để khắc phục lỗi này, ta sẽ khai báo gián tiếp một kiểu dữ
liệu str25 và M10 thông qua từ khóa TYPE như sau:
TYPE
Str25=string[25]; {Str25 là một kiểu chuỗi có độ dài 25}
M10=Array[1..10] of integer; {M10 là một kiểu dữ kiệu mảng có 10 phần tử nguyên}
Tiếp đến, dùng 2 kiểu dữ liệu mới định nghĩa Str25 và M10 để định kiểu cho các tham số
hình thức hoten và mang như sau:
Procedure Xuat1(hoten : Str25);
Procedure Xuat2(mang: M10);
III. TRUYỀN THAM SỐ CHO CHƯƠNG TRÌNH CON
Khi truyền tham số trong Pascal, đòi hỏi phải có sự tương ứng về tên của kiểu dữ liệu của
các tham số hình thức và tham số thực. Một số định nghĩa và qui tắc về truyền tham số
trong Pascal:
Những tham số hình thức nằm sau từ khóa VAR gọi là tham số biến (variable parameter).
Với tham số biến, các tham số thực bắt buộc phải là biến chứ không được là giá trị. Khi
giá trị của tham số biến thay đổi thì nó sẽ làm thay đổi giá trị của tham số thực tương ứng
và khi ra khỏi chương trình con đó, tham số thực vẫn giữ giá trị đã được thay đổi đó.
Những tham số hình thức không đứng sau từ khóa VAR gọi là tham số trị (value
parameter), khi đó các tham số thực có thể là một biến, một biểu thức, một hằng, hoặc một
giá trị số. Các tham số trị nhận giá trị từ tham số thực khi truyền như là giá trị ban đầu, khi
giá trị của tham số trị thay đổi thì nó sẽ không làm thay đổi giá trị của tham số thực, nghĩa
là giá trị của tham số thực sau khi thoát khỏi chương trình con vẫn luôn bằng với giá trị
của tham số thực trước khi truyền đến chương trình con đó. Do vậy một tham trị không ao
giờ là kết quả tính toán của chương trình con.
Ví dụ: Viết chương trình tính lập phương.

PROGRAM Parameter1;
VAR num: integer; {num là biến toàn cục}
PROCEDURE LapPhuong(var a:integer); {a là một tham số biến}
Begin
a:=a*a*a;
End;
Begin
write(‘Nhập số cần tính lập phương num = ‘);
readln(num);
LapPhuong(num); {tham số thực num được truyền cho
tham số biến a}
writeln(‘Lập phương của số vừa nhập = ‘, num);
readln;
End.
Ví dụ:
PROGRAM parameter2;
VAR a, b : integer ; {biến toàn cục }
PROCEDURE thamso (x : integer ; VAR y : integer ) ;
{ x: là tham số trị , còn y là tham số biến}


BEGIN
x := x + 1 ;
y := y + 1 ;
Writeln (‘Trong procedure thamso, ... ‘) ;
Writeln (‘ Hai số của bạn là a = ‘, x : 3, ‘ và b = ‘, y : 3 ) ;
END ;
BEGIN
Write (‘ Nhập vào 2 trị số nguyên a, b : ‘) ; Readln (a, b) ;
Writeln (‘ Ban đầu, Bạn đã nhập vào a = ‘, a : 3, ‘và b = ‘, b : 3 ) ;

thamso (a, b) ; {tham số thực a truyền cho tham số trị x
tham số thực b truyền cho tham số biến y }
Writeln (‘ Ngoài procedure thamso, ... ‘);
Writeln (‘ Hiện nay, số a là ‘, a : 3, ‘ và b là ‘, b : 3 ) ;
Writeln (‘ Ta thấy, a không đổi và b thay đổi ! ) ;
Readln;
END.
IV. TÍNH ĐỆ QUI CỦA CHƯƠNG TRÌNH CON
Một chương trình con mà trong quá trình thiết lập, nó sẽ gọi chính bản thân nó thì chương
trình con có tính đệ qui (recursion).
Ví dụ Bài toán tính giai thừa (factorials) theo cách đệ qui. Bài toán này có phần chương
trình chính giống như đã có ở ví dụ trước:
PROGRAM Giaithua ; (*Tính giai thừa của số n theo phương pháp đệ
qui *)
VAR x : integer ;
FUNCTION factorial (n : integer) : longint ;
BEGIN
IF n <= 1 THEN factorial := 1 {điều kiện neo}
ELSE factorial := n * factorial (n -1);
END ;
BEGIN
Write (‘ Nhập vào một số nguyên dương x = ‘ );
Readln (x) ;
Writeln ;
Writeln (‘ Kết quả ',x,'! = ‘, factorial(x));
Readln;
END.
Giả sử ta nhập x = 4, thì 4! = factorial(n), với n = 4, ta có sơ đồ
minh họa như sau:
Chú ý:

- Ưu điểm của thuật toán đệ qui là ngắn gọn. Nó có khả năng định nghĩa một tập hợp rất
lớn các đối tượng bằng một số các câu lệnh hữu hạn. Thuật toán đệ qui có vẻ thích hợp cho
các bài toán mà tự thân cấu trúc dữ liệu của nó đã được định nghĩa theo lối đệ qui.
- Có một số thuật toán đệ qui sử dụng cho các bài toán đơn giản có thể được thay thế bằng
một thuật toán khác không tự gọi chúng, sự thay thế đó được gọi là khử đệ qui.
- Trong một số bài toán ta có thể giải theo 2 cách: thuật toán lặp (xem chương trước) và
thuật toán đệ qui. Thông thường, cách giải theo thuật toán lặp (WHILE .. DO) thì tốt hơn
so với thuật toán đệ qui vì đệ qui đòi hỏi thêm bộ nhớ và thời gian. Khi đó các thanh ghi
được sử dụng cho lưu trữ và khi quay trở về phải khôi phục lại trạng thái cũ trong mỗi lần


gọi đến chương trình con. Mức độ phức tạp có thể gia tăng khi trong chương trình con theo
thuật toán đệ qui có chứa những chương trình con khác. Vì vậy, khi dùng đệ qui ta cần thận
trọng, nhất là thuật toán này thường không cho ta thấy rõ trực tiếp toàn bộ quá trình giải
các bước. Nói chung, chỉ khi naò không thể dùng thuật toán lặp ta mới nên sử dụng
thuật toán đệ qui.
III. CẤU TRÚC CHUNG CỦA MỘT CHƯƠNG TRÌNH CÓ SỬ DỤNG CTC
PROGRAM Tên_chương_trình;
USES CRT;
CONST ............;
VAR
............;
PROCEDURE THUTUC[(Các tham số)];
[Khai báo Const, Var]
BEGIN
..............
END;
FUNCTION HAM[(Các tham số)]:<Kiểu dữ liệu>;
[Khai báo Const, Var]
BEGIN

..............
HAM:=<Giá trị>;
END;
BEGIN {Chương trình chính}
...................
THUTUC[(...)];
...................
A:= HAM[(...)];
...................
END.
Chú ý: Trong quá trình xây dựng CTC, khi nào thì nên dùng thủ tục/hàm?
Dùng hàm
Dùng thủ tục
- Kết quả của bài toán trả về 1 giá trị duy - Kết quả của bài toán không trả về giá trị
nhất (kiểu vô hướng, kiểu string).
nào hoặc trả về nhiều giá trị hoặc trả về
- Lời gọi CTC cần nằm trong các biểu kiểu dữ liệu có cấu trúc (Array, Record,
thức tính toán.
File).
- Lời gọi CTC không nằm trong các biểu
thức tính toán.
B. BÀI TẬP
Bài tập 6.1:
Viết chương trình giải phương trình bậc hai với yêu cầu sử dụng các chương trình
con để giải quyết các trường hợp xãy ra của delta.
Mã chương trình:
Program Giai_PT_bac_hai;
uses crt;
var a,b,c,delta:real;
{----------------------}

Procedure delta_duong;
begin
write('Phuong trinh co hai nghiem x1=',(-b+sqrt(delta))/(2*a),'x2=',(-


b+sqrt(delta))/(2*a));
end;
{---------------------}
Procedure delta_khong;
begin
write('Phuong trinh co nghiem kep x=',-b/(2*a):3:1);
end;
{--------------------}
Procedure delta_am;
begin
writeln('Phuong trinh vo nghiem');
end;
{Chuong trinh chinh}
Begin
clrscr;
write('Nhap a: ');readln(a);
write('Nhap b: ');readln(b);
write('Nhap c: ');readln(c);
delta:=b*b-4*a*c;
if delta>0 then delta_duong
else if delta = 0 then delta_khong
else delta_am;
readln
end.


c. Nhận xét: Chương trình con cho phép chia nhỏ công việc nhằm đơn giản hoá. Ngoài ra
lập trình đòi hỏi kỹ năng lập trình theo nhóm.Mỗi người thực hiện một mô-đun riêng, sau
đó thự hiện ghép nối để có chương trình hoàn chỉnh.
Bài tập 6.2:
Viết chương trình cho phép nhập hai số vào hai biến, thực hiện đổi giá trị của hai
biến cho nhau. Yêu cầu dùng chương trình con để thực hiện chức năng đổi giá trị.
a. Hướng dẫn:
b. Mã chương trình:
Program CTC_1;
uses crt;
var a,b: real;
{----CTC doi gia tri----}
Procedure swap(var x,y:real);
var tam:real;
begin
tam:=x;
x:=y;
y:=tam;
end;
{-----Ket thuc CTC-----}
begin
clrscr;
write('Nhap so a: ');readln(a);
write('Nhap so b: ');readln(b);


swap(a,b);
write('Sau khi doi a =',a:3:1);
write('Sau khi doi b =',b:3:1);
readln

end.
b. Nhận xét:
- Nếu bỏ từ var ở khai báo var x,y:real thì chương trình vẫn không báo lỗi nhưng chức
năng đổi giá trị của hai biến không thực hiện được.
Bài tập 6.3: Viết chương trình tính giai thừa của số n (Viết là n!). Với yêu cầu:
Bài tập 6.4: Viết chương trình tính n! với yêu cầu sử dụng hàm để tính giai thừa.
Bài tập 6.5: Viết chương trình cho phép thực hiện rút gọn phân số.
Bài tập 6.6: Viết chương trình cho phép trộn hai dãy số A và B cùng có số phần tử là k để
được dãy số C theo yêu cầu sau:
A = a1, a2 ... ak
B = b1, b2 ... bk
Được C = a1, b1, a2, b2 ... ak, bk.
Bài tập 6.7:Viết chương trình in ra các số nguyên tố nhỏ hơn n với yêu cầu dùng hàm để
kiểm tra một số có phải là số nguyên tố hay không.
Bài tập 6.8: Viết chương trình cho phép sắp xếp một dãy số với yêu cầu sử dụng các
chương trình con: Nhập mảng, in mảng, đổi giá trị của hai số.
Bài tập 6.9: Viết chương trình tính n! bằng kỹ thuật đệ qui.
Bài tập 6.10: Viết chương trình cho phép tìm ước chung lớn nhất của hai số bằng kỹ thuật
đệ qui.
Bài tập 6.11: Viết chương trình thực hiện lần lượt các công việc sau:
- Lập thủ tục nhập ba số thực dương a , b , c từ bàn phím .
- Lập thủ tục kiểm tra xem ba số trên có lập thành ba cạnh của tam giác hay không ?
- Viết hàm tính diện tích của tam giác .
- Viết hoàn thiện chương trình chính.
Bài tập 6.12: Viết chương trình hoàn chỉnh thực hiện phân tích N ra thành các thừa số
nguyên tố.
Ví dụ: N = 1260 = 2 . 2 . 3 . 3 . 5 . 7
Bài tập 6.13: Viết các hàm đệ quy để tính:
S1 = 1+2 +3+......+n ;
S2 = 1+1/2 + .....+ 1/n ;

S3 = 1 + sin(x) + sin2(x) + ......+ sinn (x)
Bài tập 6.14: Viết 2 hàm tìm Max , min của 3 số thực.
Bài tập 6.15: Viết hàm tìm BSCNN của 2 số nguyên a,b được khai báo như sau:
Function BSCNN (a,b:word ):word ;

Chú ý: Nội dung tài liệu có sự sao chép chưa được thẩm định.
Có thể có lỗi mong các bạn thông cảm!


XÂU KÍ TỰ
Để xử lý các chuỗi văn bản, Pascal đưa ra một kiểu dữ liệu mới gọi là xâu ký tự và
được định nghĩa bằng từ khóa STRING. Xâu ký tự là dữ liệu bao gồm một dãy các ký tự
trong bảng mã ASSCII.
Cách khai báo:
Var ten_xau: STRING[độ dài của xâu];
hoặc Var ten_xau:string;
Xâu ký tự trong bộ nhớ nó chiếm số byte bằng số ký tự cực đại được khai báo cộng với
byte đầu tiên chứa số ký tự hiện có của xâu. Độ dài tối đa của xâu ký tự là 255.
- Cách nhập/xuất: Cách đọc hay viết kiểu STRING cũng tương tự như các kiểu dữ liệu
khác, ta sử dụng các thủ tục READ, hoặc WRITE.
Ví dụ:
Readln(st);
Writeln(st);
- Truy cập từng phần tử của xâu ký tự: tương tự mảng 1 chiều: thông qua tên biến kiểu
STRING và chỉ số của nó
Ví dụ:
St := 'Le Thanh Lam';
write(st[4]);
-> Kết quả: cho ra chữ T.
Các thao tác trên xâu ký tự:

1/ Phép cộng xâu:
Ví dụ:
st1:=’Le’; st2:=’Thanh’; St=st1 + st2;
-> KQ: ‘Le Thanh’
2/ Phép so sánh:
Hai xâu ký tự có thể so sánh với nhau bằng các phép so sánh =, >, <…
Nguyên tắc so sánh thực hiện như sau, chúng sẽ đem từng ký tự tương ứng với nhau để so
sánh, xâu nào có ký tự có số thứ tự trong bảng mã ASCII lớn hơn thì xâu đó lớn hơn.
Hai xâu ký tự được gọi là bằng nhau khi chúng hoàn toàn giống nhau (có độ dài như nhau).
Ví dụ: ‘FILENAME’ = ’FILENAME ‘
3/ Các thủ tục và hàm chuẩn xử lý xâu ký tự
a. Hàm length(st): cho độ dài thực của xâu ký tự
ví dụ: st:=’le thanh’ thì LENGTH(st) cho bằng 8.
b/ Thủ tục DELETE(st, pos, num): xóa num ký tự trong xâu st kể từ vị trí pos
Ví dụ: st= ‘FILENAME’
Delete(st,5,4) lúc đó st cho ra là ‘FILE’
c/ Thủ tục INSERT(obj, st, pos): Thủ tục cho kết quả bằng cách chèn xâu ký tự có tên là
Obj vào xâu st tại vị trí pos, những ký tự đứng sau pos sẽ được dời vềphía sau của xâu ký
tự obj.
Ví dụ: obj:= ‘Thanh ‘
st:=’Le Lam’;
INSERT(obj,st,4) lúc đó st=’Le Thanh Lam’;
d/ Thủ tục STR(value, st): Thủ tục này thực hiện việc chuyển đối giá trị kiểu số(value)
sang dạng xâu ký tự và gán cho biến st.
Ví dụ: n là một só nguyên có giá trị: n:=150;
STR(n:5,st) sẽ cho kết quả xâu st là: st=’ 150’;
e/ Thủ tục VAL(st, value,code) đối một xâu ký tự st sang dạng số và gán cho biến value,


nếu biến đối thành công thì code sẽ nhận giá trị bằng 0. ngược lại thì cho giá trị khác

không
Ví dụ: VAL(‘123’,value,code) lúc này code sẽ nhận giá trị bằng 0 và value=123
f/ Hàm COPY(st, pos, num): sao chép trong xâu st, num ký tự tại vị trí pos,
Ví dụ: st=’Le Thanh Lam’
COPY(st,4,5) = ‘Thanh’;
g/ Hàm CONCAT(s1,s2,…,sn): hàm cho ra 1 xâu mới bằng cách nối đuôi các xâu s1,s2,
…,sn lại với nhau.
Ví dụ: CONCAT(‘Le ’,’Thanh ‘, ‘Lam’) = ‘Le Thanh Lam’;
h/ Hàm POS(st1,st2): hàm cho tavị trí tìm thấy đầu tiên của xâu s1 trong xâu s2.
Ví dụ: POS(‘Lam’,‘Le Thanh Lam’) = 10;
i/ Hàm Length(st): cho kết quả là một số nguyên chỉ chiều dài của chuỗi st.
ví dụ: lenght('PASCAL') --> 6
j/ Hàm UPCASE(Ký_tự)--> Đổi Ký_tự thành "KÝ_TỰ" in hoa
4. Truy xuất từng ký tự trong chuỗi
Có thể kết hợp dùng vòng lặp truy xuất các ký tự trong chuỗi.
Ví dụ: In ra các ký tự của chuỗi st[i] ra màn hình theo từng dòng
st:='PASCAL';
for i:=1 to 6 do writeln(st[i]);
Bài 7.1: Viết đoạn chương trình cho phép đọc một xâu ký tự và kiểm tra xâu này có đối
xứng không.
Ví dụ: Xâu “abcddcba” là xâu đối xứng. Xâu “abcdabcd” không đối xứng.
a.Hướng dẫn:
b. Mã chương trình:
Program xau_doi_xung;
var st : string;
doi_xung: boolean;
i,n : byte;
begin
write('Nhap xau can kiem tra: '); readln(st);
doi_xung:= true;

n:=length(st);
for i:=1 to n div 2 do
if st[i]<> st[n-i+1] then doi_xung:=false;
if doi_xung = true then write('Xau doi xung') else write('Khong doi xung');
readln
end.
c. Nhận xét:
- Dùng thêm biến n để chương trình rõ ràng, dễ theo dõi. Có thể thay n bằng
length(st);
- Có thể thay for i:=1 to n div 2 bằng for i:=1 to n nhưng lúc đó chương trình phải
xét n trường hợp thay vì chỉ cần xét n/2 trường hợp.
- Thuật toán của bài này giống với thuật toán xét xem một số có phải là số nguyên
tố không (Thuật toán lính canh).
Bài 7.2: Viết chương trình cho phép viết hoa ký tự đầu từ trong một xâu.
Ví dụ: le nho duyet -> Le Nho Duyet
Program Doi_chu;


uses crt;
var st: string;
i:byte;
begin
clrscr;
write('Nhap xau can doi:'); readln(st);
for i:= 1 to length(st) do if (st[i]=' ') then st[i+1]:=upcase(st[i+1]);
st[1]:=upcase(st[1]);
write(st);
readln
end.
Bài 7.3: Viết chương trình xoá các dấu cách thừa trong một xâu ký tự (Giữa hai từ chỉ có

một dấu cách.
Ví dụ: Le nho
Duyet -> Le Nho Duyet
Bài 7.4: Viết chương trình cho phép tách phần tên ra khỏi xâu gồm họ và tên. Theo qui
ước cách ghi tên của Tiếng việt, tên là từ cuối cùng trong xâu.
Ví dụ: Le Nho Duyet -> Duyet.
Bài 7.5: Viết chương trình cho phép dich xâu sang mã moocxo.
Bài 7.6: Viết phần mềm cho phép mã hoá và giải mã một xâu ký tự theo ý riêng. Để mã
hoá mỗi người dùng các khoá khác nhau. Ví dụ Khoá a: = succ(a) cho phép mã hoá xâu
abc thành bcd.
Bài 7.7: Viết chương trình cho phép đổi một số hệ thập phân sang số nhị phân.
Bài 7.8: Viết chương trình ra chữ: Khi cắt khẩu hiệu người ta thường có nhu cầu được biết
mỗi ký tự xuất hiện bao nhiêu lần trong câu khẩu hiệu. Hãy viết chương trình thực hiện
điều đó.
Ví dụ nhập: LE NHO DUYET
Cho biết D: 1; E: 2...
Bài 7.9: Khi cộng hai số có giá trị quá lớn ta không thể thực hiện được do gới hạn giá trị
của biến. Bằng cách sử dụng xâu ký tự, ta có thể lập chương trình cộng hai số rất lớn (255
chữ số). Hãy viết chương trình này.
Bài 7.10: Nhập xâu kí tự bất kì
a) Đếm số lần xuất hiện của 1 kí tự nào đó trong câu.
b) Liệt kê các kí tự có mặt trong xâu cùng số lần xuất hiện của các kí tự đó.
Bài 7.11: Nhập 1 xâu kí tự.
a) Xét xem trong xâu có K kí tự kề nhau mà như nhau hay không?
b) Hãy xóa đi kí tự kề nhau mà như nhau, chỉ giữ lại một.
Bài 7.12: Nhập 1 xâu kí tự. Kiểm tra tính đối xứng của xâu đó. Nếu xâu không đối xứng
thì đảo xâu.
Bài 7.13: Cho 1 xâu kí tự. Tính xem trong số đó có bao nhiêu loại kí tự khác nhau ( không
phân biệt in hoa hay in thường).
Bài 7.14: Cho 1 xâu kí tự bất kì, tính:

a) Số lượng các kí tự số.
b) Số lượng các kí tự chữ cái.
Bài 7.15: Cho 1 xâu kí tự bất kì (cả số lẫn chữ). Viết chương trình tách các phần là số của
xâu trên và đưa ra 1 mảng số nguyên.


KIỂU FILE
I. KHÁI NIỆM:
Để sử dụng thông tin lâu dài ta phải lưu trữ chúng thành các File ( tập tin, tệp ) trên đĩa mềm
hoặc đĩa cứng. Do đó File là kiểu dữ liệu có cấu trúc và rất quan trọng. Trong Pascal chia ra 3
loại File:
• File có định kiểu.
• File không định kiểu.
• File văn bản.
Trong giới hạn chương trình, chúng ta chỉ nghiên cứu File văn bản.
II. CÁC THỦ TỤC VÀ HÀM CHUẨN
1. Các thủ tục chuẩn
1.1. Gán tên file
Cú pháp: Assign(F, Filename);
Chức năng: Gán một file trên đĩa có tên là Filename cho biến file F, mọi truy xuất trên file
cụ thể được thực hiện thông qua biến file này.
Chú ý:
Filename bao gồm cả tên ổ đĩa và đường dẫn nếu file không nằm trong ổ đĩa, thư mục hiện
thời.
1.2. Mở file mới
Cú pháp: Rewrite(F);
Chức năng: Tạo file mới có tên đã gán cho biến file F. Nếu file đã có trên đĩa thì mọi dữ
liệu trên đó sẽ bị xoá và con trỏ file trỏ ở vị trí đầu tiên của file.
1.3. Mở file đã có trên đĩa
Cú pháp: Reset(F);

Chức năng: Mở file có tên đã gán cho biến file F. Nếu file chưa có trên đĩa thì chương trình
sẽ dừng vì gặp lỗi xuất/nhập. Vì thế người ta phải kiểm tra khi mở file.
Chú ý: Kiểm tra khi mở file: Người ta định hướng kiểm tra lỗi vào ra bằng cách dùng chỉ thị
{$I-} và {$I+}vào trước và sau câu lệnh Reset(F). Dùng hàm Ioresult: Word để cho biết kết quả
mở file. Nếu Ioresult có giá trị là 0 thì không có lỗi, ngược lại khác 0 thì có lỗi.
Ví dụ:
Program MoFile;
Var Ten_File:String;
F:Text;
Begin
Write(‘Nhập tên File: ‘);readln(Ten_File);
Assign(F,Ten_File);
{$I-} Reset(F);
{$I+}
If Ioresult <> 0 then
Begin
writeln(‘Co loi khi truy xuat File : ‘,Ten_File);
Exit;
End
Else Writeln(‘ Khong co loi khi truy xuat File ‘);
End;
1.4. Đọc dữ liệu từ file
Cú pháp: Read(F, x);
Chức năng: Đọc một phần tử dữ liệu từ file F ở vị trí con trỏ file và gán cho các biến x.
1.5. Ghi dữ liệu lên file
Cú pháp: Write(F, Value);
Chức năng: Ghi giá trị Value vào file F tại vị trí hiện thời của con trỏ file.
1.6. Đóng file
Cú pháp: Close(F);



Chức năng: Cập nhật mọi sửa đổi trên file F và kết thúc mọi thao tác trên file này.
2. Hàm kiểm tra cuối file
Cú pháp: EOF(F);
Chức năng: Hàm trả về giá trị True nếu con trỏ file đang ở cuối file, ngược lại hàm trả về
giá trị False.
III. FILE VĂN BẢN (TEXT FILE)
1. Khai báo
Var
<Tên biến file>: Text;
Ví dụ: F:Text;
2. Các thủ tục và hàm chỉ tác động trên file dạng text
2.1. Thủ tục Append
Cú pháp: Append(F);
Chức năng: Mở file đã tồn tại để bổ sung nội dung vào cuối file.
2.2. Thủ tục Readln
Cú pháp: Readln(F,x);
Chức năng: Đọc một dòng từ vị trí con trỏ file và gán cho biến x. Thực hiện xong, con trỏ
file sẽ chuyển về đầu dòng tiếp theo. Biến x có thể nhận các kiểu: Char, String hoặc kiểu số.
Chú ý: không thể dùng lệnh Readln(F,x)để đọc số nguyên trong một tệp số nguyên.
2.3. Thủ tục Writeln
Cú pháp: Writeln(F, x);
Chức năng: Ghi giá trị x vào file ở vị trí con trỏ file. Kết thúc thủ tục, con trỏ file sẽ
chuyển về đầu dòng sau.
2.4. Hàm EOLn
Cú pháp: EOLn(F);
Chức năng: Hàm trả về giá trị True nếu con trỏ đang ở cuối một dòng, ngược lại hàm trả
về giá trị False.
Chú ý:
• Sau đây là các thao tác cơ bản khi xuất nhập file:

Ghi dữ liệu vào file
Đọc dữ liệu từ file
ASSIGN(f,FileName);
ASSIGN(f,FileName);
REWRITE(f);
RESET(f);
...
...
WRITE(f,value);
While Not EOF(f) Do
...
Begin
CLOSE(f);
READ(f,x);
...
End;
...
CLOSE(f);

Chú ý:
Nếu bạn đọc xâu thì bạn có thể dùng readln(f,s) để đọc cả dòng vào biến s. hoặc dùng read(f,s)
thì máy chỉ nhập cho bạn 1 kí tự.
Ngược lại nếu bạn nhập theo số nguyên thì nếu dùng read(f,N) máy sẽ nhập cả số nguyên, tuy
nhiên read ko tự xuống dòng. Tuy nhiên nếu bài toán chỉ có số nguyên thì nhập read vẫn được, do
read khi hết dòng nó sẽ xuống tiếp dòng dưới để đọc số tiếp. còn đối với xâu, khi hết dòng, mà
dùng lệnh read(f,s); thì nó sẽ đọc vào kí tự enter(xuống dòng); để giải quyết bạn nên nhập bằng
readln(f,s);


IV. BÀI TẬP.

Bài tập 9.1: Viết chương trình đọc các số nguyên trong một File text và gán các số nguyên đó
vào mảng A. (File text gồm các số nguyên đã lưu ở ổ cứng).
Var f:Text;
tenfile:String;
A:Array[1..100] of integer;
i,n:integer;
Begin
Write(' Nhap ten file du lieu : ');
Readln(tenfile);
Assign(f,tenfile);
{$I-} Reset(f); {$I+}
If Ioresult<>0 then
Begin
Writeln(' Khong co tap tin co ten : ',tenfile);
Halt(1);
End;
n:=0;
While Not EOF(f) do
Begin
While Not EOLN(f) do
Begin
inc(n); Read(F,a[n]);
End;
Readln(f);
End;
Close(f);
Writeln;
If n>0 then
Begin
Write('A = ');

For i:=1 to n do write(a[i],' ');
End;
Readln;
End.
Bài tập 9.2: Viết chương trình đọc và đếm số lượng số nguyên trong một File text.
Bài tập 9.3: Viết chương trình tạo ra một File text có tên DULIEU.INP gồm các số nguyên.
Tính tổng các số nguyên trên một hàng. Kết quả lưu vào File text có tên DULIEU.OUT,
trong đó mỗi tổng được ghi trên một hàng.
Chẳng hạn
DULIEU.INP

DULIEU.OUT
65
11
3 6 8 12 2
31
7 5 6 10 6
34
82451
20
Bài tập 9.4: Viết chương trình sắp xếp các số nguyên trong một File text theo thứ tự tăng
dần.
Bài tập 9.5: Viết chương trình thực hiện các công việc sau:
a) Đọc 2 file text số nguyên và sắp xếp chúng theo thứ tự tăng dần.
b) Hãy nối 2 file đó lại với nhau thành file thứ 3 sao cho file mới vẫn có thứ tự tăng dần.
Gợi ý:
- Câu a) dùng hai mảng A,B để ghi các số nguyên có trong 2 file rồi sắp xếp theo mảng A,B.


- Câu b) có thể làm theo hướng dẫn sau:

Dùng thêm 1 mảng C và ta tiến hành như sau:
 Dùng 2 chỉ số i,j để duyệt qua các phần tử của 2 mảng A, B và k là chỉ số cho mảng C.
 Trong khi (i<=m) và (j<=n) thì:
{Tức là khi đồng thời cả 2 dãy A, B đều chưa duyệt hết}
+ Nếu A[i]>B[j] thì: C[k]:=A[i]; i:=i+1;
+ Ngược lại: C[k]:=B[j]; j:=j+1;
 Nếu dãy nào hết trước thì đem phần còn lại của dãy kia bổ sung vào cuối dãy C.
BÀI TẬP TỰ GIẢI
Bài tập 9.6: Viết chương trình thực hiện các công việc sau:
c) Tạo ra 2 file số nguyên và sắp xếp chúng theo thứ tự tăng dần.
d) Hãy nối 2 file đó lại với nhau thành file thứ 3 sao cho file mới vẫn có thứ tự tăng dần.
Bài tập 9.7: Cho 2 mảng số nguyên: Mảng A có m phần tử, mảng B có n phần tử.
a/ Sắp xếp lại các mảng đó theo thứ tự giảm dần.
b/ Trộn 2 mảng đó lại thành mảng C sao cho mảng C vẫn có thứ tự giảm dần (Không được
xếp lại mảng C).
Bài tập 9.8: Cho đa thức P(x) = a0 + a1x + a2x2 + ... + anxn
Trong đó n là bậc của đa thức và a0, a1, ... , an là các hệ số của đa thức được lưu trong một
file văn bản với qui ước sau:
- Dòng đầu của file văn bản chứa bậc của đa thức và giá trị của x.
- Dòng tiếp theo chứa các hệ số của đa thức.
Ví dụ: P(x) = 3 + 2x - 5x2 + 4x3 , x = 2.5 sẽ được lưu trong file văn bản như sau:
3
2.5
3
2
-5
4
Viết chương trình đọc file văn bản trên để lấy các số liệu rồi tính giá trị của đa thức.
Gợi ý:
- Tổ chức mảng để lưu đa thức.

- Viết thủ tục để đọc file text lưu vào mảng.
Bài tập 9.9: Viết chương trình tạo ra hai tập tin lưu các số kiểu word mà các số trong mỗi file đã
được sắp thứ tự tăng dần. Hãy tạo tập tin mới chứa tất cả các số của 2 tập tin trên sao cho thứ tự
tăng dần vẫn được duy trì.
Chú ý: Không được dùng mảng.
Bài tập 9.10: Viết chương trình cho phép ghi các số lẻ xuống đĩa với tên so_le.dat sau đó đọc và
xuất ra màn hình nội dung file này.
Bài tập 9.11: Viết chương trình tìm các số nguyên tố nhỏ hơn hoặc bằng n ( nhập từ bàn phím) và
ghi các số này xuống đĩa.
Bài tập 9.12: Viết chương trình thực hiện việc cấp số xe mô tô với yêu cầu:
- Cấp số ngẫu nhiên có 4 chữ số.
- Số đã cấp được lưu lại trên đĩa để quản lý.
Bài tập 9.13: - Đọc file so_xe.dat để xét xem số vừa tạo có trong file này không. Nếu đã có thì
quay lại tạo số ngẫu nhiên khác. Lặp cho đến khi tạo được số không có trong file này (chưa cấp )
thì cấp số này.
CHÚ Ý QUAN TRỌNG
Tệp văn bản
a. Khai báo tệp văn bản:
Tệp văn bản được khai báo trực tiếp trong phần khai báo biến:
Var
Bientep:Text;
b. Truy nhập vào tệp:
Truy nhập vào tệp được hiểu là nhập dữ liệu vào tệp, ghi lại dữ liệu trên thiết bị nhớ ngoài, đọc dữ
liệu đó ra màn hình hoặc máy in và xử lý nó.


Mở tệp mới để ghi:
Assign(bientep, tentep);
Rewrite(bientep);


Mở tệp đã có để ghi thêm:
Assign(bientep, tentep);
Append(bientep);
• Mở tệp để đọc dữ liệu:
Assign(bientep, tentep);
Reset(bientep);
c. Ghi dữ liệu vào tệp:
Sau khi đã mở tệp chúng ta có thể dùng thủ tục Write hoặc Writeln để ghi dữ liệu vào tệp.
Ví dụ 2.7:
Var
T1:Text;
Begin
Assign(T1,’Dulieu.dat’);
Rewrite(T1);
Writeln(T1,’Tep van ban’);
Write(T1,123);
Write(T1,’ ’,123.45);
Writeln(T1);
Close(T1);
End.
Dữ liệu ghi vào tệp như sau:
Tep van ban
123 1.234500000E+02
Dòng trống
d. Đọc dữ liệu từ tệp văn bản:
Sau khi tiến hành mở tệp, con trỏ tệp sẽ được đặt tại dòng đầu.Ta dùng thủ tục Read hoặc Readln
để đọc dữ liệu từ dòng hiện thời và gán vào biến tương ứng, viết biến đó ra màn hình hoặc máy in.
Để có thể viết toàn bộ dữ liệu từ một tệp văn bản ra các thiết bị ngoài thì, thì các lệnh đọc viết phải
được lặp đi lặp lại từ dòng 1 đến dòng cuối cùng, nghĩa là phải sử dụng một trong 2 vòng lặp:
While not eof(Bientep) do

Begin
Readln(Bientep, Dong); {biến Dong phải được khai báo trước, kiểu String}
Write(Dong);
End;
Hoặc:
For i:=1 to filesize(Bientep) do
Begin
Readln(Bientep,Dong);
Write(Dong);
End;
Lưu ý: Muốn lấy lại kiểu của dữ liệu nhập vào tệp văn bản thì mỗi biến phải nhập trên một dòng.


Chú ý: Tài liệu có sự sao chép chưa được thẩm định.



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×