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

Bài tập thực hành tin học tự chọn lớp 8

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 (165.4 KB, 24 trang )

Thành Viên Tuổi Học Trò
123doc.org
Bài tập thực hành Tin Học tự chọn lớp 8
I. Các kiểu dữ liệu và phép toán
1. Kiểu số nguyên
1.1 Các kiểu số nguyên
Tên kiểu Phạm vi giá trị Số byte Giải thích
ShortInt -128 127 1 1 bit chứa dấu, 7 bit chứa giá trị
Byte 0 255 1 8 bit chứa giá trị
Integer -32768 32767 2 1 bit chứa dấu, 15 bit chứa giá trị
Word 0 65535 2 16 bit chứa giá trị
LongInt -2147483648
2147483647
4 1 bit chứa dấu, 31 chứa giá trị
1.2 Các phép toán
Phép toán Trong toán học Trong Pascal
Các phép toán số + (cộng), - (trừ), x (nhân), div (chia +, -, *, div, mod
1
Con trỏ
Các
kiểu
dữ liệu
Đơn
giản
Có cấu
trúc
Chuẩn
Do người
dùng định
nghĩa
Mô tả


sẵn
Do người
dùng định
nghĩa
Logic (boolean)
Ký tự (char)
Nguyên (integer)
Thực (real)
Liệt kê (enumerate)
Đoạn con (sub range)
Xâu ký tự (string)
Mảng (array)
Tập hợp (set of)
Bản ghi (record)
Tệp (file)
Ngăn xếp (stack)
Hàng đợi (queue)
Danh sách (list)
Cây (tree)
….

Thành Viên Tuổi Học Trò
123doc.org
học với số nguyên nguyên), mod (lấy phần dư)
2. Kiểu số thực
2.1 Kiểu Real và các kiểu mở rộng
Kiểu Real là kiểu số thực thông dụng nhất dùng để biểu diễn các số thực x có trị tuyệt
đối |x| nằm trong khoảng từ 2.9*10
-39
đến 1.7*10

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

3.4*10
38
4
Double 5.0*10
-324
1.7*10
308
8
Extended 3.4*10
-4932
1.1*10
4932
10
Comp -9.2*10
18
9.2*10
18
8
Chú ý: Turbo Pascal thường chỉ làm việc với một kiểu Real. Muốn dùng 4 kiểu thực còn
lại, phải chuyển sang mode 8087 bằng cách viết chỉ thị {$N+} ở ngay đầu chương trình.
2.2 Các phép toán
Phép toán Trong toán học Trong Pascal
Các phép toán số học
với số thực
+ (cộng), - (trừ), x (nhân), : (chia) +, -, *, /
2
Thành Viên Tuổi Học Trò
123doc.org
II. Câu lệnh gán
Lệnh gán là một trong những lệnh hay dùng nhất trong ngôn ngữ lập trình PASCAL.

Cú pháp: <Tên biến>:=<Biểu thức>;
Thực hiện: Tính giá trị biểu thức bên phải dấu gán ‘:=’ và ghi giá trị đó vào địa chỉ của
biến có tên ở bên trái dấu gán ‘:=’, tức là gán giá trị cho biến.
Chú ý: Kiểu của biểu thức phải phù hợp với kiểu của tên biến.
Ví dụ:
Sau khi thực hiện các lệnh gán sau đây thì giá trị của các biến x, y, z là bao nhiêu?
1) x:=1;
2) y:=2;
3) z:=3;
4) x:=x+1; {Tăng giá trị của biến x lên 1 đơn vị ≈ thủ tục Inc(x)}
5) y:=y-1; {Giảm giá trị của biến y xuống 1 đơn vị ≈ thủ tục Dec(y)}
6) x:=x+y+z;
7) y:=y+z-x;
8) z:=x+y-z;
Giải thích ý nghĩa khi thực hiện các câu lệnh:
Câu lệnh 1, 2, 3: Thực hiện gán giá trị 1, 2, 3 cho các biến tương ứng là x, y, z (giá trị
của x là 1, giá trị của y là 2, giá trị của z là 3).
Câu lệnh 4: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 2, lấy giá trị
đó gán cho biến x (giá trị của x là 2)
Câu lệnh 5: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 1, lấy giá trị
đó gán cho biến y (giá trị của y là 1)
Câu lệnh 6: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 6, lấy giá trị
đó gán cho biến x (giá trị của x là 6)
Câu lệnh 7: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị -2, lấy giá
trị đó gán cho biến y (giá trị của y là -2)
Câu lệnh 8: Thực hiện tính giá trị biểu thức bên phải dấu gán được giá trị 1, lấy giá trị
đó gán cho biến z (giá trị của z là 1)
Trả lời: Sau khi thực hiện các câu lệnh gán trên thì giá trị của x là 6,giá trị của y là -2,
giá trị của z là 1.
Chú ý:

- Khi gán giá trị phải đảm bảo tính tương thích giữa kiểu dữ liệu và giá trị gán, ví
dụ khai báo biến x kiểu Integer thì không thể gán nó cho giá trị 6.5.
- Trong câu lệnh gán có một ngoại lệ đó là biến kiểu thực có thể nhận giá trị
nguyên.
III. Hạn chế nhận giá trị cho một biến:
3
Thành Viên Tuổi Học Trò
123doc.org
Ví dụ 1:
{ }
Var
Ch:Char;
Begin
Repeat
{ }
Write(‘Tiep tuc hay khong? Co-C, Khong-K’);
Ch:=ReadKey
Until Ch In [’K’,’k’];
End.
Ví dụ 2:
{ }
Var
T:Word;
Begin
{ }
Write(‘Nhap so hieu thang T=’);
Repeat
Readln(T);
Until T In [1 12];
End.

