[Pascal – TUT] Bài 7: Chương trình con
1. Lợi ích của dùng chương trình con(CTC)
– Chương trình có nhiều phân đoạn mỗi phân đoạn thực hiện một chức năng nào đó{ khi đó ta sử dụng ctc để làm các phân đoạn trên}
– Trong chương trình, có những đoạn cần phải lập đi, lập lại nhiều lần ở những chỗ khác nhau. Để tránh phải viết lại các đoạn đó người ta thường phân chương trình ra thành nhiều CTC
– Một tiện lợi khác của việc sử dụng CTC là ta có thể dễ dàng kiểm tra tính đúng đắn của nó trước khi ráp nối vào chương trình chính. Do đó việc xác định sai sót và tiến hành điều chỉnh trong chương trình sẽ thuận lợi hơn.
=> 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: Hàm và Thủ tục. Hàm và thủ tục đều là những CTC, nhưng hàm khác thủ tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên hàm còn thủ tục thì không
2. Khai báo CTC
– Nhắc lại cấu trúc của một chươn trình
PROGRAM Tên_chương_trình; { Tên chương trình} USES ...; {Khai báo thư viện} CONST ...;{Khai báo hằng} TYPE ...;{Khai báo kiểu} VAR ...;{Khai báo biến} Khai báo CTC BEGIN {Chương trình chính} <các lệnh>; END.
Như vậy phần khai báo CTC nằm ở phần cuối của phần khai báo
a. Khai báo và lời gọi hàm
– Khai báo:
FUNCTION <tên hàm>(Danh sách ác tham số):<Kiểu dữ liệu>; [Khai báo Const, Type, Var] BEGIN <các lệnh trong thân hàm>; <tên hàm>:=<Giá trị>; END;
Chú ý luôn có phép gán tên hàm cho giá trị để hàm trả về giá trị khi được gọi
Ví dụ: tính tổng của 2 số x và y
Function tong(x,y:integer):integer; {Do có giá trị trả về} var s:integer; begin s:=x+y; tong:=s; end;
– Lời gọi hàm
<tên hàm>(danh sách các tham số thực);
Ví dụ:
tong(4,5);
b. Khai báo và lời gọi thủ tục
– Khai báo:
PROCEDURE <tên thủ tục>(Danh sách các tham số);{không có giá trị trả về} [Khai báo Const, Type, Var] BEGIN <các câu lệnh>; END;
Ví dụ:
Procedure inso(n:integer); var i:inteher; Begin for i:=1 to n do write(i:5); end;
– Lời gọi thủ tục
<tên thủ tục>(danh sách các tham số thực);
Ví dụ:
inso(6);
3. Biến toàn cục và biến cục bộ
– Biến toàn cục là biến được khai báo trong chương trình chính. Các biến này co thẻ được dùng ở mọi nơi trong chương trình và tồn tại trong suốt thời gian làm việc của chương trình
– Biến cục bộ (biến địa phương) là các biến được khai báo trong CTC. Các biến này chỉ được sử dụng trong phạm vi ctc mà nó được khai báo. Sau khi kết thức ctc các biến này sẽ không còn tồn tại.
Ví dụ:
PROGRAM vidu; Var a,b,c:integer; {3 biến toàn cục} PROCEDURE thutuc(n:integer);{n là biến cục bộ} var i:integer; {i là biến cục bộ} begin for i:=1 to 10 do writeln(i); end; BEGIN a:=5;b:=6;c:=8; thutuc( a); thutuc( b); thutuc( c); readln; END.
– Trong trường họp biến cục bộ trùng tên với biến toàn cục thì máy không bị nhầm lẫn mà sẽ thực hiện trên biến cục bộ. Biến toàn cục không bị ảnh hưởng.
4. Cách truyền tham số trong chương trình con
– CTC không cần có tham số (sau tên ctc) nếu không dùng đến chúng hoặc dùng trực tiếp biến toàn cục
– Khi truyền tham số các tham số trong lời gọi ctc phải đúng thứ tự và kiểu tương ứng với khi khai báo ctc.
Ví dụ:
Procedure inso(a:integer; ch:char); begin {các lệnh của CTC} end;
{gọi} inso(13,'a'); {lời gọi đúng} inso('a',13); {loi goi sai} inso(13);{lời gọi sai}
– Tham số hình thức (đối) là các tham số sau tên hàm và thủ tục trong khai báo.
– Tham số thực sự là các tham số sau tên hàm và thủ tục trong lời gọi.
– Tham biến: là các tham số được khai báo sau từ khóa var. Các tham số thực phải là các biến chứ không được là giá trị. Tham biến có thể được thay đổi trong CTC và sau khi ra khỏi CTC nó vẫn giữ giá trị thay đổi đó.
– Tham trị: là các tham số được khia báo mà không đứng sau từ khóa var. Các tham số thực có thể là các giá trị, hằng, biến. Tham trị có thể thay đổi trong ctc nhưng sau khi kết thúc ctc giá trị của nó trở về như ban đầu.
– Các tham số trong hàm luôn là các tham trị, các tham số trong thủ tục có thể là tham trị hoặc tham biến.
5. Phân biệt cách sử dụng hàm và thủ tục
Hàm khác thủ tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên hàm còn thủ tục thì không.
*Dùng hàm
– Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ).
– Lời gọi CTC cần nằm trong các biểu thức tính toán.
*Dùng thủ tục
– Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả về kiểu dữ liệu có cấu trúc (Array, Record, File)
– Lời gọi CTC không nằm trong các biểu thức tính toán.
Chú ý: Nếu một công việc có thể làm bằng hàm thì chắc chắn sẽ làm được bằng thủ tục {tuy nhiên sẽ phức tạp hơn khi dùng hàm} nhưng một chương trình làm bằng thủ tục thì chưa chắc ta đã làm được bằng hàm.
Đối với Borland Pascal 7.0 ta có thể gọi hàm như gọi một thủ tục. Không nhất thiết phải lấy giá trị trả về. Để thực hiện được điều này trong menu Options >Compiler cần khai báo cú pháp mở rộng (Extended syntax), hoặc trong chương trình cần có dẫn hướng biên dịch {$ X+}. Nếu không, khi biên dịch (gõ F9) Pascal sẽ thông báo lỗi “Error 122: Invalid variable reference”.
6. Tính đệ quy của chương trình con
Một CTC trong Pascal có thể gọi về chính nó. Một lời gọi như thế gọi là một lời gọi đệ quy
Ta xét ví dụ sau:
Nhập vào 1 số n và tính n!
Ta đã biết n! = 1 nếu n =0 trong trường hợp n>=1 ta có n!=n.(n-1)!
Hàm tính n!
function giai_thua(n:integer):longint; begin if n=0 then giai_thua:=1 else giai_thua:=n*giai_thua(n-1); end;
– Lưu ý:
+ Khi sử dụng đệ quy phải có điều kiện kết thúc đệ quy (TH suy biến). Trong ví dụ ta xét điều kiện kết thúc đệ quy chính là n=0. Nếu không có điều kiện kết thúc này chương trình của ta sẽ lặp vô hạn.
+ Luôn có lời gọi đệ quy, trong TH trên là lời gọi giai_thua(n-1);
Bài viết gốc: vietsource.net
Em đang viết 1 chương trình đố vui trắc nghiệm bằng pascal. Nếu chọn không sai thì chương trình sẽ gọi ra thủ tục có câu lệnh write(‘Sai roi ! Tiec qua.’);…. Còn nếu đúng thì ngược lại. Cho em hỏi nếu làm như thế thì phép gọi thủ tục là gì ạ ?
Em cứ viết thủ tục đó rồi gọi.
Ví dụ thủ tục teeb là thongbao thì khi gọi cũng gọi thongbao() rs thôi
Thầy ơi, e cũg muốn làm chương trình trắc nghiệm như v, mà e lại đag bí ko biết bắt đầu từ đâu, thầy gợi ý cho e chút xíu đc ko ạ, e cảm ơn thầy nhiều ạ
Cái này dùng lệnh if else là được.
Thực sự thì e vẫn chưa hình dung đc là nó ntn; mà e muốn cho nó lặp lại thì dùng case….of đúg ko ạ
Muốn lặp lại em phải dùng các vòng lặp.
Thầy có thể hướng dẫn cụ thể cho e đc ko ạ, e bị rối hết rùi ạ, mong thầy giúp đỡ; e cảm ơn ạ
Dùng vòng lặp để cho lặp lại các câu hỏi. Trong mỗi câu hỏi thực hiện việc hiển thị câu hỏi và cho người ta chọn câu trả lời, vậy thôi.
Thầy ơi, e cũg muốn làm chương trình trắc nghiệm như v, mà e lại đag bí ko biết bắt đầu từ đâu, thầy gợi ý cho e chút xíu đc ko ạ, e cảm ơn thầy ạ
cũng hơi lâu rùi mk mới có lớp 8 nên sẽ giao tiếp ằng anh cho tiện : thì anh nên dùng hàm if (điều kiện) then (câu lệnh 1) else (câu lệnh 2);
đưa ra đk đúng thì thực hiện câu lệnh 1 sai thì thực hiện câu lệnh 2;
Em chưa hiểu rõ cái tham số hình thức và tham số cục bộ nó giống và khác nhau như thế nào thầy ạ. Trong sgk viết ko rõ lắm. Theo thầy em hiểu ntn có đúng ko:
VD:
var x: integer;
procedure vidu1( x: integer) ;
………. {code}
thì x được coi là tham số cục bộ vì nó có trong phần khai báo var riêng, tên của nó được sử dụng trực tiếp trong CT
VD:
var x:integer;
procedure vidu2( y: integer);
…… {code}
begin
write(‘Nhap x: ‘); readln(x);
vidu2(x);
thì y được gọi là tham số hình thức vì trong phần khai báo thủ tục có nhưng nó chỉ là đại diện hình thức thay cho các giá trị khác trong phần thân chương trình của thủ tục vidu2
Mong thầy giải thích giúp
Bạn hiểu như thế là dúng rồi.
em đang viết một chương trình mà khi dùng hàm nó không phải là hàm tính tổng hay là một biểu thức mà là kiểm tra điều kiện mà đề bài bắt buộc phải có it nhất một hàm thì làm sao ạ?
ví dụ nó bắt in ra danh sách sinh viên với điều kiện có họ và tên đệm là gì đó thì mình đặt tên hàm ntn và làm ra sao ạ?
Cái này mình ko hiểu mô tả của bạn lắm.
mình chỉ mới làm quen với pascal
mình thấy mấy bài viết này rất bổ ích
nên blog tiếp tục phát triển nhé
mình sẽ thường xuyên theo dỗi dể học thêm kiến thức từ blog ạ
Thầy ơi, các tác giả Hồ Sĩ Đàm, Hồ Cẩm Hà, Trần Đỗ Hùng, Nguyễn Đức Nghĩa, Nguyễn Thanh Tùng, Ngô Ánh Tuyết cho rằng biến cục bộ không chứa tham số hình thức:
var tich: real;
function Luythua(x: real; k: integer): real; {x, k là tham số hình thức}
var j: integer; {j là biến cục bộ}
begin
tich:=1;
for j:=1 to k do tich:=tich*x;
Luythua:=tich;
end;
begin
—–
end.
Đọc sách giáo khoa Tin học lớp 11 (trang 92, 93, 94) rồi đọc bài của Thầy, em phân vân: Không biết theo bên nào?
Mình chưa hiểu câu hỏi của bạn lắm.
Dạ…
Con đã lơ là và không mấy hứng thú với tubol pascal và con đang hứng chịu hậu quả ạ…? kiến thức căn bản hầu như mất hoàn toàn, viết pt với con giờ như một điều xa xỉ
Con nhận ra tác hại trầm trọng của việc này qua bài kiểm tra của mình… giờ con thật sự muốn bắt đầu lại từ đầu ạ
Xin thầy có thể chỉ con nên làm điều gì trước tiên không ạ?( ý của con là nên bắt đầu căn bản lại từ đâu đó ạ?). Dạ, xin thầy giúp đỡ ạ( dạ, xin chú thích thêm là năm nay con học lớp 11 và con muốn đạt điểm trong kì thi cuối học kì … nước đến chân mới nhảy là sai, con biết, nhưng mà nhảy còn hơn là đứng im). Mong sớm nhận được phản hồi
Xin cảm ơn
Chào bạn Mai, thực sự xin lỗi bạn vì đọc được comment của bạn hơi muộn. Không biết giờ này bạn đã thi học kỳ hoặc đã có hướng học tập cho mình về lập trình pascal chưa nhưng mong là kết quả khả quan.
Về việc bạn hỏi nên làm thế nào, học gì trước tiên để đạt điểm cao thì bạn hãy tìm lại sách giáo khoa để tìm những kiến thức căn bản. Đọc nó và nếu chỗ nào không hiểu có thể hỏi thầy cô bạn bè hoặc có thể gủi mail cho mình. Sau đó có thể tham khảo thêm trên mạng (ví dụ như blog của mình về các chương trình cơ bản). Như vậy là tốt nhất cho kỳ thi của bạn.
Còn nếu muốn giỏi hơn về lập trình thì hãy có gắng tìm hiểu sâu hơn, tự nghĩ ra điều mình muốn làm (chẳng hạn làm game rắn săn mồi hoặc một chương trình gì đó), và tìm hiểu dần dần để làm nó. Cứ như thế bạn sẽ tốt lên.
Nếu có bất cứ thắc mắc gì hãy gửi email cho mình nhé.
Chúc bạn sức khỏe và học tập tốt.
Thầy giúp con hướng viết chương trình con để nhập vào 1 xâu và đưa ra 1 xâu thu được từ xâu đó sau khi loại bỏ dấu cách k ạ? Cô cho bài tập mà e k bt hướng làm 🙁
Gợi ý là dùng vòng lặp for, kiểm tra cái nào là dấu cách thì xóa nó đi. 🙂
Var x,y: Integer;
Procedure TT(a,b:Integer);
Var x,y: Integer;
Begin
x:=3; y:=4;
End;
Begin
x:=5; y:=6;
TT(x,y);
Write(x,y);
End.
nhờ thầy giải thích giúp kq
Thủ tục TT với 2 biến x, y như trên thì nó là tham trị, do vậy sau khi ra khỏi thủ tục thì các biến sẽ không giữ được giá trị nếu trong thủ tục có thay đổ. Do vậy kết quả in ra x và y vẫn là 5 và 6
Var x:Integer;
Procedure TINH;
Var x:Integer;
Begin
x:=1; x:=x+12;
End;
Begin x:=10; TINH; Writeln(x); End.
Và kq câu này nữa? tại sao khi khai báo thêm biến trong ctc thì kq lại =10
Khi biến trong chương trình con trùng tên với biến toàn cục thì chương trình con chỉ sử dụng biến của nó mà không động gì đến biến toàn cục. Có nghĩa là biến toàn cục sẽ không được tác dộng gì trong chương trình con.
Thay oi e can gap lam a viet chuong trinh con nhap mang gom 10 so nguyen va in ra man hinh
E cam on
Thầy có thể giúp em Lập chương trình pascal có sử dụng chương trình con để tính tin của một góc bất kỳ , làm như thế nào ạ???
Em đang cần gấp lắm, hãy giúp em vs
thầy ơi em cần viết chương trình tính tống S:=1!+2!+3!+…n! có sử dụng chương trình con. xin thầy giúp
Bạn cần giúp về vấn đề gì? Cách làm, hay gặp lỗi,… ???
dạ cách làm ạ
Bạn có thể viết 1 chương trình con để tính x!, sau đó viết 1 chương trình con tính tổng các giai thừa dựa vào cái x! vừa tính.
Lệnh function và procedure khác nhau ở điểm nào hả thầy?
Bạn đọc mục 5 trong bài viết có ghi rồi nhé.
Thầy ơi em muốn khai báo kiểu xâu trong ctc thì phải khai báo thế nào?
Thì bạn cứ khai báo như bình thường thôi, không khác gì cả.
Thầy ơi cho em hỏi, giá trị trả về ở đây là cái gì vậy ạ.
Tức là sau khi tính xong một cái gì đó, hàm đó trả lại kết quả đó.
Thầy ơi, e đang cần viết 1 ct mà khi cho chạy thì sẽ ra 1 bảng chọn, khi đó nếu em bấm 1 con số nào đó trên bàn phím thì nó sẽ hiện ra 1 ct giải hoặc trả lời. VD ở đây là bảng chọn tính diện tích các hình. nếu bấm số 1 thì nó sẽ tính diện tích 1 hình nào đó, vd như thế này:
Tính diện tích các hình
0. thoát
1. hình tam giác
2. hình chữ nhật
3. hình vuông
4. hình tròn
nếu em bấm số 4 thì nó sẽ tính diện tích hình tròn, tương tự với những cái khác
mong thầy giúp đỡ, em đã thử nhiều cách nhưng chẳng cái nào được cả (mà giờ em đang học lớp 8, em chưa có kinh nghiệm).
Em cảm ơn thầy
Em dùng if then để kiểm tra người ta nhập gì thì mình sẽ thực hiện cái đó là được.
Thầy ơi làm chương trình con xong về chương trình chính không biết khai báo sao từ các chương trình con .Thầy giúp em đc ko ạ111
thì ở chương trình chính em gọi nó ra là được mà.
thầy ơi vậy về phần produce đọc file inp với file out là làm riêng hay chung thầy???
là làm 1 lần produce hay 2 lần produce 1 inp 1 out ạ???
Riêng nhé.
cho hỏi làm cách nào để ấn thanh đứng của bảng mã ASCII trong Pascal z ạ!?
Mình chưa hiểu ý của bạn?
Thầy ơi,giá trị trả về là gì? Giá trị ko trả về là gì vậy thầy?
là sau khi thực hiện, nó đưa lại kết quả có thể lưu vào 1 biến ko. Bạn đọc lại bài một vài lần nhé.
Thầy ơi, khi nào thì nên sử dụng ctc còn khi nào thì ko nên sử dụng vậy thầy