Tìm hiểu chương trình con trong Turbo Pascal

Chương trình là một thành phần cực kì quan trọng các loại ngôn ngữ lập trình và trong Turbo Pascal cũng vậy. Chương trình con mang lại cho bạn rất nhiều lợi ích nhưng để hiểu và sử dụng thành thạo nó thì không phải là dễ. Chính vì vậy mình viết bài này nhằm phân tích cho các bạn hiểu roc hơn về nó.

#Ví dụ thực tế

Hãy tưởng tượng, để có thể làm việc ngoài ruộng chúng ta cần gì??? Đó là máy bừa, máy gieo hạt, máy gặt. Đầu tiên, máy bừa sẽ làm tơi đất, sau đó máy gieo hạt và cuối cùng khi lúa chín thì ta dùng máy gặt để thu hoạch. Bây giờ quay lại với Turbo Pascal, bạn hãy xem chương trình chính có nhiệm vụ thực hiện toàn bộ quá trình trồng lúa. Ở giai đoạn đầu, chương trình chính gọi chương trình con máy bừa để bừa đất, sau đó chương trình chính lại gọi chương trình con máy gieo hạt để gieo hạt và cuối cùng là gọi chương trình con máy gặt để thu hoạch.
Như vậy, chương trình con sẽ thực hiện một phần công việc nào đó thay cho chuong trình chính.

#Bạn đã sử dụng chương trình con trong Turbo Pascal bao giờ chưa???

Nhiều bạn thấy khái niệm "Chương trình con" là mới nên cho rằng họ chưa sử dụng chương trình con bao giờ. Nhưng thực ra bạn sử dụng chương trình con trong mỗi bài tập Pascal mà các bạn đang làm. Readln, read, writeln, write, inc, dec ... là những chương trình con mà bạn hay dùng nhất. Bạn có thắc mắc vì sao mà bạn không viết ra chương trình con đó mà vẫn sử dụng được không? Đó là do những chương trính con đó đã được nhà sáng lập viết sẵn ra rồi, công việc của bạn chỉ là sử dụng. 

#Vì sao bạn phải học viết chương trình con

Như ở đoạn trên mình đã nói, một số chương trình con đã được nhà sáng lập viết sẵn, vậy chúng ta phải học viết chương trình con làm gì cho mệt, cứ cố gắng sử dụng những chương trình con có sẵn là được. Tuy nhiên, các chương trình con có sẵn đó chỉ giải quyết một số vấn đề cơ bản nhất, cần thiết nhất mà bất kì ai cũng cần đến. Còn bạn thì khác, bạn cần viết chương trình con để giải quyết công việc của riêng bạn, phù hợp với đặc thù bài toán của bạn. Cứ tưởng tượng bạn phải viết một chuong trình gì đó dài hàng trăm hoặc hàng nghìn dòng mà bạn cứ chơi chương trình chính hết thì lúc nhìn vào bạn sẽ bi tẩu hỏa ngay. Chưa kể tới việc nâng cấp, sửa lỗi cũng gặp nhiều khó khăn.

#Sự khác nhau giữa hàm và thủ tục

Trong sgk đã nói:
Hàm (function) là chương trình con thực hiện một số thao tác nào đó và trả về đúng một giá trị, giá trị đó được gán vào cho tên của nó. Ví dụ:
sqr(2) sẽ trả về một giá trị là 4, giá trị 4 này được gán vào tên của nó là sqr(2)

Thủ tục (procedure) là một chương trình con thực hiện một số thao tác nhất định và không trả về kết quả nào thông qua tên của nó. Ví dụ:
writeln('Khanh Blog'); sẽ in ra màn hình dòng chữ khanh blog, chẳng có giá trị cụ thể nào trả về qua tên của nó. 

Cũng chính vì điều này mà bạn không thể gán thủ thục cho biến, ví du: a;= writeln('khanh blog'); - như vậy là sai nhé. Nhưng hàm thì ngược lại, vì tên của nó có một giá trị nên bạn hoàn toàn có thể gán nó cho một biến, ví dụ: a:= sqrt(9);

Một điều nữa cũng cần phải lưu ý là hàm có thể xuất hiện trong thủ tục nhưng ngược lại thì không thể được, ví dụ:
writeln(' 2 binh phuong bang ',sqrt(2)); - đây là một câu lệnh đúng.
length(write('khanh blog')); - câu lệnh này sai hoàn toàn.

#Danh sách tham số trong chương trình con

Đây là phần đầu của một thủ tục: Procedure <tên thủ tục> [(<danh sách tham số>)];