Ví dụ 3: Chương trình nhập một số tự nhiên N nằm trong khoảng từ 1 đến 20
Program Vidu3;
Uses Crt;
Var x,y,N:Integer;
Begin
Clrscr;
Write(‘Nhap so N:’);
x:=Wherex;
y:=Wherey;
Repeat
Gotoxy(x,y);
Clreol;
Readln(N);
Until (N>=1) and (N<=20);
End;
IV. Chương trình con
1. Chương trình con
4
Thành Viên Tuổi Học Trò
123doc.org
- Việc giải quyết bài toán phức tạp thường bao gồm nhiều giai đoạn. Mỗi giai đoạn
giải quyết một bài toán con đơn giản hơn. Do vậy cần phân chương trình thành các khối,
mỗi khối bao gồm các lệnh giải quyết một bài toán con nào đó. Các khối lệnh sẽ được
xây dựng thành các chương trình con. Sau đó chương trình sẽ được xây dựng nên từ các
chương trình con này.
- Làm chương trình dễ đọc dễ hiểu, dễ kiểm tra để phát hiện ra lỗi và sửa sai.
- Có thể nhiều người cùng viết một chương trình. Mỗi người viết một chương trình
con rồi sau đó lắp ghép lại.
- Việc sử dụng chương trình con tránh phải viết lặp đi lặp lại cùng một nhóm lệnh
nào đó.

- Có hai loại chương trình con: Thủ tục (Procedure) và Hàm (Function)
2. Cách viết và sử dụng thủ tục
2.1 Cấu trúc
Procedure Tên_thủ_tục;
{ mô tả nhãn, hằng}
{ kiểu, biến}
Begin
{ dãy các lệnh}
End;
2.2 Vị trí của thủ tục trong chương trình
Trong chương trình có sử dụng thủ tục thì các thủ tục phải được mô tả trước trong
phần khai báo của chương trình, sau phần khai báo biến.
Program Tên_chương_trình;
Const
{ }
Type
{ }
Var
{ }
Procedure Tên_thủ_tục; {Bắt đầu khai báo thủ tục}
{ }
Begin
{ }
End; {Kết thúc khai báo thủ tục}
{ Khai báo các thủ tục và hàm khác}
BEGIN
{ Thân chương trình chính}
Tên_thủ_tục; {Lời gọi thực hiện thủ tục}
{ }
END.

2.3 Ví dụ 4: Lập chương trình vẽ các hình vuông có dạng:
***
5
Thành Viên Tuổi Học Trò
123doc.org
* *
***
Program Vidu4;
Uses Crt;
Procedure Ve_hv; {Bắt đầu thủ tục}
Begin
Writeln(‘***’);
Writeln(‘* *’);
Writeln(‘***’);
End;
BEGIN
Clrscr;
Ve_hv;
Writeln;
Writeln;
Ve_hv;
Writeln;
Writeln;
Ve_hv;
Readln;
END;
2.4 Tham số
2.4.1 Tham số giá trị
Trong thủ tục Ve_hv mô tả ở trên chỉ vẽ được hình vuông có cạnh là 3. Giả sử trong
chương trình cần vẽ các hình vuông có cạnh khác nhau. Để thủ tục Ve_hv có thể vẽ được

các hình vuông có cạnh khác nhau, ta đưa vào thủ tục một tham số Canh.Tham số Canh
được đưa vào đầu thủ tục.
Ví dụ 5:
Program Vidu5;
Uses Crt;
Procedure Ve_hv(Canh:Integer); {Bắt đầu thủ tục}
Var
i,j: Integer;
Begin
For i:=1 to Canh Do Write(‘*’); {Vẽ cạnh trên của hình vuông}
Writeln;
For i:=1 to Canh-2 Do {Vẽ 2 cạnh bên của hình vuông}
Begin
Write(‘*’);
For j:=1 to Canh-2 Do
Writeln(‘ ’);
Writeln(‘*’);
6
Thành Viên Tuổi Học Trò
123doc.org
End;
For i:=1 to Canh Do Write(‘*’); {Vẽ cạnh dưới của hình vuông}
Writeln;
End;
BEGIN
Clrscr;
Ve_hv(3);
Writeln;
Writeln;
Ve_hv(5);

