Phân loại và cấu trúc của chương trình con a Phân loại Trong các NNLT, chương trình con thường gồm 2 loại: -Hàm Function: là chương trình con sau khi thực hiện xong thì nó cho ra một kết
Trang 1Chương VI: CHƯƠNG TRÌNH CON VÀ LẬP TRÌNH CÓ CẤU TRÚC
1 Khái niệm chương trình con (SGK)
Khi lập trình, chúng ta thường có những đoạn chương trình hay phép tính giống nhau và lặp lại nhiều lần.Nếu mỗi lần lặp lại, ta phải viết những đoạn lệnh như nhau thì chương trình ta trở nên dài dòng, rối rắm và mất thời gian vô ích Để giải quyết vấn đề trên, các NNLT cho phép chúng ta tạo các khối nhỏ, mỗi khối là một đoạn chương trình nhỏ đgl chương trình con chương trình con dùng để giải quyết một công việc nào đó Mỗi chương trình con sẽ có tên khác nhau để làm việc Sau cùng thì chương trình chính sẽ được xây dựng từ các chương trình con này.
-Cách lập trình như vậy gọi là lập trình có cấu trúc
VD: xét bài toán tính tổng của bốn luỹ thừa sau:
S = am + bn + cp + dq
Xem: S = S1 + S2 +S3 +S4
-Thông thường để tính được tổng S thì ta phải tính: S1, S2, S3, S4
-Trong đó cách tính S1, S2, S3, S4 tương tự nhau
-Chẳng hạn ta tính S1 = an như sau:
Ta thấy: S1 = am = axaxax……….xa
m lần số a Giả sử: S1 = 24 =2x2x2x2=16
*Sau đây là các câu lệnh chính để tính S1
-Writeln( ‘ nhập hệ số a và luỹ thừa m =? ’ ); Readln( a, m );
S1:=1;
For i:=1 to m do s1:=s1 *a
-*Và đây là chương trình dùng để tính tổng S
-Program tong_luy_thua;
Var a, b, c : real;
m, n, p, q : byte;
S, S1, S2, S3, S4 : Real;
BEGIN
Writeln( ‘ nhap vao cac he so: a, b, c, d =?); Readln( a, b, c, d );
Writeln( ‘ nhap vao cac luy thua: m, n, p, q =? ); Readln( m, n, p, q );
{………Tinh S1……….}
S1:=1;
For i:=1 to m do S1:=S1 *a
{……….Tinh S2……… }
S2:=1;
For i:=1 to n do S2:=S2 *a
{……… Tinh S3……….}
Trang 2For i:=1 to p do S3:=S3 *a
{………Tinh S4……… }
S4:=1;
For i:=1 to q do S4:=S4 *a
{……….Tinh S……….}
S:= S1 +S2 + S3 +S4 ;
Writeln( ‘ tong luy thua S:=’ , S : 4 :2 );
Readln
END
………
-Trong chương trình trên có 4 đoạn lệnh tương tự nhau, việc lặp lại những đoạn lệnh như nhau làm cho chương trình dài, khó theo dõi Ta sẽ xây dựng một chương trình con tổng
quát có tên là: LuyThua Chương trình con này dùng để tính X k
Trong đó hệ số X là biến số thực, luỹ thừa K là biến số nguyên Nội dung của chương trình con này như sau:
-Function LuyThua( x : real ; k : integer ): real;
Var tich : real;
J : byte;
Begin
Tich:=1;
For j:=1 to k do Tich:=tich * x ;
LuyThua := tich;
End;
-Sau này khi nào cần tính: am thì ta chỉ việc viết: LuyThua( a, m );
-Tương tự cho các luỹ thừa: bn , cp , dq
-Vậy ta có tổng luỹ thừa
S:=LuyThua( a, n ) + LuyThua( b, n ) + LuyThua( c, p ) + LuyThua( d, q );
*Lợi ích của việc sử dụng chương trình con:
-Tiết kiệm bộ nhớ
-Không mất thời gian, tránh rối rắm, dễ theo dõi chương trình
-Dễ dàng kiểm tra được tính đúng đắng của các chương trình con, dễ dàng sửa lỗi nếu có sai xót xảy ra
2 Phân loại và cấu trúc của chương trình con
a) Phân loại
Trong các NNLT, chương trình con thường gồm 2 loại:
-Hàm (Function): là chương trình con sau khi thực hiện xong thì nó cho ra một kết quả
thông qua tên của hàm
VD: Các hàm toán học: Sin(x), cos(x), …., sqr( x )
vd: sin( 300 )=1/2
Trang 3*Hàm có thể tham gia vào các biểu thức tính toán.
VD: x*Abs(-2)
-Thủ tục (Procedure): là chương trình con dùng để thực hiện các công việc nào đó và khi
thực hiện xong thì thủ tục không cho ra kết quả thông qua tên của thủ tục (điểm khác cơ bản với hàm)
VD
: Các thủ tục: Writeln(……), Readln(……)
Thủ tục xử lí chuỗi: Delete, Insert,………
b Cấu trúc của chương trình con
1 Phần đầu
2 Phần khai báo
3 Phần thân
*Trong đó:
-Phần đầu của chương trình con chứa: tên chương trình con, các biến số cung cấp dữ liệu vào để chương trình con thực hiện
-Phần khai báo chương trình con: khai báo các biến, hằng mà chương trình con cần dùng -Phần thân chương trình con: là một loạt các câu lệnh được đặt trong cặp từ khoá:
BEGIN
……các lệnh……… ;
END;
VD: chẳng hạn ta xét hàm dùng để tính luỹ thừa :
Function LuyThua( x : real ; k : integer ): real; Phần đầu
Var tich : real;
Begin
Tich:=1;
For j:=1 to k do Tich:=tich * x ; Luythua := tich;
End;
Phần thân
Trang 4*Chú ý:
-Các biến nào được viết trong phần đầu của ctc đgl tham số hình thức (x và k).
-Các biến được viết trong phần khai báo của ctc đgl biến cục bộ (tich, j).
-Chương trình chính không thể sử dụng các biến cục bộ của ctc, nhưng ctc thì được quyền
sử dụng các biến cuả chương trình chính !
-Các biến được khai báo trong chương trình chính đgl biến toàn cục.
-Một ctc có thể có hoặc không có tham số hình thức, biến cục bộ, (còn tuỳ thuộc vào từng chương trình cụ thể)
c) Thực hiện chương trình con
-Để thực hiện ctc, ta cần phải có lệnh gọi nó (tương tự như lệnh gọi các hàm hay thủ tục chuẩn mà ta vẫn hay dùng trước đây)
VD: để thực hiện hàm chuẩn toán học: Sqr(x);
Thì ta có thể gọi nó như sau:
Sqr(4) Hoặc: Sqr( I ) với I:=4;
Hoặc: Sqr(4*I)
-Lúc này tại vị trí các tham số hình thức ta sẽ thay bởi các hằng, biến, biểu thức chứa dữ
liệu vào cụ thể và các hằng và biến này đgl Tham số thực sự.
-Các tham số thực sự phải phù hợp kiểu dữ liệu với tham số hình thức.
-Tóm lại: lời gọi chương trình con gồm có:
-Chương trình con sẽ được thực hiện khi trong chương trình chính có lệnh gọi đến nó -Khi thực hiện ctc xong thì chương trình chính sẽ thực hiện tiếp lệnh theo sau lệnh gọi chưong trình con
-18 CÁCH VIẾT VÀ SỬ DỤNG CHƯƠNG TRÌNH CON
1 Cách viết và sử dụng thủ tục
Tên chương trình con ( Hằng hoặc biến hoặc biểu thức )
Trang 5A Cấu trúc của một thủ tục
-Nếu có nhiều tham số hình thức cùng kiểu thì ta dùng dấu phẩy để ngăn cách Nếu chúng khác kiểu nhau thì ngăn cách bởi dấu chấm phẩy
VD: Procedure tong ( x, y : byte ; s, t: char ; k : real );
-Một chương trình chính có sử dụng chương trình con thì có dạng như sau:
-Phần dành cho chương trình con được đặt ngay sau khai báo biến ( VAR) của chương trình chính
VD1: Cách viết và sử dụng thủ tục không tham số hình thức:
VD2: Cách viết và sử dụng thủ tục có tham số hình thức:
*Nhận xét: Khi có lệnh gọi ctc thì các tham số thực sẽ truyền dl vào cho các tham số hình
thức, còn các tham số hình thức sẽ nhận lấy giá trị trên và đưa vào ctc để tính toán Khi ctc thực hiện xong thì ta có 2 sự chọn lựa:
1. Nếu muốn cho các lệnh của ctc tác động ngược trở lại và làm thay đổi giá trị của tham số hình thức Còn tham số hình thức sẽ nhận lấy giá trị mới này và gửi ngược trở ra cho các tham số thực Cuối cùng các tham số thực sẽ bỏ đi giá trị củ và đón nhận giá trị mới này Để làm được đều đó thì các tham số hình thức đgl các tham số biến (Tham biến) Khi đó trong phần đầu của ctc cần phải có từ khoá VAR trước các tham số biến trên
Phần
đầu
PROCEDURE Tên thủ tục (Danh sách các tham số hình thức : kiểu dữ liệu của chúng) ;
Phần
khai
báo
VAR Các khai báo hằng, biến cục bộ
Phần
thân
BEGIN
………các câu lệnh của thủ tục ;
END ;
1 Phần khai báo của chương trình chính;
2 Phần dành cho chương trình con;
3 Phần thân chương trình chính;
Trang 62. Nếu ko muốn có sự tác động ngược trở lại như trên (tức là các tham số thực và tham
số hình thức vẫn giữ nguyên giá trị củ khi ctc thực hiện xong) Các tham số hình thức đgl tham số giá trị (Tham trị) và trong phần đầu của ctc trước các tham số giá trị ko có từ VAR
VD: Procedure tinhtoan( Var x,y : real ; z : byte );
-Khi tham số thực truyền dl vào cho tham số biến thì ta phải ghi tham số thực ở dạng biến (tham số thực ko thể ghi dưới dạng hằng hay biểu thức) Còn với các tham số giá trị thì các tham số thực truyền vào tự do
VD: một ctc có phần đầu là: Procedure Tong( var x : real ; y : byte ) ;
*Thì các lệnh gọi ctc sau là đúng:
Tong(m , n ) với: m:=5; n:=4;
Tong(m , 4 ) với: m:=5.5;
Tong( m , m*n)
*Các lệnh gọi ctc sau đây là sai:
Tong(5 , 5) Tong(3*m , n) Tong(m , 4.0 )
VD về cách sử dụng tham biến và tham trị:
A Cách viết và sử dụng chương trình con hàm
*Cấu trúc của hàm
VD: Function HoanVi( x, y : real ; z : integer ) : Real ;
-Các tính chất khác của thủ tục vẫn đúng cho hàm
* Đặc biệt: Khi sử dụng hàm thì trong thân hàm phải có một phép gán kết quả sau cùng lại
cho tên hàm (kết quả sau cùng này có thể là biến hoặc biểu thức và phải cùng kiểu với hàm)
VD về cách sử dụng hàm:
Function TênHàm ( Ds các Tsht : Kiểu dl của Tsht ) : kiểu dl của kết quả hàm ; Phần đầu
Var Khai báo hằng, biến dùng riêng cho ctc ;
Phần khai báo Begin
………….các câu lệnh ;
End ;
Phần thân