Tham số được sử dụng trong lời gọi chương trình con dạng thủ tục hoặc hàm được gọi là gì

8.4. Truyền tham số cho chương trình con

8.4.1. Vai trò của tham số


- Các tham số hình thức trong phần khai báo tiêu đề chương trình con là công cụ để chương trình con giao tiếp với môi trường bên ngoài. Khi thực hiện chương trình con các tham số được dùng để gửi các giá trị vào để chương trình xử lý.

- Các tên tham số khai báo được dùng trong chương trình con như tên biến địa phương đã được khai báo, vì thế không được khai báo các biến riêng của chương trình con trùng với tên các tham số của nó.

- Điểm khác biệt giữa tham số và biến riêng của chương trình con là khi bắt đầu tham gia câu lệnh, các tham số chỉ có tên chứ chưa có giá trị như các biến. Chỉ khi xuất hiện lời gọi chương trình con thì các tham số mới được truyền giá trị từ bên ngoài vào và chương trình con sẽ được thực hiện với bộ giá trị đó. Cũng vì lý do đó mà chúng được gọi là tham số hình thức.

- Khi gọi chương trình con, các tham số hình thức có thể nhận bất cứ một tên biến nào khác với tên hình thức đã khai báo, chỉ cần giá trị của những tên này là tương thích kiểu với kiểu của tham số tương ứng.

- Các tên bên ngoài được truyền vào chương trình con được gọi là tham số thực vì chúng thực sự tham gia chương trình con với tư cách là một giá trị.

- Khi thực hiện lời gọi chương trình con, các tham số được truyền vào cần đảm bảo rằng việc truyền là tương ứng một-một về cả kiểu dữ liệu và thứ tự.

- Các tham số thực sự được truyền cho các tham số hình thức khi có lời gọi CTC theo hai phương thức sau:


  • truyền theo tham trị,

  • truyền theo tham biến.

8.4.2. Truyền theo tham trị


Các tham trị hay các tham số thực sự truyền cho các tham số hình thức theo phương hướng truyền tham trị được khai báo:

:

Đối với các tham trị khi có lời gọi chương trình con, hệ thống sẽ cấp phát một vùng nhớ khác và sao giá trị của tham số thực sự vào đó. Chương trình con thao tác với tham số hình thức tương ứng sẽ thực hiện với dữ liệu trên bản sao này và không ảnh hưởng đến tham số thực sự.

Như vậy khi kết thúc chương trình con các bản sao bị xóa đi và giá trị của tham thực sự là giữ nguyên như trước khi truyền vào chương trình.

Việc truyền theo tham trị có những đăc điểm sau:

- Giá trị của biến được truyền theo tham trị ở đầu vào sẽ không bị thay đổi sau lời gọi chương trình con.

- Tốn thêm bộ nhớ khi thực hiện chương trình con do tạo bản sao.

- Khi gọi chương trình con cho phép giá trị ở đầu vào có thể là những giá trị của hằng, biến, hàm hoặc biểu thức.

Ví dụ 8.6:


Program vidu_8_6;

Var t,k: integer;


Procedure test[t,k: integer];
Begin

k:=k+5;


t:=t+5;

End;


Begin

k:=5; t:=5;

writeln[‘k=‘,k,’ va t=‘,t];

test[i,k];

writeln[‘k=‘,k,’ va t=‘,t];

readln;


End.


{Khai báo 2 biến t, k là hai biến toàn chương trình chính.}

{Khai báo tham số hình thức của chương trình con: t, k đều là tham trị.}
{In ra giá trị k = 5 và t = 5}

{Lời gọi thủ tục test}

{In ra màn hình k = 5 và t = 5}

8.4.3. Truyền theo tham biến


Các tham biến được khai báo trong tiêu đề của chương trình con.

Var :;

