Chương 9
Chương trình con:
Thủ tục và hàm
(Procedure và Function)
Chương trình con ln ln được dùng,
rất phổ biến và là một kiến thức căn bản.
Vì vậy cần nắm vững để vận dụng ở mọi
nơi, mọi lúc.
9.1
Khái niệm về chương trình con
Các đoạn c/t được lặp đi lặp lại thường
được lập sẵn để trong thư viện CTC.
Chia thư viện thành các nhóm (UNIT)
Tác dụng: Chia ra các modun nhỏ để dễ
phát triển, để dễ 'trị'.
Có 2 loại CTC:
Procedure Thủ tục
Function Hàm
9.2
Function
là CTC trả lại một giá trị kết quả
qua tên của nó và do đó nó được sử dụng trong các
biểu thức.
y:=sin(x) + sqrt(x).
x là tham số
Procedure không trả lại kết quả qua tên của
Procedure.
- Không thể gọi Procedure trong biểu thức.
- Nó có thể dùng như một câu lệnh độc lập.
Readln(x); Writeln(x). x là tham số
9.3
PROCEDURE Tên_Thủ_Tục(Các tham số);
hoặc
FUNCTION Tên_Hàm(Các tham số):kiểu_dữ_liệu;
Label
Const
Type
Var
...
Begin
...
End;
...
...
...
(* của riêng Procedure, nếu cần *)
(* Thân chương trình con *)
9.4
USES CRT;
Var
A, B, C, D : integer;
Z: real;
Procedure Tieu_de;
Begin
End;
Procedure Enter(Var X, Y: integer);
Begin
End;
Function Chia(X, Y: integer): real;
Begin
End;
Begin
Tieu_de;
Enter(A, B);
Enter(C, D);
Z := Chia (A, B)*Chia(C, D);
Writeln('Ti so (A/B)*(C/D) la : ', Z);
Write(' Hay an Enter de tiep tuc !'); Readln;
End.
9.5
Program VIDU;
USES CRT;
(* CRT là một UNIT chứa
các CTC về màn hình, bàn phím .... *)
Var
A, B, C, D : integer;
Z: real;
(*------------------------------------*)
Procedure Tieu_de;
Begin
writeln('*****************************');
writeln('* MINH HOA CHUONG TRINH CON *');
writeln('*****************************')
End;
9.6
(*------------------------------------*)
Procedure Enter(Var X, Y: integer);
Var OK : Char;
Begin
Repeat
Write('Tu so = '); Readln(X);
Write('Mau so = '); Readln(Y);
Write(' Co sua so lieu khong (Co/Khong) ?');
OK := ReadKey;
Writeln;
until (OK='K') or (OK='k');
End;
9.7
(*------------------------------------*)
Function Chia(X, Y: integer): real;
Begin
If Y <> 0 then Chia := X / Y
Else
Begin
Writeln(#7,'Khong chia đuoc mau so = 0.');
Halt; { Thủ tục Halt dừng chương trình
lại }
End;
End;
Bài tập: Tính Z = (A/B)/(C/D)
9.8
Tham biến ? tham trị
Các tham số đóng vai trò cung cấp "tư liệu đầu
vào" sẽ là các tham số giá trị. Khi ra khỏi CTC,
giá trị của tham trị khơng thay đổi so với lúc
vào. Ví như mượn vật mẫu.
Tham số là các kết quả muốn thu lại được sau
CTC: chắc chắn phải khai báo là tham biến
(xem tham số trong thủ tục tính x2 ở ví dụ
trên). Ví như mượn xà phịng tắm.
9.9
Program Tham_so;
Var
a, b: integer;
(*--------------------------------------------*)
Procedure Thidu_Thamso(x:integer; Var y:integer);
Begin
x:=x+1;
y:=y+1;
writeln(x:6, y:6);
End;
(*--------------------------------------------*)
Begin
a:=0;
b:=3;
Writeln(a:6, b:6);
0
3
Thidu_Thamso(a, b);
1
4
Writeln(a:6, b:6);
0
4
End.
9.10
Procedure ? Function
Chương trình con là Function khi và chỉ khi
thỏa mãn đồng thời ba yêu cầu sau:
Nếu ta muốn nhận lại 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ỏ (sẽ học sau).
Có cần dùng tên CTC chứa kết quả để viết
trong các biểu thức không ?
9.11
2
2
c=a +b
FUNCTION BINH_PHUONG (X: real): REAL;
Begin
BINH_PHUONG := X*X;
End;
c:= BINH_PHUONG(a)+ BINH_PHUONG(b);
PROCEDURE BINH_PHUONG(X:Real; VAR X2: REAL);
Begin
X2 := X*X;
End;
BINH_PHUONG(a, z); C:=z;
9.12
BINH_PHUONG(b, z); C:=C+z;
Biến toàn cục và biến địa phương.
Khái niệm tầm tác dụng
Thí dụ 9.3
PROGRAM TAM_TAC_DUNG;
Var
I: integer;
(* biến I tồn cục *)
(*---------------------*)
Procedure DIA_PHUONG;
Var I: integer;
(* biến I địa phương *)
Begin
....
I := 7; Writeln(I:6);
End;
5 giá trị của I toàn cục
(*---------------------*)
7 giá trị của I địa phương
Begin
5 giá trị của I toàn cục
I:=5;
Writeln(I:6);
DIA_PHUONG; Writeln(I:6);
9.13
End.
Bài tập tại lớp
3. Viết CTC tính n!
Sau đó hãy lập chương trình hồn chỉnh để tính
k
Cn
n!
k!(n k)!
9.14
Tính đệ qui của CTC
CTC có thể gọi lại chính nó !
Tính n!=1.2.3....n
n ngun dương
FUNCTION GIAI_THUA(n: integer):integer;
Begin
If n=0 then GIAI_THUA := 1
else GIAI_THUA := n*GIAI_THUA(n-1);
End;
9.15
Cọc 1
Cọc 2
Cọc 3
Tháp Hà nội
Hãy di chuyển chồng đĩa từ cọc 1 sang cọc 2 với
điều kiện
Mỗi lần chỉ chuyển một đĩa
Có thể chuyển từ cọc này sang cọc khác
Đĩa bé bao giờ cũng phải nằm trên đĩa lớn
Với 64 đĩa, mỗi lần 1 giây, mất 58 tỉ năm 9.16
PROGRAM THAP_HA_NOI;
Var N: integer;
Procedure DICH_CHUYEN(N, C1, C2,
Begin
If N=1 Then Writeln(C1, ' ->
else
Begin
DICH_CHUYEN(N-1, C1, C3,
DICH_CHUYEN( 1, C1, C2,
DICH_CHUYEN(N-1, C3, C2,
End;
End;
Begin
Write(' N = '); Readln(N);
DICH_CHUYEN(N, 1, 2, 3);
End.
C3:integer);
', C2)
C2);
C3);
C1);
9.17
Bài tập về tính đệ qui
4. Tạo dãy số Fibonacci
Dãy số Fibonacci là dãy số F1, F2, F3, .... Fn
được tạo ra với cơng thức:
Fn=Fn-1 + Fn-2
Với F1=1, F2=1. Thí dụ: 1, 1, 2, 3, 5, 8, 13, 21
Hãy lập chương trình dùng chương trình con đệ
qui để tạo ra dãy số đó.
5. Đảo chữ số.
Viết chương trình đảo các chữ số của một số. Yêu
cầu sử dụng chương trình con đệ qui. Thí dụ
Đọc vào một số: 12345
Đảo số in ra:
54321
9.18
Đơn vị chương trình
Thư viện CTC được chia thành nhóm thư viện
nhỏ, được gọi là UNIT
CRT
PRINTER
DOS
SYSTEM
xử lí màn hình ( GOTOXY, ClrScr...) ...
các thủ tục in như Writeln (Lst, ....).
khai thác các hàm của DOS.
các CTC về hệ thống.
Các UNIT trên nằm trong file TURBO.TPL (TPL:
Turbo Pascal Library) nên sẽ khơng có các tệp như
CRT.TPU, SYSTEM.TPU...
GRAPH
UNIT về đồ hoạ, GRAPH.TPU.
Tham khảo 'Turbo PASCAL, cẩm nang tra cứu'
9.19
Chương trình của bạn đã q lớn, có nhiều CTC
đã hồn chỉnh, khơng phải dịch đi dịch lại nên
nhóm các CTC lại thành UNIT theo nhóm chức
năng. Thí dụ (nên tra cứu tài liệu):
EDIT.PAS, Primary file, tệp chính
K.PAS, UNIT chứa các CTC khi ấn Ctrl_K
Q.PAS, UNIT chứa các CTC khi ấn Ctrl_Q
O.PAS, UNIT chứa các CTC khi ấn Ctrl_O
KEYBOARD.PAS, UNIT chứa CTC bàn phím
Khi dịch các UNIT này sẽ nhận được *.TPU
(Turbo PASCAL Unit).
Dịch CT chính (Primary file) EDIT.PAS sẽ cho tệp
EXE sau khi kết nối các modun, UNIT lại với nhau.
9.20
Soạn thảo (Editor)
KHOI1.PAS
Primary file
KHOI2.PAS
VIDU1.PAS
TEST.ASM
Dịch (Compile)
KHOI1.TPU
KHOI2.TPU
TEST.OBJ
Kết nối (Link)
+
VIDU1.EXE
9.21
Một số CTC thông dụng
Procedure GotoXY(XPos, YPos); [CRT Unit]
Procedure ClrScr;
[CRT Unit]
Procedure ClrEol;
[CRT Unit]
Procedure Delay(Time);
Procedure Sound(F) và Procedure NoSound;
Function KeyPressed: Boolean
[CRT Unit]
Function ReadKey: Char;
[CRT Unit]
Function Frac(X): real;
Function Int(X): integer;
Function Random: real;
Function Random(Number): real;
Procedure Randomize;
Function UpCase(ch);
9.22
Thí dụ 9.9
PROMGRAM xReadKey
Uses Crt;
Var
ch: Char;
Begin
Writeln('Hiển thị các giá trị mã kí tự ASCII');
Writeln('ấn ESC để kết thúc.')
Writeln;
Repeat
Writeln('kí tự ?');
ch := ReadKey;
Writeln(ch,': giá trị mã ASCII =', Ord(ch));
Until ch= CHR(27)
End.
9.23