Writeln;
Writeln;
Ve_hv(7);
Readln;
END;
- Một thủ tục có thể không có tham số hoặc có thể có một hoặc nhiều tham số.
Các tham số được đưa vào trong cặp dấu ngoặc tròn sau tên của thủ tục khi khai báo được
gọi là tham số hình thức. Tham số hình thức Canh trong thủ tục Ve_hv(Canh:Integer)
thuộc loại tham số giá trị (còn gọi là tham trị). Sở dĩ Canh là tham số giá trị vì khi gọi
thủ tục, tham số Canh được thay bởi các giá trị (3, 5, 7 trong ví dụ trên).
- Khi gọi thủ tục, một tham số hình thức thuộc loại tham số giá trị có thể được thay
thế bởi biểu thức có cùng kiểu dữ liệu với tham số đó. Trong ví dụ trên, Canh là tham số
thuộc kiểu Integer và X là một biến thuộc kiểu Integer, khi đó các lời gọi thủ tục sau đây
đều hợp lệ:
Ve_hv(3);
Ve_hv(X);
Ve_hv(3*X+2);
Trong các lời gọi thủ tục trên, hằng nguyên 3, biến nguyên X, biểu thức nguyên
3*X+2 được gọi là tham số thực sự. Trong lời gọi thứ nhất tham số Canh được thay thế
bởi giá trị hằng 3; trong lời gọi thứ hai tham số Canh được thay thế bởi giá trị của biến
X; trong lời gọi thứ ba tham số Canh được thay thế bởi giá trị của biểu thức 3*X+2.
- Khi gọi thủ tục, các tham số hình thức được thay thế bởi các tham số thực sự.
2.4.2 Tham số biến
Trong thủ tục, ngoài việc sử dụng các tham số giá trị ta còn có thể sử dụng các tham
số biến. Khi gọi thủ tục, các tham số biến chỉ được phép thay thế bằng các biến (tham số
thực sự). Các biến này chịu mọi sự biến đổi trong thủ tục và giữ lại mọi biến đổi chúng
trong quá trình thực hiện thủ tục.
Ví dụ 6: Chương trình tráo đổi giá trị của 2 biến:
Program Vidu6;
Var

a,b:Integer;
Procedure Trao_doi(Var x,y:Integer);
7
Thành Viên Tuổi Học Trò
123doc.org
Var
tg:Integer;
Begin
tg:=x;
x:=y;
y:=tg;
End;
BEGIN
Clrscr;
a:=3;
b:=5;
Writeln(a:5,b:5);
Trao_doi(a,b);
Writeln(a:5,b:5);
Readln;
END.
Trong thủ tục Trao_doi ở chương trình trên, biễu diễn Var x,y:Integer chỉ rằng x và y
là hai tham số biến kiểu nguyên. Xét lời gọi thủ tục Trao_doi(a,b). Trong lời gọi này, các
tham số biến x và y được thay thế bởi các biến nguyên trương ứng là a và b. Các biến này
chịu sự biến đổi trong thủ tục, cụ thể là: tg:=a; a:=b; b:=tg; do vậy, sau khi thực hiện thủ
tục Trao_doi(a,b), biến a sẽ nhận giá trị của biến b và biến b nhận giá trị của biến a.
Để nhận biết sự khác nhau giữa tham số biến và tham số giá trị, xét chương trình sau:
Ví dụ 7:
Program Vidu7;
Var

x,y:Integer;
Procedure Thay_doi(Var z:Integer; w:Integer);
Begin
z:=1;
w:=1;
End;
BEGIN
x:=0;
y:=0;
Thay_doi(x,y);
Writeln(x:5,y:5);
END.
Khi chương trình thực hiện, sẽ nhận được kết quả
1 0
Chương trình có hai biến là x và y. Thủ tục Thay_doi có một tham số biến z (có từ khóa
Var) và một tham số giá trị w. Bước vào thân chương trình, đầu tiên x và y đều có giá trị
0. Khi gọi thủ tục Thay_doi(x,y), tham số biến z được thay bởi biến x. Điều này có nghĩa
8
Thành Viên Tuổi Học Trò
123doc.org
là mọi thao tác đối với z trong thủ tục bây giờ sẽ xẩy ra đối với x, cụ thể là lệnh gán z:=1
sẽ gán 1 cho biến x. Còn khi thay tham số giá trị w bởi biến y trong lời gọi Thay_doi(x,y)
thì giá trị của biến y được sao chép sang cho biến w. Tức là w có giá trị 0 (vì y có giá trị
0). Khi bước vào thân thủ tục không có một liên quan nào nữa giữa biến y và biến w, vì
vậy lệnh gán w:=1 không ảnh hưởng gì đến giá trị của y (giá trị của y vẫn là 0). Như vậy
giá trị của x được in ra là 1, còn của y là 0.
Trong mọi thủ tục có thể đưa vào các tham số hình thức được đặt sau tên thủ tục và
trong cặp dấu ngoặc tròn. Có hai loại tham số hình thức: Tham số giá trị và tham số
biến. Các tham số có từ khóa Var đứng trước là tham số biến, còn không có từ khóa Var
đứng trước là tham số giá trị. Các tham số cùng kiểu và cùng loại ngăn cách nhau bởi