Đối với các tham biến, chương trình con thao tác với các tham số thực sự sẽ được thực hiện trực tiếp với dữ liệu trên chính bộ nhớ của tham số thực sự nên khi kết thúc chương trình con thì giá trị của tham số thực sự chính là giá trị đã được chương trình con thay đổi.

Truyền theo tham biến có những đặc điểm sau:

- Giá trị của biến được truyền theo tham biến ở đầu vào sẽ bị thay đổi sau lời gọi chương trình con.

- Không tốn thêm bộ nhớ khi thực hiện chương trình con do không tạo bản sao.

- Khi gọi chương trình con giá trị ở đầu vào chỉ có thể là biến.



Ví dụ 8.7:

Program vidu_8_7;

Var t,k: integer;

{Khai báo biến của chương trình chính: 2 biến t, k là hai biến toàn chương trình chính.}

Procedure test[k:integer; var t: integer];



{Khai báo biến hình thức của chương trình con:

k là tham trị, t là tham biến.}

Begin


k:=k+5;

t:=t+5;


End;

Begin


k:=5; t:=5;

writeln[‘k = ‘,k,’ va t = ‘,t];{In ra giá trị k=5 và t=5}

test[i,k]; {Lời gọi thủ tục test}

writeln[‘k = ‘,k,’ va t = ‘,t];{In ra màn hình k=5 và t=10}

readln;

End.
Khi nào thì nên dùng tham biến?

- Nếu cần thay đổi giá trị thực sự theo quản lý của chương trình con

- Tránh sao lưu dữ liệu lớn.


Ví dụ 8.8: Viết chương trình hoán vị giá trị của hai biến a, b.
Program vidu_8_8;

Var a,b: real;

Procedure hoanvi[var a,b: real]; {a, b là tham biến}

Var tg: real;

Begin

tg:=a;


a:=b;

b:=tg;


End;

Begin


Write[‘ nhap hai so a, b: ’];readln[a,b];

Writeln[‘Hai so truoc hoan vi la: ’, a:8:2, b:8:2];

Hoanvi[a,b];

Writeln[‘Hai so sau hoan vi la: ’, a:8:2, b:8:2];

Readln;

End.
Trong ví dụ trên nếu khai báo tham số hình thức a, b ở đầu chương trình con là tham trị thì sẽ không thể hoán đổi giá trị của hai biến đó cho nhau.


8.5. Tính đệ qui của chương trình con

8.5.1. Khái niệm về đệ qui


Các chương trình mà chúng ta đã xem xét đều có chung cấu trúc dạng chương trình gọi các chương trình con khác dưới dạng mô hình phân cấp. Tuy nhiên đối với một số bài toán, việc dùng chương trình con gọi ngay chính nó rất hữu dụng. Có thể định nghĩa chương trình con đệ qui là chương trình con sẽ gọi đến chính nó trực tiếp hay gián tiếp thông qua các chương trình con khác.

Cách tiến hành giải một bài toán đệ qui nhìn chung có những điểm chung sau: Trước tiên gọi chương trình con đệ qui để giải bài toán, chương trình con đệ qui thực ra chỉ biết cách giải bài toán trong trường hợp đơn giản nhất [hay còn gọi là trường hợp cơ sở]. Nếu chương trình con đệ qui được gọi trong trường hợp cơ sở, chương trình con chỉ cần đơn giản trả lại kết quả. Nếu chương trình con được gọi trong các trường hợp phức tạp hơn, chương trình con đệ qui sẽ chia công việc cần giải quyết thành hai phần. Một phần hàm biết cách giải quyết như thế nào, còn phần kia vẫn không biết cách giải quyết như thế nào tuy nhiên để được gọi là có khả năng đệ qui, phần sau phải giống với bài toán ban đầu nhưng đơn giản hơn hay nhỏ hơn bài toán ban đầu. Bởi vì bài toán mới giống với bài toán ban đầu nên chương trình con sẽ thực hiện gọi chính nó để giải quyết công việc đơn giản hơn này - đây chính là lời gọi đệ qui hay còn gọi là một bước đệ qui. Để đảm bảo việc đệ qui có kết thúc, mỗi một lần gọi đệ qui thì bài toán phải đảm bảo đơn giản hơn và các bước đệ qui này còn thực hiện tiếp cho đến khi nào bài toán đơn giản dần, đơn giản tới mức trở thành trường hợp cơ sở. Có thể nhận thấy hàm đệ qui xử lý trường hợp cơ sở để trả lại kết quả tính được cho các chương trình con mức phức tạp hơn, rồi đến lượt các chương trình con này lại tính trả lại kết quả cho các chương trình con phức tạp hơn nữa ... cứ như vậy cho đến lời gọi chương trình con ban đầu.



