PDA

View Full Version : Hướng dẫn Cách sử dụng chương trình con trong pascal



nguyenvanquan7826
07-16-2012, 10:48 PM
Chào các bạn! Có rất nhiều bạn học Pascal đến phần chương trình con thì thấy khó hiểu nên hôm nay mình viết bài này nhằm hướng dẫn các bạn cách sử dụng chương trình con trong Pascal một cách đơn giản nhất. (Mở rộng ra ta có thể áp dụng cho các ngôn ngữ khác). Bài viết còn sơ sài mong các bạn góp ý để bài viết hoàn thiện hơn. :salute:.

CHƯƠNG TRÌNH CON


I. Khái niệm về chương trình con (Sub-program)

Trong khi lập trình chúng ta thường gặp những chương trình lặp đi lặp lại nhiều lần ở các chỗ khác nhau. Để tránh rườm rà những đoạn chương trình này thường được thay thế bổi các chương trình con tương ứng. Khi cần ta chỉ cần gọi tên chương trình con đó ra.
Lý do thứ 2 để xây dựng chương trình con là trong một chương trình lớn và phức tạp dẫn đến một chương trình lớn và rất dài. Do đó việc sửa chữa chương trình sẽ rất khó khăn. Ta sẽ phân tích nó thành các vấn đề nhỏ hơn, dễ kiểm tra và cuối cùng ta chỉ cần ghép nó lại thành chương trình lớn hoàn thiện.
II. PROCEDURE và FUNCTION (Thủ tục và Hàm)

Trong Pascal có 2 loại chương trình con (CTC):
- PROCEDURE (Thủ tục)
- FUNCTION (hàm)
Sự khác nhau cơ bản và duy nhất của hai loại CTC này là FUNCTION trả về một giá trị kết quả vô hướng thông qua tên function và do đó nó có thể dử dụng như một biến, hằng, biểu thức. Còn PROCEDURE thì không trả về kết quả nào nên nó cũng không được vết trong biểu thức.
VD : Các PROCEDURE cơ bản trong Pascal
- Writeln
- Readln
_ Textcolor
Các FUNCTION cơ bản:
- Sin(x) : Trả về giá trị kiểu real
- Chr(i) : trả về giá trị kiểu char
III. Cấu trúc của một chương trình con


{Phần khai báo của chương trình chính}
VAR .....
CONST ....
{Chương trình con}
PROCEDURE Tên_thủ_tục (Khai báo các tham số nếu cần): kiểu dữ liệu;
{Phần khai báo chương trình con}
BEGIN
.....
END;
FUNCTION Tên_hàm(Khai báo các tham số nếu cần): kiểu dữ liệu;
{Phần khai báo chương trình con}
BEGIN
.....
END;
{Chương trình chính}
BEGIN
.....
END.


IV. Truyền tham số cho chương trình con
Có 2 cách truyền tham số:
- Tham trị (value parameter)
- Tham biến (variable parameter)
VD : PROCEDURE Thidu(i,j:integer; VAR x,y:real);
Tham trị : i,j
Tham biến: x,y
Sù khác nhau giữa Tham trị và Tham biến:
- Tham trị có thể là hằng, biến, biểu thức. còn tham biến chỉ có thể là biến.
- Nếu Tham trị là biến thì giá trị của nó sẽ không thay đổi khi CTC thực hiện. Còn tham biến sẽ thay đổi giá trị nếu trong CTC có lệnh thay đổi nó.
VD :
* Hàm SIN (X)
Trong này X là tham trị và ta có thể viết:
- KQ := SIN (1); X=1
- KQ := SIN (Y*2); X=Y*2
- KQ := SIN (X); X=X
Và sau khi thực hiện giá trị của X không thay đổi
* Hàm DEC (X)
Trong này X là tham biến và ta có thể viết:
- DEC (X); X là biến kiểu nguyên
Không được viết:
- DEC (5); X là hằng.
- DEC (Y*2); X là biểu thức.
Sau khi gọi hàm thì giá trị của X sẽ thay đổi (giảm đi)

V. FUNCTION và cách dùng

Trong FUNCTION bắt buộc phải có lệnh gán giá trị cho tên hàm. Tên_hàm:=<Biểu_thức>
Chúng ta chỉ nên dùng FUNCTION khi và chỉ khi nó đồng thời thỏa mãn các điều kiện sau:
- Nếu ta muốn nhận lại 1 và chỉ 1 kết quả
- Kết quả đó phải là kiểu vô hướng
Còn nếu không thỏa mãn thì chúng ta nên dùng PROCEDURE
VD : CTC tính bình phương của một số:

FUNCTION Binh_Phuong (X:real):real;
BEGIN
Binh_Phuong := X*X;
END;
Nếu dùng procedure