dấu phẩy, còn các nhóm tham số khác kiểu hoặc khác loại được ngăn cách nhau bởi dấu
chấm phẩy. Mỗi tham số phải được khai báo một kiểu dữ liệu. Khi cần tham số ghi giữ
lại những biến đổi trong thủ tục thì tham số phải được khai báo là tham số biến.
Ví dụ: Xét đầu thủ tục
Procedure Beta(Var a,b:Real;c,d:Real;i,j:Integer);
Trong thủ tục trên a và b là các tham số biến có kiểu thực, c và d là các tham số giá trị có
kiểu thực, i và j là các tham số giá trị có kiểu nguyên.
Trong lời gọi thủ tục, các tham số giá trị được thay thế bởi giá trị các biểu thức cùng
kiểu (trường hợp riêng của biểu thức là hằng và biến), các tham số biến chỉ được phép
thay thế các biến cùng kiểu; sự thay thế phải theo đúng trật tự các tham số đã khai báo
trong đầu thủ tục.
Ví dụ: Xét đầu thủ tục
Procedure Gama(Var x:Integer; y:Integer);
Với a là biến nguyên, khi đó các lời gọi sau là hợp lệ
Gama(a,2);
Gama(a,3*a+5);
Còn lời gọi Gama(a+3,1); là sai vì tham số biến x không thể được thay thế bởi các biểu
thức a+3.
Chú ý:
Khi khai báo kiểu dữ liệu của các tham số, không được khai báo trực tiếp mà phải
thông qua tên kiểu.
Ví dụ: Không được viết: Procedure Delta(x:Array[1 10] of Integer);
Muốn khai báo tham số x có kiểu mảng như ở trên ta phải xác định trước kiểu Mang
Type Mang=Array[1 10] Of Integer;
Rồi sau đó mới viết
Procedure Delta(x:Mang);
3. Cách viết và sử dụng hàm
- Việc thực hiện hàm luôn cho một giá trị kết quả thuộc kiểu xác định và giá trị đó
được gán cho tên hàm. Kiểu của hàm phải được khai báo trong đầu của hàm.
Ví dụ 8: Chương trình giản ước một phân số có sử dụng hàm tính ước chung lớn nhất

Procedure Vidu8;
Var
9
Thành Viên Tuổi Học Trò
123doc.org
Tu,mau,a:Integer;
Function Ucln(x,y:Integer):Integer; {Bắt đầu hàm Ucln}
Var
Du:Integer;
Begin
While y<>0 do
Begin
Du:=x mod y;
x:=y;
y:=Du;
End;
Ucln:=x;
End; {Hết hàm Ucln}
BEGIN
Readln(tu,mau);
A:=Ucln(tu,mau);
If a>1 then
Begin
Tu:=Tu Div a;
Mau:=Mau Div a;
End;
Writeln(Tu:5,Mau:5);
END.
Cách viết một hàm:
Trong chương trình trên, hàm Ucln được mô tả bắt đầu bởi đầu của hàm:

Function Ucln(x,y:Integer):Integer;
Đầu của hàm luôn bắt đầu bởi từ khóa Function, sau đó đến tên của hàm. Sau tên của
hàm có thể có tham số hình thức. Chẳng hạn, hàm Ucln có hai tham số hình thức x và y.
Hàm phải luôn luôn thuộc một kiểu dữ liệu xác định và phải chỉ ra tên kiểu của hàm ngay
trong đầu hàm.
Cách viết đầu hàm:
Function Tên _hàm(Danh_sách_tham_số:Tên_kiểu_tham_số):Tên_kiểu_của_hàm;
Chú ý rằng kiểu kết quả của hàm (kiểu của hàm) chỉ có thể là các kiểu: Integer, Real,
Char, Boolean, String.
Ngoài đầu của hàm, hàm có cấu trúc hoàn toàn giống như thủ tục. Một điều quan trọng là
trong thân của hàm phải có ít nhất một câu lệnh gán để gán giá trị cho tên hàm
Tên_hàm:=Biểu thức;
Vế phải của lệnh gán trên là một biểu thức xác định giá trị của hàm. Chẳng hạn trong
hàm Ucln ở ví dụ trên có câu lệnh gán Ucln:=x;
Cách sử dụng hàm:
Sử dụng hàm khác với sử dụng thủ tục ở điểm sau: Lời gọi thủ tục đứng riêng tạo thành
câu lệnh (câu lệnh gọi thủ tục). Còn lời gọi hàm không bao giờ đứng riêng một mình mà
10
Thành Viên Tuổi Học Trò
123doc.org
chỉ có thể nằm trong một biểu thức nào đó. Trong chương trình trên, câu lệnh có lời gọi
hàm chính là câu lệnh gán (hàm xuất hiện trong biểu thức bên phải của câu lệnh):
a:=Ucln(tu,mau). Vế phải câu lệnh gán này là lời gọi hàm Ucln(tu,mau); chương trình
tính ước chung lớn nhất của tu và mau để gán cho biến a. Lời gọi hàm có thể là thành
phần của các biểu thức. Chẳng hạn có thể viết: 5*Ucln(12,8)+3
4. Biến cục bộ và biến toàn bộ
Ngoài các tham số, có thể khai báo các biến được sử dụng trong chương trình con.
Các biến được khai báo trong chương trình con nào chỉ có tác dụng trong chương trình
con đó, ngoài ra nó không xác định và do vậy không ảnh hưởng tới bất kỳ nơi nào khác
trong chương trình. Vì vậy các biến này được gọi là các biến cục bộ. Các biến được khai

báo trong phần khai báo của chương trình được sử dụng trong toàn bộ chương trình, kể cả
trong các chương trình con có trong chương trình. Do đó các biến này được gọi là các
biến toàn bộ.
Ví dụ 9: Chương trình giản ước phân số
Program Vidu9;
Uses Crt;
Var
tu,mau:Integer;
Procedure Gups;
Var
x,y,du:Integer;
Begin
x:=tu;
y:=mau;
While y<>0 Do
Begin
du:=x Mod y;
x:=y;
y:=du;
End;
If x>1 Then
Begin
tu:=tu Div x;
mau:= mau Div x
End;
End;
BEGIN
Clrscr;
Write(‘Nhap tu so và mau so cua phan so: ‘);
Readln(tu,mau);

