Nguyên tắc hoạt động của chương trình con và cách truyền tham số cho chương trình con
Như ở trên chúng ta đã tìm hiểu mỗi hàm có thể có đối hoặc không. Nếu như hàm có đối thì sau khi xây dựng xong chúng ta có thể gọi chúng ra thực hiện. Mỗi một đối ta phải truyền cho nó một tham số tương ứng tuỳ thuộc đối đó là kiểu gì. Nếu đối là ...
Như ở trên chúng ta đã tìm hiểu mỗi hàm có thể có đối hoặc không. Nếu như hàm có đối thì sau khi xây dựng xong chúng ta có thể gọi chúng ra thực hiện. Mỗi một đối ta phải truyền cho nó một tham số tương ứng tuỳ thuộc đối đó là kiểu gì.
Nếu đối là kiểu tham trị trước tiên máy sẽ cấp phát bộ nhớ cho đối kiểu tham trị đó, sau đó tiến hành sao chép giá trị của tham số thực thụ với nó đưa vào đối này. Từ đó ta thấy tham số thực thụ tương ứng với đối có kiểu tham trị có thể là một hằng, một biến, một biểu thức... và có kiểu tương ứng. Bởi vì đối kiểu tham trị khi mà hàm chứa đối này được gọi ra thực hiện thì nó được cấp phát bộ nhớ riêng sau đó sao chép giá trị của tham số thực thụ tương ứng với nó đưa vào và sau đó máy tiến hành các thao tác trên đối này mà không làm ảnh hưởng tới tham số thực thụ tương ứng với nó và cũng bởi vì nó chỉ sao chép giá trị của tham số thực thụ tương ứng với nó do vậy tham số thực thụ tương ứng với nó cứ cho một giá trị là được. Vì vậy tham số thực thụ tương ứng với đối kiểu tham trị có thể là hàng, biến, biểu thức...miễn là có cùng kiểu.
Ghi chú: Theo những phân tích ở trên những đối chỉ nhằm mục đích cung cấp dữ liệu đầu vào cho hàm thì chúng ta khai báo đối đó là đối kiểu tham trị
Nếu đối là kiểu tham chiếu đối này sẽ tham chiếu tới tham số tương ứng với nó. Nghĩa là trong thân hàm khi ta thao tác trên đối tham chiều này thực chất là thao tác trên tham số truyền vào tương ứng với đối này. Do vậy mọi thay đổi giá trị của đối tham chiếu cũng đồng nghĩa với việc thay đổi giá trị của tham số tương ứng truyền vào. Điều này chứng tỏ rằng tham số tương ứng với đối là kiểu tham chiểu phải là một biến hay phần tử của mảng có kiểu tương ứng và khi hàm chứa đối kiểu tham chiếu này kết thúc thì tham số tương ứng với nó lưu lại được sự thay đổi khi ra khỏi hàm
Trong C# có hai loại đối kiểu tham chiếu đó là: đối kiểu tham chiếu ref và đối kiểu tham chiếu out. Nếu đối là kiểu tham chiếu ref thì tham số tương ứng với nó phải được khởi gán giá trị trươc khi truyền vào và nó có thể tham gia tính toán trong các biểu thức. Nếu đổi là kiểu tham chiếu out thì tham số tương ứng với nó không cần khởi tạo giá trị ban đầu, chính vì lẽ đó nó chỉ dùng để nhận giá trị và không được tham gia tính toán trong các biểu thức.
Ghi chú: Theo những phân tích ở trên những đối dùng để cung cấp dữ liệu đầu vào cho hàm và đồng thời lưu lại được sự thay đổi khi chúng ta tác động trên những đối này, những đối như vậy thì chúng ta khai báo đối kiểu tham chiếu(ref). Những đối chỉ nhằm mục đích nhận giá trị khi ra khỏi hàm thì những đối này chúng ta khai báo đối theo kiểu tham chiếu out.
Tham số truyền vào cho đối tham chiếu phải kèm theo hai từ khoá ref hoặc out tượng ứng với đối kiểu tham chiếu ref và đối kiểu tham chiếu out
Ví dụ: Nhâp vào ba số nguyên dương sau đó tiến hành sắp xếp ba số nguyên đó theo thứ tự tăng dần.
-----------------------------------------------------------------------------------------------
using System;
class VD9
{
static void HoanVi(ref int x, ref int y)
{
int tg = x; x = y; y = tg;
}
static void Main()
{
int a, b, c;
Console.Write("Nhap a="); a = int.Parse(Console.ReadLine());
Console.Write("Nhap b="); b = int.Parse(Console.ReadLine());
Console.Write("Nhap c="); c = int.Parse(Console.ReadLine());
if (a > b) HoanVi(ref a, ref b);
if (a > c) HoanVi(ref a, ref c);
if (b > c) HoanVi(ref b, ref c);
Console.Write("a={0} b={1} c={2}", a, b, c);
Console.ReadKey();
}
}
-----------------------------------------------------------------------------------------------
Ví dụ: Xây dựng chương trình giải phương trình bậc hai ax2+bx+c=0(a<>0)
-----------------------------------------------------------------------------------------------
using System;
class VD
{
static double a,b,c;
static void Nhap()
{
Console.Write("Nhap a=");a=double.Parse(Console.ReadLine());
Console.Write("Nhap b=");b=double.Parse(Console.ReadLine());
Console.Write("Nhap c=");c=double.Parse(Console.ReadLine());
}
static double Delta()
{
return b*b-4*a*c;
}
static void Giai(out double x1,out double x2,out bool ok)
{
double d=Delta();
ok=true;
if(d<0)
{ok=false;x1=x2=0;}
else
if(d==0)
x1=x2=-b/(2*a);
else
{
x1=(-b-Math.Sqrt(d))/(2*a);
x2=(-b+Math.Sqrt(d))/(2*a);
}
}
static void Main()
{
double x1,x2;
bool ok;
Nhap();
Giai(out x1,out x2,out ok);
if(ok==true)
if(x1==x2)
Console.WriteLine("Phuong trinh co nghiem kep x1=x2={0}",x1);
else
{
Console.WriteLine("Phuong trinh co hai nghiem phan biet");
Console.WriteLine("x1={0} x2={1}",x1,x2);
}
else
Console.WriteLine("Phuong trinh vo nghiem");
Console.ReadKey();
}
}
-----------------------------------------------------------------------------------------------