PROCEDUR Binh_Phuong (X:Real; VAR kq:real);
BEGIN
kq := X*X;
END;
Khi kiểm tra xem tổng bình phương của a và b có bằng c không:
- Nếu là FUNCTION ta viết:

IF Binh_Phuong(a)+Binh_Phuong(b) = Binh_phuong(c) THEN…
- Nếu là PROCEDURE ta viết:

Binh_Phuong (a,kqa);
Binh_Phuong (b,kqb);
Binh_Phuong (c,kqc);
IF kqa+kqb=kqc THEN…
Rõ ràng dùng FUNCTION có lợi hơn nhiều.
VI. Biến toàn cục và biến cục bộ

1. Biến toàn cục:
Là các biền được khai báo trong chương trình chính. Các biến này đều có tác dụng ở mọi nơi trong chương trinh.
2. Biến cục bộ
Là các biến được khai báo trong chương trình con. Các biến này chỉ có tác dụng trong chương trình con đó. Khi chương trình con kết thúc các biến này cũng mất tác dụng theo.
3. Chú ý:
Nếu trong chương trình con có khai báo biến (hằng) trùng với tên biến (hằng) trong chương trình chính thì chương trình con sẽ ưu tiên sử lí trên biến (hằng) trong chương trình con. Và khi thoát khỏi chương trình con đó, giá trị của biến trong chương trình vẫn giữ nguyên giá trị trước khi gọi CTC.
VD :

CONST I=5;
PROCEDURE THU;
VAR I : INTEGER;
BEGIN
I := 6;Writeln(I);
END;
BEGIN
Writeln(I);THU;Writeln(I);
END.
Màn hình sẽ xuất hiện:
5 (Giá trị biến toàn cục)
6 (Giá trị biến địa phương)
5 (Giá trị biến toàn cục)
VII. Tính đệ quy của chương trình con

Trong PROCEDURE và FUNCTION có thể có lời gọi chính nó. Tính chất này gọi là đệ quy.
VD : Tính N! qua định nghĩa:
N! = 1.2.3...(n-1).n
Hoặc định nghĩa theo đệ quy:
N! = 1 khi N=0
= (n-1)!.n khi N>=1

Khi đó hàm GIAI_THUA có thể định nghĩa như sau:

FUNCTION GIAI_THUA (n:integer):integer;
BEGIN
IF n=0 THEN GIAI_THUA := 1 ELSE GIAI_THUA := n*GIAI_THUA(n-1);
END;


Các bạn có thể tham khảo các tài liệu sau đêtr nắm rõ hơn về hàm và thủ tục:
Một số bài tập về chương trình con trong pascal. (http://vietsource.net/forum/vsnet.php?url=http://www.mediafire.com/view/?epsqwigt9dy25zq)
Một số lỗi khi sử dùng hàm và thủ tục trong pascal (http://vietsource.net/forum/vsnet.php?url=http://www.mediafire.com/?ualuxmr4uh6a88s)

bui trung tuan
08-01-2013, 10:27 AM
Tại III: Cấu trúc của một chương trình con - có viết:
PROCEDURE Tên_thủ_tục (Khai báo các tham số nếu cần): kiểu dữ liệu;
Tác giả vui lòng coi lại câu này. Procedure không trả về giá trị, tại sao sau khi khai báo các tham số lại khai báo kiểu dữ liệu của Procedure?

---------- Post added at 10:27 AM ---------- Previous post was at 10:23 AM ----------

Bài Cách viết và sử dụng chương trình con trong sách giáo khoa tin học lớp 11 giải thích về tham biến và tham trị theo tôi là không chính xác. Không biết Thầy thấy sao, theo tôi
Tham biến là tham số hình thức mà khi gọi chương trình con thì tham số thực sự tương ứng với nó phải là 1 biến, và nếu có sự thay đổi giá trị của biến này trong chương trình con thì giá trị của biến đó được giữ lại khi chấm dứt chương trình con. Tham biến được khai báo với từ khoá var
Tham trị là tham số hình thức mà khi gọi chương trình con thì tham số thực sự tương ứng của nó có thể là một biến hoặc một giá trị cụ thể, và nếu giá trị của tham số thực sự dạng biến có thay đổi giá trị trong chương trình con thì giá trị này không được giữ lại khi chương trình con kết thúc.
(có thể sử dụng hai ví dụ của sách giáo khoa trang 99 và 100 để minh hoạ 2 định nghĩa này)

nguyenvanquan7826
08-01-2013, 12:08 PM
Tại III: Cấu trúc của một chương trình con - có viết:
PROCEDURE Tên_thủ_tục (Khai báo các tham số nếu cần): kiểu dữ liệu;
Tác giả vui lòng coi lại câu này. Procedure không trả về giá trị, tại sao sau khi khai báo các tham số lại khai báo kiểu dữ liệu của Procedure?

---------- Post added at 10:27 AM ---------- Previous post was at 10:23 AM ----------

Bài Cách viết và sử dụng chương trình con trong sách giáo khoa tin học lớp 11 giải thích về tham biến và tham trị theo tôi là không chính xác. Không biết Thầy thấy sao, theo tôi
Tham biến là tham số hình thức mà khi gọi chương trình con thì tham số thực sự tương ứng với nó phải là 1 biến, và nếu có sự thay đổi giá trị của biến này trong chương trình con thì giá trị của biến đó được giữ lại khi chấm dứt chương trình con. Tham biến được khai báo với từ khoá var
Tham trị là tham số hình thức mà khi gọi chương trình con thì tham số thực sự tương ứng của nó có thể là một biến hoặc một giá trị cụ thể, và nếu giá trị của tham số thực sự dạng biến có thay đổi giá trị trong chương trình con thì giá trị này không được giữ lại khi chương trình con kết thúc.
(có thể sử dụng hai ví dụ của sách giáo khoa trang 99 và 100 để minh hoạ 2 định nghĩa này)


Trước hết xin cảm ơn bạn đã quan tâm và đóng góp ý kiến cho bài viết của mình cũng như cho diễn đàn. :)

Tại mục III mình viết chung cho "chương trình con" vì vậy phải viết cả kiểu trả về của nó, với từng TH cụ thể (proceduce hay function thì bên trên mục 2 đã nói rồi). :)