Gups;
Writeln(‘Phan so sau khi gian uoc la: ‘,tu,’/’,mau);
11
Thành Viên Tuổi Học Trò
123doc.org
Readln;
END.
Trong chương trình trên, phần khai báo của chương trình có chứa khai báo biến:
Var tu,mau:Integer;
Các biến tu (tuso), mau (mauso) là các biến toàn bộ. Hai biến này được sử dụng trong
toàn bộ chương trình, kể cả trong thủ tục Gups. Trong thủ tục Gups có chứa khai báo:
Var x,y,du:Integer;
Các biến x,y,du là các biến cục bộ, chúng chỉ được sử dụng trong thủ tục Gups. Thủ
tục Gups thực hiện công việc sau: Đầu tiên các biến x, y nhận các giá trị của tu và mau
(các lệnh gán x:=tu; y:=mau). Vòng lặp While sẽ tính ước chung lớn nhất cua tu và mau
dùng để giản ước. Chương trình nhận các giá trị tu và mau từ bàn phím, sau đó gọi thủ
tục Gups, rồi in các giá trị của tu và mau sau khi gian uoc.
Sự thay đổi của bộ nhớ trong quá trình thực hiện chương trình được minh họa như
sau:
du
y
x
mau mau mau
Tu tu tu
Hình a) Hình b) Hình c)
Hình a) biểu diễn không gian nhớ để thực hiện chương trình trước khi gọi thủ tục: Không
gian nhớ cấp phát cho các biến toàn bộ tu và mau.
Hình b) biểu diễn không gian nhớ trong thời gian thực hiện chương trình: Không gian
nhớ cấp phát cho các biến cục bộ x, y, du.
Hình c) biểu diễn không gian nhớ sau khi thủ tục đã được thực hiện.

Như vậy các biến cục bộ chỉ tồn tại trong thời gian thực hiện thủ tục.
Để thấy rõ sự khác nhau giữa biến cục bộ và biến toàn cục, xét hai chương trình qua
hai ví dụ sau đây:
Ví dụ 10:
Program Vidu10;
Var
x:Intger;
Procedure Thay_doi;
Begin
x:=1;
End;
BEGIN
x:=0;
Thay_doi;
Writeln(x);
END.
12
Thành Viên Tuổi Học Trò
123doc.org
Chương trình này chỉ có một biến x – nó là biến toàn bộ. Trong chương trình chính,
đầu tiên x có giá trị bằng 0 (lệnh gán x:=0). Chương trình gọi thủ tục Thay_doi làm thay
đổi giá trị của x thành 1 và giá trị này được in ra bởi lệnh cuối cùng trong chương trình.
Ví dụ 11:
Program Vidu11;
Var
x:Intger;
Procedure Thay_doi;
Var
x:Integer;
Begin

x:=1;
End;
BEGIN
x:=0;
Thay_doi;
Writeln(x);
END.
Chương trình có hai biến cùng có tên x, nhưng một biến là biến toàn bộ, còn một biến
khác (được khai báo trong thủ tục) là biến cục bộ. Khi thực hiện chương trình, giá trị của
x được in ra là 0 hay 1? Đầu tiên lệnh gán x:=0 xác lập giá trị của biến toàn bộ x là 0. Thủ
tục Thay_doi xác lập giá trị của biến cục bộ x là 1 (lệnh gán x:=1 bên trong thủ tục). Biến
toàn bộ không chịu sự thay đổi nào cả, giá trị của nó vẫn là 0 và giá trị này được in ra.
Khái quát:
- Sử dụng chương trình con (thủ tục và hàm) sẽ thuận lợi cho việc viết, kiểm tra và tổ
chức chương trình.
- Cấu trúc chương trình con tương tự như cấu trúc chương trình: có đầu chương trình
con (Procedure, Function), có phần khai báo và phần câu lệnh.
- Chương trình con có thể có tham số hình thức khi khai báo và tham số thực sự (khi
gọi). Khai báo tham số biến dùng từ khóa Var. Tham số thực sự của tham số giá trị có
thể là hằng, giá trị của biến hoặc biểu thức. Tham số thực sự của tham số biến chỉ có thể
là biến.
- Gọi thủ tục (hàm) bằng tên của thủ tục (hàm).
- Biến được khai báo trong chương trình con là biến cục bộ. Biến được khai báo ở
chương trình chính là biến toàn bộ.

V. Một số câu lệnh kết thúc sớm vòng lặp hoặc chương trình
1. Lệnh nhảy không điều kiện (Goto): là câu lệnh nhảy không điều kiện, cho phép
nhảy từ bất kì nơi nào bên trong chương trình hay chương trình con đến vị trí đã đánh dấu
bằng nhãn. Nhãn là một tên, như tên biến hoặc là một số nguyên, sử dụng như sau:
Cú pháp: Goto nhãn;

