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

Một phần của tài liệu Tập bài giảng tin học đại cương 2 pdf (Trang 114 - 116)

Chương trình con có thể được khai báo mà không dùng tham số khi các chương trình con tính toán trực tiếp với các biến toàn cục hoặc chương trình con không dùng đến bất kỳ biến hay hằng nào.

Việc truyền tham số cho chương trình con là một cơ cấu thay thế tương ứng, nó cho phép một quá trình có thể được lặp đi lặp lại nhiều lần với các “toán hạng” khác nhau.

Danh sách nhóm các tham số hình thức khác kiểu dữ liệu sẽ được đặt cách nhau dấu chấm phảy (;), các tham số có cùng kiểu dữ liệu được đặt cách nhau bằng dấu phảy (,)

Ví dụ: Procedure daoso(i,j: interger; Var x, y: real);

Danh sách các tham số thực sự sẽ phải tương ứng và nhất quán với danh sách các tham số hình thức được khai báo trong tiêu đề của chương trình con.

Có hai cách truyền tham số cho chương trình con là: tham trị (Value parameter) và tham biến (variable parameter).

Truyền tham số bằng biến: tham số hình thức trong phần tiêu đề của chương trình con sẽ được đặt sau từ khóa Var. Với tham biến, các tham số thực sự sẽ phải là biến chứ không được là giá trị. Ví dụ sử dụng Daoso(2, 5, 9, 12.5) sẽ không được chấp nhận vì 9 và 12.5 là hai giá trị chứ không phải là biến. Các tham số thực là các tham biến có thể được thay đổi trong chương trình con và khi ra khỏi chương trình con nó vẫn giữ các giá trị đã được thay đổi đó. Khi khai báo các tham số mà không có từ khóa Var trong một nhóm tham số hình thức thì các tham

115

số của nhóm này là các tham số giá trị. Khi đó, các tham số thực phải là một biểu thức (có thể phép toán, biến...). Tham số hình thức tương ứng sẽ được coi như một biến địa phương của chương trình con, nó nhận giá trị của tham số thực sự là giá trị đầu vào ở thời điểm thay vào chương trình con. Chương trình con sau đó có thể thay đổi giá trị của các tham trị này ở bên trong chương trình con bằng các phép gán, song trong mọi trường hợp điều đó không làm thay đổi giá trị của tham số thực. Do vậy, một tham trị không bao giờ là kết quả tính toán của chương trình con.

Ví dụ minh họa:

Program tham_so; Var a,b: integer;

Procedure truyenthamso(x:integer; var y:integer); Begin x:=x+1; y:=y+1; Writeln(x:6, y:6); End; Begin a:=0; b:=3; truyenthamso(a,b); Writeln(a:6, b:6); End.

Sau khi chạy, chương trình sẽ cho ra kết quả: 1 4

0 4

Trong ví dụ trên, thủ tục Truyenthamso có hai loại tham số: tham trị x và tham biến y. Trước khi gọi thủ tục này với hai tham số thực là a, b tương ứng thì a = 0 và b = 3. Trong thủ tục, có hai lệnh làm thay đổi giá trị của a và b bằng cách tăng lên 1 đơn vị. Lệnh in ra màn hình Writeln(x, y) cho ra kết quả là 1 và 4 tương

116

ứng sau khi tính toán. Tuy nhiên, sau khi chương trình con thoát vì b là tham biến, còn a vẫn giữ nguyên giá trị trước khi gọi thủ tục, tức là a vẫn bằng 0 vì a chỉ là tham trị.

Như vậy, khi truyền một tham số cho chương trình con, nếu muốn bảo vệ giá trị của tham số đó khỏi bị chương trình con thay đổi trong quá trình tính toán thì tham số đó phải được dùng như là tham trị. Còn một tham số nếu muốn dùng để lấy kết quả cho chương trình con đem lại thì tham số đó phải là tham biến.

Đối với việc bố trí bộ nhớ, lời gọi một chương trình con sẽ bố trí bộ nhớ trong vùng ô nhớ ngăn xếp cho các biến địa phương và các tham trị. Các tham trị này cũng đóng vai trò là các biến địa phương. Sau đó, nó sẽ sao chép các giá trị của tham số thực ở bên ngoài chương trình con vào các ô nhớ này. Khi ra khỏi chương trình con, các ô nhớ này cũng được giải phóng. Điều đó giải thích vì sao các tham trị chỉ bị thay đổi bên trong chương trình con, còn các tham số thực sự thì không bị thay đổi sau khi ra khỏi chương trình con. Đối với tham biến, chương trình con sẽ dùng các ô nhớ của chính các biến đó bằng cách dùng con trỏ vào các tham biến. Điều đó cũng có nghĩa là tốc độ truyền tham số của tham biến nhanh hơn của tham trị vì nó không mất thời gian sao chép, nhất là trong trường hợp tham số là kiểu dữ liệu có cấu trúc (ví dụ mảng dữ liệu có số phần tử lớn)

Một phần của tài liệu Tập bài giảng tin học đại cương 2 pdf (Trang 114 - 116)