Trong sách giáo khoa viết thế nào vậy bạn? Còn suy nghĩ của bạn về tham biến và tham trị như trên là đúng rồi.

bui trung tuan
08-04-2013, 09:30 AM
Trước hết xin cảm ơn bạn đã quan tâm và đóng góp ý kiến cho bài viết của mình cũng như cho diễn đàn. :)

Tại mục III mình viết chung cho "chương trình con" vì vậy phải viết cả kiểu trả về của nó, với từng TH cụ thể (proceduce hay function thì bên trên mục 2 đã nói rồi). :)

Trong sách giáo khoa viết thế nào vậy bạn? Còn suy nghĩ của bạn về tham biến và tham trị như trên là đúng rồi.

Xin lỗi vì tưởng bạn là Giáo viên dạy tin THPH nên không trích dẫn Sách giáo khoa (SGK) lớp 11.
Nội dung bài Cách viết và sử dụng chương trình con của SGK khá dài, xin trích những chỗ quan trọng.
SGK đưa ra chương trình cho phép vẽ các hình chữ nhật, trong đó
có 1 chương trình con được khai báo như sau:
Procedure Ve_Hcn(chdai, chrong:integer);
...
Trong chương trình chính có các lệnh gọi:
Ve_Hcn(25, 10);
....
a:=4; b:=2;
for i:=1 to 4 do
begin
Ve_Hcn(a,b); readln; clrscr;
a:=a*2 ; b:=b*2;
end;
Tiếp đó là
"Trong lệnh gọi thủ tục, các tham số hình thức được thay bằng các tham số thực
sự tương ứng là các giá trị cụ thể được gọi là các tham số giá trị (gọi tắt là tham trị).
Các tham số chdai, chrong của thủ tục Ve_Hcn là tham trị. trong lệnh gọi thủ tục
Ve_Hcn(5, 3) tham số chdai được thay bởi số nguyên 5, tham số chrong được thay bởi
số nguyên 3.
Còn trong lời gọi thủ tục Ve_Hcn(a,b) vẽ hình chữ nhật kích thước a x b, tham số chdai
được thay bởi giá trị hiện thờ của biến a, tham số chrong được thay bởi giá trị hiện thời
của biến b.
Trong lời gọi thủ tục, các tham số hình thức được thay bằng các tham số thực
sự tương ứng là các tên biến chứa dữ liệu ra được gọi là các tham số biến (gọi tắt là tham biến).
Để phân biệt tham biến và tham trị, Pascal sử dụng từ khoá var để khai báo những tham
số biến".

Mặc dù sau đó, SGK có đưa ra 2 ví dụ để cho thấy sự khác nhau khi chương trình con
sử dụng tham trị hoặc tham biến, nhưng dù sao cũng không thể hiểu được cách định nghĩa
về tham biến của SGK như đã trích ở trên

nguyenvanquan7826
08-04-2013, 07:50 PM
Cảm ơn bạn, mình đã đọc rất kỹ đoạn trích trong SGK mà bạn đưa lên, tuy nhiên mình vẫn chưa thấy điểm vô lý hoặc mập mờ ở chỗ nào cả?
Liệu có phải bạn thấy mập mờ ở đoạn này:
"Trong lời gọi thủ tục, các tham số hình thức được thay bằng các tham số thực
sự tương ứng là các tên biến chứa dữ liệu ra được gọi là các tham số biến (gọi tắt là tham biến).
Để phân biệt tham biến và tham trị, Pascal sử dụng từ khoá var để khai báo những tham
số biến".