Trước hết bạn hãy giải bài toán nhỏ này nhá:
Cho trước hai biến số nguyên a và b nào đó: Ví dụ: a = 3 và b = 7.
Lập một chương trình tráo đổi giá trị hai biến đó: để a nhận giá trị của b, còn b nhận giá trị của a.
Thuật toán thì rõ ràng là đơn giản. Tuy nhiên, cũng có bạn chưa biết mần răng. Bởi lẽ không thế gán a cho b và b cho a ngay được.
Điều đó cũng ví như có hai cốc: một cốc đựng bia và cố kia đựng nước amôniac ấy. Muốn tráo đổi hai cốc đó cho nhau ta không đỏ ụp cho nhau được, mà cần mượn một cốc phụ: Lấy bia đổ sang cốc phụ, lấy amôniac đổ sang cốc vừa đựng bia, và lấy cốc phụ đang đựng bia đổ sang cốc vừa đựng amôniac. Làm xong phải trả lại cốc cho nhà hàng.
Trong tin học, có nhiều chương trình sử dụng bộ nhớ tạm thời (RAM), xong việc, không chú ý giải phóng phần bộ nhớ đó, làm cho RAM khả dụng ngày càng ít đi và hậu quả là làm cho máy chạy chậm lại… Thấy vậy, đôi khi bạn hãy nhấp chuột phải vào màn hình, chọn Refresh vài lần để giải phóng những phần nhớ bị chiếm nay không dùng nữa, để máy chạy nhanh hơn!
Nếu lập chương trình trên trực tiếp, không dùng Chương trình con thì mã nguồn có thể như sau:
Uses crt;
Var a,b,c:integer;
Begin
a:=3; b:=7;
writeln(‘Ban dau: a = ‘,a,’ va b = ‘,b);
c:=a; a:=b; b:=c;
writeln(‘Bay gio: a = ‘,a,’ va b = ‘,b); readln;
end.
Còn nếu cần Chương trình con dạng Thủ tục thì mã nguồn bạn hãy thử làm như sau:
Uses crt;
Var a,b:integer;
Procedure DoiCho(x,y:integer); {x và y đều là Tham trị}
Var z:integer;
Begin
z:=x; x:=y; y:=z;
End;
Begin
a:=3; b:=7;
writeln(‘Ban dau: a = ‘,a,’ va b = ‘,b);
DoiCho(a,b);
writeln(‘Bay gio: a = ‘,a,’ va b = ‘,b); readln;
end.
Kết quả chạy chương trình:
Ban dau: a = 3 va b = 7
Bay gio: a = 3 va b = 7.
Không tin, bạn mở Turbo Pascal, gõ vào chạy thử mà xem!
Sở dĩ như vậy vì khi khai báo Thủ tục DoiCho bạn đã không có chữ var ở trước x,y:integer. Điều đó có nghĩa rằng x,y là các Tham trị, và khi gọi DoiCho(a,b); thì các Tham số thực sự sẽ nhận giá trị cũ trước khi thực hiện các câu lệnh theo Thủ tục! Chương trình đũng phải là:
Uses crt;
Var a,b:integer;
Procedure DoiCho(var x,y:integer); {Cả x và y đều là Tham biến}
Var z:integer;
Begin
z:=x; x:=y; y:=z;
End;
Begin
a:=3; b:=7;
writeln(‘Ban dau: a = ‘,a,’ va b = ‘,b);
DoiCho(a,b);
writeln(‘Bay gio: a = ‘,a,’ va b = ‘,b); readln;
end.
Kết quả chạy chương trình:
Ban dau: a = 3 va b = 7
Bay gio: a = 7 va b = 3.
Sở dĩ như vậy vì khi khai báo Thủ tục DoiCho bạn đã có chữ var ở trước x,y:integer. Điều đó có nghĩa rằng x,y là các Tham biến, và khi gọi DoiCho(a,b); thì các Tham số thực sự a và b sẽ nhận giá trị mới sau khi thực hiện các câu lệnh theo Thủ tục!
Kết quả chạy chương trình:
Ban dau: a = 3 va b = 7
Bay gio: a = 7 va b = 7.
Sở dĩ như vậy vì khi khai báo Thủ tục DoiCho bạn đã có chữ var ở trước x và không có var cho y. Điều đó có nghĩa rằng x là các Tham biến và y la Tham trị, và khi gọi DoiCho(a,b); thì Tham số thực sự a sẽ nhận giá trị mới sau khi thực hiện các câu lệnh theo Thủ tục, còn b lại nhận giá trị cữ trước khi gọi Thủ tục!
Cũng vậy, nếu thay bởi:
Procedure DoiCho(x:integer; var y:integer); {x là Tham trị và y là Tham biến}
Kết quả chạy chương trình:
Ban dau: a = 3 va b = 7
Bay gio: a = 3 va b = 3.
Bây giờ có lẽ không cần phải nói thêm điều gì nữa, bạn cũng hiểu!
Tuy nhiên, còn một cách đổi chỗ hai biến số không cần biên phụ, thiết nghĩ cũng nên chia sẻ cùng bạn:
Procedure DoiCho(var x,y:integer); {x và y đều là Tham biến}
Begin
x:=x-y; y:=x+y; x:=y-x;
End;
Không tin, bạn hãy chịu khó gõ vào thay thế Thủ tục cũ, chạy thử xem sao!
Qua đây, ta rút ra kinh nghiệm là: Muốn Tham số thực sự nào giữ nguyên giái trị cũ thì Tham số hình thức phải là Tham trị, tức là không có chữ var đằng trước nó. Ngược lại muốn Tham số thực sự nào nhân giá trị mới thì Tham số hình thức tương ứng phải là Tham biến, tức là có chữ var đằng trước nó. Sau đây, bạn hãy bớt chút thời gian để xem một ví dụ nữa: Thủ tục: giải phương trình bậc nhất ax+b=0, được đưa vào chương trình GiaiPhuongtrinhBacNhat.
uses crt;
var a,b,x:real; n:byte;
procedure PhuongTrinhBacNhat(a,b:real; var n:byte; var x:real);
{Đầu vào (Tham trị) là hệ số thực a và b, đầu ra (Tham biến) n là số nghiệm:
0 (vô nghiệm), 1 hoặc 2 (vô số nghiệm), khi n=1 thì x là nghiệm số}
begin
if a<>0 then
begin
n:=1;
x:=-b/a;
end
else
if b<>0 then n:=0
else n:=2
end;
BEGIN
clrscr;
write('Nhap a,b='); readln(a,b); {Nhập luôn a và b: Gõ a dấu cách gõ b và Enter}
PhuongTrinhBacNhat(a,b,n,x);
case n of
0:writeln('Vo nghiem');
1:writeln('x=',x:0:3);
2:writeln('Vo so nghiem: x tuy y');
end;
readln;
END.
Chúc các bạn thành công!
lightsmok@yahoo.com