Каталог: images
images -> Hướng dẫn sử dụng Dropbox Để sử dụng được Dropbox
images -> BÀi thuyết trình cách xáC ĐỊnh và chế ĐỘ pháp lý CỦa các vùng biển theo công ưỚc của liên hiệp quốc về luật biển năM 19821
images -> Céng hßa x· héi chñ nghÜa viÖt nam Độc lập tự do hạnh phúc
images -> Lúa gạo Việt Nam Giới thiệu
images -> Trung Tâm kt tc-đl-cl
images -> Số: 105/2008/QĐ-ttg CỘng hòa xã HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
images -> ChuyêN ĐỀ ĐẠi số TỔ HỢP, XÁc suất kiến thức cơ bản Đại số tổ hợp
images -> BỘ giáo dục và ĐÀo tạo trưỜng đẠi học luật tp. HỒ chí minh dưƠng kim thế nguyên thủ TỤc phá SẢn các tổ chức tín dụng theo pháp luật việt nam
images -> Review of Condor, Sun Grid Engine and pbs


tải về 1.67 Mb.


Chia sẻ với bạn bè của bạn:

Giải Bài Tập Tin Học 11 – Bài 18: Ví dụ về cách viết và sử dụng chương trình con giúp HS giải bài tập, giúp cho các em hình thành và phát triển năng lực sử dụng công nghệ thông tin và truyền thông:

Xem thêm các sách tham khảo liên quan:

  • Sách Giáo Viên Tin Học Lớp 11

1. Cách viết và sử dụng thủ tục

a] Cấu trúc của thủ tục

procedure [[danh sách tham số]]; [] Begin [] End;

Phần đầu thủ tục: Gồm tên dành riêng procedure, tiếp theo là tên thủ tục. Danh sách tham số có thể có hoặc không có.

Phần khai báo : Dùng để xác định các hằng, kiểu, biến và cũng có thể xác định các chương trình con khác được sử dụng trong thủ tục.

Dãy câu lệnh : Đực viết giữa cặp tên dành riêng begin và end tạo thành thân của thủ tục.

b] Ví dụ về thủ tục

Ví dụ 1: Viết thủ tục vẽ hình chữ nhật có dạng như sau

******* * * *******

Chiều dài là 7 chiều rộng là 3.

Procedure Ve_Hcn; Begin Writeln[‘*******’]; Writeln[‘* *’]; Writeln[‘*******’]; End;

Để sử dụng thủ tục này ta gọi Ve_Hcn;

Ví dụ 2: Viết thủ tục vẻ hình chữ nhật với chiều dài và chiều rộng được tùy chỉnh.

Procedure Ve_Hcn[chdai,chrong:integer]; Var I,j:integer; Begin For i:=1 to chdai do write[‘*’]; Writeln; For j:=1 to chrong-2 do Begin Write[‘*’]; For i:=1 to chdai-2 do write[‘ ’]; Writeln[‘*’]; End; For i:=1 to chdai do write[‘*’]; End;

Để sử dụng thủ tục này ta gọi Ve_Hcn[a,b];