13
Thành Viên Tuổi Học Trò
123doc.org
Cách thực hiện:
1) Khai báo nhãn: phải khai báo nhãn tại phần đầu khai báo (xem cấu trúc chung một
chương trình Pascal) theo cú pháp: label nhãn1, nhãn2, …, nhãnN;
2) Đánh dấu đích: Trong thân chương trình vị trí đích sẽ nhảy đến bằng lệnh Goto cần
đánh dấu trước, theo cú pháp sau:
nhãn: các_câu_lệnh_đích;
3) Viết câu lệnh: Goto nhãn;
* Chú ý với lệnh nhảy vô điều kiện Goto:
- Có thể nhảy từ trong vòng lặp ra ngoài,
- Không cho phép nhảy từ ngoài vào trong vòng lặp, từ ngoài vào trong chương trình
con.
- Nên hạn chế dùng câu lệnh nhảy vô điều kiện Goto vì nó phá vỡ tính cấu trúc của câu
lệnh điều khiển, khó theo dõi.
Ví dụ 12: Viết chương trình nhập vào một số nguyên n, in ra màn hình số chính phương
lớn nhất mà nhỏ hơn n.
Program Vidu12;
Uses Crt;
Label In_ket_qua;
Var k,i:integer;
Begin
Clrscr;
Write('Nhap so can kiem tra :');
Readln(k);
For i:=k Downto 1 Do
If frac(sqrt(i)) = 0 Then
Goto in_ket_qua;
In_ket_qua: Writeln(' So chinh phuong do la : ',i);

Readln;
end.
2. Lệnh chấm dứt sớm vòng lặp (Break): là câu lệnh có tác dụng chấm dứt giữa chừng
một vòng lặp dù chưa kết thúc.
Cú pháp: Break;
Ví dụ 13: Xét lại ví dụ trên nhưng sử dụng câu lệnh Break
Program Vidu13;
Var k,i:integer;
Begin
Write('Nhap so can kiem tra :');Readln(k);
14
Thành Viên Tuổi Học Trò
123doc.org
For i:=k Downto 1 Do
If frac(sqrt(i)) = 0 Then
Begin
Writeln(' So chinh phuong do la : ',i);
Break;
End;
Readln;
End.
Chú ý:
- Lệnh Break cho phép thoát khỏi mọi kiểu vòng lặp For, While Do hay Repeat
Until.
- Nếu có nhiều vòng lặp lồng nhau thì câu lệnh Break cho phép thoát khỏi vòng lặp
bên trong nhất chứa nó. Các vòng lặp bên ngoài vẫn hoạt động bình thường.
3. Lệnh thoát khỏi chương trình con (Exit): là lệnh kết thúc và thoát khỏi chương
trình.
Cú pháp: Exit;
Sự thực hiện câu lệnh như sau:

- Nếu câu lệnh ở bên trong chương trình con thì sẽ chấm dứt chương trình con (mặc
dù chưa đến câu lệnh cuối) và trở về chương trình bên ngoài đã gọi chương trình con đó.
- Nếu câu lệnh ở trong chương trình chính (không ở trong chương trình con nào cả)
thì lệnh này chấm dứt chương trình chính và dừng lại.
Chú ý: Câu lệnh Exit chỉ nên sử dụng trong các chương trình con.
Ví dụ 14: Chương trình nhập vào số k, kiểm tra số k có phải là số nguyên tố hay không?
Program Vidu14;
Var k,i:integer;
Function lsnt(k:integer):boolean;
Var i:integer;
Begin
lsnt:=true;
For i:=2 to k-1 do
if k mod i = 0 then
Begin
lsnt:=false;
exit;
End;
End;
Begin
15
Thành Viên Tuổi Học Trò
123doc.org
Write('Nhap so can kiem tra :');readln(k);
If lsnt(k) then writeln(k,' la so nguyen to')
Else writeln(k,' khong la so nguyen to');
Readln;
End.
4. Lệnh dừng chương trình bất thường (Halt): là lệnh dừng chương trình chính. Lệnh
này được sử dụng khi xảy ra lỗi, sai sót nghiêm trọng, việc tiếp tục chương trình là không

có ý nghĩa.
Cú pháp: Halt;
Ví dụ 15:
Program Vidu15;
Var f,x,y:real;
Begin
Writeln(' Nhap x = ');
Readln(x);
Writeln(' Nhap y = ');
Readln(y);
If y <>0 then f:=x/y
Else halt; {Chuong trinh se dung lai ngay khi thay y =0}
Writeln(' f = ',f:8:3);
Readln;
End.
VI. Vào ra dữ liệu kiểu tệp văn bản
Khai báo: Var Biến_kiểu_tệp:Text;
Đọc tệp:
Assign(Biến_kiểu_tệp,Tên_tệp);
Reset(Biến_kiểu_tệp);
Read(Biến_kiểu_tệp, );
Readln(Biến_kiểu_tệp, );
Ghi tệp:
Assign(Biến_kiểu_tệp,Tên_tệp);
Rewrite(Biến_kiểu_tệp);
Write(Biến_kiểu_tệp, );
Writeln(Biến_kiểu_tệp, );
Đóng tệp:
Close(Biến_kiểu_tệp);
16

Thành Viên Tuổi Học Trò
123doc.org
Ví dụ 16:
Dữ liệu vào là tệp văn bản SN.INP có cấu trúc:
- Dòng đầu tiên ghi số nguyên dương N.
- Dòng tiếp theo ghi không quá N (1 ≤ N ≤ 128) số nguyên của dãy số A. Các số
ghi cách nhau ít nhất là một ký tự trống.
Dữ liệu ra là tệp văn bản SN.OUT ghi một số duy nhất là tổng các số của dãy số A.
Program Vidu16;
Uses Crt;
Const
Nmax=128;
fi=’SN.INP’;
fo=’SN.OUT’;
Var
i,N:Integer;
S:LongInt;
A:Array[1 Nmax] of Integer;
f:Text;
Procedure Doctep;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:=1 to N do
Read(f,A[i]);
Close(f);
End;
Procedure Xuly;
Begin