Bạn có thể thấy ở phần đầu của một chương trình con thì có thể có hoặc không phần danh sách tham số này là gì? Nó chính một danh sách các tham số lấy từ chương trình chính mà chương trình con yêu cầu, chương trình con sẽ dùng các tham số đó để hoàn thành bài toán và danh sách này gọi là tham số hình thức vì nó chỉ mang tính hình thức thôi.

Có hai loại tham số là : tham số biến (tham biến) và tham số giá trị(tham trị);
Tham số biến là tham số có từ khóa var ở phía trước. Vậy khi nào chúng ta sẽ sử dụng tham biến? Đó là khi tham biến chứa dữ liệu ra.
Tham trị là tham số không có từ khóa var ở phía trước, nó lấy dữ liệu từ chương trình chính vào chương trình con để thực hiện tính toán.

#Gọi chương trình con

Để gọi được chương trình con ta cần nắm được phần đầu của chương trình con. Nếu chương trình con không có danh sách tham số thì ta chỉ cần viết tên của chương trình con - nhớ có dấu chấm phẩy. 
Nếu chương trình con có danh sách tham số thì ta cần phải viết nó ra. ví dụ thủ tục nhập ở dưới:
procedure nhap (var f: arrint; n: integer);
begin
   for i:= 1 to n do
      readln(f[i]);
end;
Giả sử ta muốn nhập cho mảng a gồm g phần nhap(a,g); khi đó a sẽ được xem như là f và g như là n. Chính vậy mới nói danh sách tham số trong chương trình con chỉ là danh sách tham số hình thức. Tương tự, để nhập mảng b gồm h phần tử ta gọi nhap(b,h); ...

#Ví dụ 

Hãy viết một chương trình nhập vào 5 mảng số nguyên khác nhau rồi xuất 5 mảng đó ra màn hình.
Đối với bài này chúng ta không thể sử cách cũ - sử dụng năm vòng lặp for do để nhập rồi lại dùng tiếp 5 vòng lặp for do nữa để xuất mảng ra được. chúng ta sẽ không làm như vậy mà sẽ chỉ viết hai thủ tục, một cái nhập và một cái xuất.
Vì phải nhập một lúc tới 5 mảng nên ta phải viết danh sách tham số ra để cho chương trình con nó biết nó đang nhập cho cái nào.

procedure nhap (var f: arrint; n: integer);
begin
   for i:= 1 to n do
      readln(f[i]);
end;

Chương trình trên sẽ nhập được cho một mảng, ở chương trình chính ta sẽ gọi nó 5 lần để nhập được năm mảng.

Tiếp theo là chương trình con để xuất, tương tự như trên, ta cũng sẽ viết chương trình con để xuất một mảng rồi gọi nó năm lần ở chương trình chính. ở chương trình con này ta sử dụng tham số giá trị vì chúng ta chỉ lấy giá trị vào chương trình con rồi xuất ra màn hình thôi, còn ở chương trình con nhập ta phải sử dụng tham số biến vì giá trị ra - tức là chương trình đọc dữ liệu từ nhập từ bàn phím rồi đưa ra giá trị được gán vào mảng

procedure xuat (f: arrint; n: integer);
begin
   for i:=1 to n do
      write(f[i]);
end;

Bên dưới là chương trình đầy đủ
program vi_du_chuong_trinh_con;
uses crt;
type arrint =array[1..100] of integer;
var a,b,c,d,e : arrint;
i,g,h,k,l,m: integer;

procedure nhap (var f: arrint; n: integer);
begin
   for i:= 1 to n do
      readln(f[i]);
end;

procedure xuat (f: arrint; n: integer);
begin
for i:=1 to n do
write(f[i]);
end;

BEGIN
clrscr;
{nhap mang}
writeln('Nhap do dai mang thu nhat');
readln(g);
nhap(a,g);

writeln('Nhap do dai mang thu hai');
readln(h);
nhap(b,h);

writeln('Nhap do dai mang thu ba');
readln(k);
nhap(c,k);

writeln('Nhap do dai mang thu tu');
readln(l);
nhap(d,l);

writeln('Nhap do dai mang thu nam');
readln(m);
nhap(e,m);
clrscr;
{xuat mang}
xuat(a,g);
readln;
xuat(b,h);
readln;
xuat(c,k);
readln;
xuat(d,l);
readln;
xuat(e,m);
readln;
end.


Comments

  1. Đặt lại giúp anh cái link thành www.duongdoi8x.net nhé. tks :)

    ReplyDelete

Post a Comment



» Vui lòng không spam vì nó sẽ bị xóa ngay sau đó.
» Nếu chèn code hãy mã hóa trước khi chèn vào nhận xét.
» Nếu thủ thuật Blog không áp dụng được thì hãy để lại URL blog để mình tiện kiểm tra.