Khi 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ể gọi là các tham số giá trị [tham trị] [Ví dụ: chdai,chrong được gọi là tham trị].

Khi gọi thủ tục Ve_Hcn[a,b] tham số chdai được thay bằng giá trị hiện thời 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ệ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à tên biến chứa dữ liệu ra được gọi là tham số biến [hay tham biến].

Để phân biệt tham biến và tham trị, Pascal sử dụng từ khóa var để khai báo những tham biến.

Ví dụ :

Nếu không sử dụng tham biến:

program dientro; uses crt; var a,b:integer; procedure hoandoi[x,y:integer]; var TG:integer; begin TG:=x; x:=y; y:=TG; end; begin clrscr; a:=5; b:=10; writeln[a:6,b:6]; hoandoi[a,b]; writeln[a:6,b:6]; readkey; end.

Kết quả:

Hai số không hề hoán đổi cho nhau

Sử dụng tham biến :

program dientro; uses crt; var a,b:integer; procedure hoandoi[var x,y:integer]; var TG:integer; begin TG:=x; x:=y; y:=TG; end; begin clrscr; a:=5; b:=10; writeln[a:6,b:6]; hoandoi[a,b]; writeln[a:6,b:6]; readkey; end.

Kết quả:

Khi nào dùng tham biến: Khi ta muốn thay đổi giá trị các tham số truyền vào thì tra sẽ sử dụng tham biến.

2. Cách viết và sử dụng hàm

Điểm khác nhau cơ bản giữa thủ tục và hàm là việc thực hiện luôn trả về giá trị kết quả thuộc kiểu xác định và giá trị đó được gán cho tên hàm.

Hàm có cấu trúc tương tự như thủ tục, tuy nhiên chỉ khác nhau phần đầu.

Function []:;

Trong đó kiểu dữ liệu chỉ có thể là integer, real, char, Boolean, string.

Khác với thủ tục, trong thân hàm phải có lệnh gán giá trị cho tên hàm:

:=;

Ví dụ 1:

Viết chưng tình thực hiện việc rút gọn một phân số , trong đó có sử dụng hàm tính ước chung lớn nhất của hai số nguyên.

program rutgon; uses crt; var TuSo,MauSo,a:integer; function UCLN[x,y:integer]:integer; var sodu:integer; begin while y0 do begin sodu:=x mod y; x:=y; y:=sodu; end; UCLN:=x; end; begin clrscr; write['Nhap vao tu so va mau so ']; readln[TuSo,MauSo]; a:=UCLN[TuSo,MauSo]; if a>1 then begin TuSo:=TuSo div a; MauSo:=MauSo div a; end; writeln[TuSo:5,MauSo:5]; readkey; end.

Kết quả:

Trong chương trình này, các biến TuSo, MauSo và a là các biến toàn cục, còn biến sodu là biến cục bộ.

Sử dụng hàm

Việc sử dụng hàm tương tự với việc sử dụng các hàm chuẩn, khi viết lệnh gọi gồm tên hàm và tham số thực sự tương ứng với các tham số hình thức.

Lệnh gọi hàm có thể tham gia vào biểu thức như một toán hạng và thậm chí là tham số của lời gọi hàm, thủ tục khác.

Ví dụ:

A:=6*UCLN[TuSo,MauSo]+1;

Ví dụ 2. Viết chương trình tìm giá trị nhỏ nhất trong ba số có sử dụng hàm tìm số nhỏ nhất trong hai số.

Phân tích:

Do chỉ được sử dụng hàm tìm giá trị nhỏ nhất trong hai số. Nên ta sẽ làm như sau:

Đầu tiên sẽ tìm giá trị nhỏ nhất trong 2 số, Sau đó dùng kết quả này làm tham số cho hàm tìm giá trị nhỏ nhất với giá trị này và số còn lại.

program vdu2; uses crt; var a,b,c:real; function Min[a,b:real]:real; begin if a

Chủ Đề