S:=0;
For i:=1 to N do
S:=S+A[i];
End;
Procedure Ghitep;
Begin
Assign(f,fo);
Rewrite(f);
Writeln(f,S);
17
Thành Viên Tuổi Học Trò
123doc.org
Close(f);
End;
BEGIN
Doctep;
Xuly;
Ghitep;
END.
Ví dụ 17
Học sinh một trường THCS tổ chức cắm trại. Sơ đồ các trại được lưu trong một tệp văn
bản trai.inp theo hình tam giác bởi 1, 3, 5, dấu ‘*’. Các trại không dính nhau. Tệp văn
bản trai.inp có số dòng không han chế, mỗi dòng có không quá 128 ký tự. Hãy đếm xem
có bao nhiêu trại.
Dữ liệu ra là tệp văn bản trai.out ghi một số duy nhất là số lượng trại đếm được.
Tệp trai.inp Tệp trai.out
*
*** *
***** ***
*

3
Program Camtrai;
Uses Crt;
Const
Nmax=130;
fi='trai.inp';
fo='trai.out';
BL=' ';
Var
f:Text;
dem:Longint;
x,y:String;
Procedure Xuly;
Var
i:Integer;
Begin
dem:=0;
x:=BL;
For i:=1 to Nmax-1 do
x:=x+BL;
18
Thành Viên Tuổi Học Trò
123doc.org
Assign(f,fi);
Reset(f);
While not Eof(f) do
Begin
Readln(f,y);
y:=BL+y+BL;
For i:=2 to length(y)-1 do

If (y[i]='*') and (y[i-1]=BL) and (y[i+1]=BL) and (x[i]=BL)
then Inc(dem);
x:=y;
For i:=length(y)+1 to Nmax do
x:=x+BL;
End;
Close(f);
End;
Procedure Ghitep;
Begin
Assign(f,fo);
Rewrite(f);
Write(f,dem);
Close(f);
End;
BEGIN
Clrscr;
Xuly;
Ghitep;
END.

THUẬT TOÁN
I. Khái niệm
Bài toán được cấu thành bởi hai thành phần cơ bản: Input và Output.
Input: Các thông tin đã có.
Output: Các thông tin cần tìm từ Input.
Thuất toán để giải một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một
trình tự xác định sao cho sau khi thực hiện dãy thao tác ấy, từ Input của bài toán ta nhận
được Output cần tìm.
Ví dụ: Tìm giá trị lớn nhất của một dãy số nguyên

- Xác định bài toán:
Input: Số nguyên dương N và dãy N số nguyên a
1
, a
2
, , a
N
.
Output: Giá trị lớn nhất của dãy số.
19
Thành Viên Tuổi Học Trò
123doc.org
- Ý tưởng:
Khởi tạo giá trị Max=a
1
.
Lần lượt với i từ 2 đến N, so sánh giá trị số hạng a
i
với giá trị Max, nếu a
i
> Max thì Max
nhận giá trị mới là a
i
.
- Thuật toán:
B1: Nhập N và dãy số a
1
, a
2
, , a

N
;
B2: Max <- a
1
, i <- 2;
B3: Nếu i>N thì đưa ra giá trị Max rồi kêt thúc;
B4: Nếu a
i
> Max thì Max <- a
i
.
i <- i+1 rồi quay lại B3;
Mô tả thuật toán qua ngôn ngữ lập trình Pascal:

Max:=a[1];
For i:=2 to N do
If a[i] > Max Then Max:=a[i];
Writeln(‘Gia tri lon nhat can tim la: ’,Max);
Readln;
II. Sắp xếp dữ liệu
1. Khái niệm
Sắp xếp là một quá trình tổ chức lại một dãy các dữ liệu theo một tự nhất định.
Mục đích của việc sắp xếp là nhắm giúp cho việc tìm kiếm dữ liệu được dễ dàng và
nhanh chóng.
2. Thuật toán sắp xếp bằng tráo đổi
2.1 Bài toán:
Input: Dãy A gồm N số nguyên a
1
, a
2

, , a
N
.
Output: Dãy A được sắp xếp lại thành dãy không gỉảm (không tăng).
2.2 Ý tưởng: Với mỗi cặp số hạng đứng liền kề trong dãy, nếu số trước lớn hơn số sau ta
đổi chổ chúng cho nhau. Việc đó lặp đi lặp lại cho đến khi không có sự đổi chổ nào xảy
ra nữa.
2.3 Thuật toán:
B1: Nhập N và dãy số a
1
, a
2
, , a
N
;
B2: M <- N;
B3: Nếu M < 2 thì đưa ra dãy A đã được sắp xếp rồi kết thúc.
B4: M <- M-1, i <- 0;
B5: i <- i+1;
B6: Nếu i > M thì quay lại B3;
B7: Nếu a
i
> a
i+1
thì tráo đổi a
i
và a
i+1
cho nhau;
B8: Quay lại B5.

Mô tả thuật toán qua ngôn ngữ lập trình Pascal:
For i:=1 to N-1
For j:=i+1 to N do
20
Thành Viên Tuổi Học Trò
123doc.org
If a[i] > a[j] then
Begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
End;
III. Tìm kiếm dữ liệu
1. Khái niệm:
Bài toán tìm kiếm dữ liệu là bài toán đặt ra vấn đề cần tìm một đối tượng cụ thể nào đó
trong tập hợp các đối tượng cho trước.
2. Thuật toán tìm kiếm tuần tự:
2.1 Bài toán:
Input: Dãy A gồm N số nguyên a
1
, a
2
, , a
N
và số nguyên k.
Output: Chỉ số i mà a
i
= k hoặc thông báo không có số hạng của dãy A có giá trị bằng k.
Số nguyên k được gọi là khoá tìm kiếm.
2.2 Ý tưởng:

Tìm kiếm tuần tự được thực hiện một cách tự nhiên. Lần lượt từ số hạng thứ nhất, ta so
sánh giá trị số hạng đang xét với khoá k cho đến khi gặp một số hạng bằng khoá k hoặc
dãy A đã được xét hết và không có giá trị nào bằng khoá k.
2.3 Thuật toán:
B1: Nhập N và dãy số a
1
, a
2
, , a
N
và khoá k;
B2: i <- 1;
B3: Nếu a
i
= k thì thông báo chỉ số i rồi kết thúc;
B4: i <- i+1;
B5: Nếu i>N thì thông báo dãy A không có số hạng nào có giá trị bằng k rồi kết thúc;
B6: Quay lại B3.
Mô tả thuật toán qua ngôn ngữ lập trình Pascal:
i:=1;
While (i<N) and (a[i] <> k) do Inc(i);
If i>N then Writeln(‘Khong co so hang nao co gia tri bang ‘,k)
Else Writeln(‘So hang thu ‘,i,’ co gia tri bang ‘,k);
3. Thuật toán tìm kiếm nhị phân
IV. Thuật toán Đệ quy
Ví dụ1: Tính giai thừa của một số tự nhiên biết rằng:
- 1!=1
- N!=N*(N-1)!
Thuật toán:
Thuật toán được mô tả với trường hợp N=4:

4!=4*3! -> Để tính 4! ta phải tính 3!
3!=3*2! -> Để tính 3! ta phải tính 2!
21
Thành Viên Tuổi Học Trò
123doc.org
2!=2*1! -> Để tính 2! ta phải tính 1!
1!=1, thay vào ta có:
2!=2*1!=2*1=2
3!=3*2!=3*2=6
4!=4*3!=4*6=24
Program Giaithua;
Uses Crt;
Var
N:Word;
ch:Char;
Function GT(v:Word):Longint;
Begin
If v=1 then GT:=1
Else
GT:=v*GT(v-1);
End;
BEGIN
Repeat
Repeat
Clrscr;
Write('Nhap so N:');
Readln(N);
Until (N>=1) and (N<=16);
Writeln('Giai thua cua ',N,' la:',GT(N));
ch:=Readkey;

Until ch=#27;
END.
Phân tích chương trình: Xét với N=4
Khi có lệnh gọi hàm GT(4) thì máy sẽ ghi nhớ là:
GT(4):=4*GT(3) và đi tính GT(3).
Kế tiếp máy ghi nhớ GT(3):=3*GT(2) và đi tính GT(2).
Kế tiếp máy ghi nhớ GT(2):=2*GT(1) và đi tính GT(1).
Theo định nghĩa thì GT(1)=1.
Máy sẽ quay ngược để tính giá trị: GT(2):=2*1=2.
Rồi tiếp tục quay ngược để tính giá trị: GT(3):=3*2=6.
Rồi tiếp tục quay ngược để tính giá trị: GT(4):=4*6=24.
Kết quả trả về là 4!=24.
Ví dụ 2: Tính lũy thừa nguyên của một số nguyên T (tính T
n
)
Program Luythua;
Uses Crt;
Var
22
Thành Viên Tuổi Học Trò
123doc.org
T,N:Integer;
ch:Char;
Function LT(u,v:Integer):Longint;
Begin
If v=0 then LT:=1
Else
LT:=u*LT(u,v-1);
End;
BEGIN

Repeat
Clrscr;
Write('Nhap so T:');
Readln(T);
Write('Nhap so N:');
Readln(N);
Writeln('Luy thua ',N,' cua so ',T,' la:',LT(T,N));
ch:=Readkey;
Until ch=#27;
END.
Ví dụ 3: Tìm ước chung lớn nhất của hai số nguyên.
Thuật toán: UCLN(a,b)=UCLN(b,a Mod b)
Program UCLN;
Uses Crt;
Var
a,b:Integer;
Function USC(m,n:Integer):Integer;
Var
r:Integer;
Begin
r:= m Mod n;
If r=0 then USC:=n
Else
USC:=USC(n,r);
End;
BEGIN
Clrscr;
Write('Nhap so a:');
Readln(a);
Write('Nhap so b:');

Readln(b);
Writeln('Uoc so chung lon nhat cua 2 so a, b la:',USC(a,b));
Readln;
23
Thành Viên Tuổi Học Trò
123doc.org
END.
Ví dụ 4: In các chữ số của một số theo thứ tự ngược lại.
Ví dụ với số 2013 thì kết quả in ra là 3102
Program Daochuso;
Uses Crt;
Const
fi='so.inp';
fo='so.out';
Var
n:Integer;
Procedure Daoso(conso:Integer);
Begin
Write(conso mod 10:1);
If (conso div 10) <>0 then
daoso(conso div 10);
End;
BEGIN
Clrscr;
Write('Nhap so:');
Readln(n);
Daoso(n);
END.
24

×