Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái CHƯƠNG 4: HÀM 1. Khái niệm hàm 1.1Khái niệm và phân loại Một chương trình viết trong ngôn ngữ C là một dãy các hàm, trong đó có một hàm chính(hàm main). Hàm chia các bài toán lớn thành các công việc nhỏ, có thể có những đoạn chương trình viết lặp đi lặp lại nhiều lần, để tránh rườm rà và mất thời gian khi viết chương trình; người ta thường phân chia chương trình thành nhiều module, mỗi module giải quyết một công việc vào đó. Thứ tự các hàm trong chương trình là bất kỳ, song chương trình bao giờ cũng đi thực hiện từ main().
Trong C, chương trình con được gọi là hàm. Hàm trong C có thể trả về kết quả thông quan tên hàm hay có thể không trả về kết quả. Hàm có hai loại: Hàm chuẩn và hàm tự định nghĩa. Trong chương này ta chú trọng đến cách định nghĩa hàm và cách sử dụng các hàm đó.
Hàm thư viện Hàm thư viện là những hàm đã được định nghĩa sẵn trong một thư viện nào đó, muốn sử dụng các hàm thư viện thì phải khai báo thư viện trước khi sử dụng bằng lệnh #inlcude <tên_thư_viện.h> Hàm người dùng Hàm người dùng là những hàm do người lập trình tự tạo ra nhằm đáp ứng nhu cầu xử lý của mình. Một hàm khi được định nghĩa thì có thể sử dụng bất cứ đâu trong chương trình. Trong C, một chương trình bắt đầu thực thi bằng hàm main. Chương trình con được dùng để tôí ưu hóa việc tổ chức chương trình, chia một chương trình lớn thành nhiều công việc độc lập nhỏ.
Dùng chương trình con thực hiện các công việc nhỏ, tạo thành mô-đun. Khi đó nhiệm vụ chương trình chính chỉ là cung cấp dữ liệu đầu vào cho các mô-đun để hoàn thành công việc của mình. Một chương trình viết theo cách này gọi là chương trình cấu trúc. Có thể minh họa chương trình con như hình sau : Chương trình con thực hiện công việc A Dữ liệu đưa vào để thực Dữ liệu kết quả hiện công việc A của công việc A 52 Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Hình 4.1 : Hình ảnh minh họa nhiệm vụ của chương trình con Để nhận các dữ liệu đưa vào cho chương trình con và nếu có thể chứa dữ liệu kết quả ra chúng ta phải sử dụng tham số (parameters) của chương trình con.
Tham số tồn tại dưới hai hình thức đó là tham số thực và tham số hình thức. Tham số hình thức là tham số để khai báo và xây dựng trương trình con, còn tham số thực để xác định dữ liệu đưa vào khi gọi chương trình con. Trong một số ngôn ngữ lập trình cung cấp hai loại chương trình con riêng biệt đó là hàm(function) và thủ tục (procedures) nhưng trong C chỉ cung cấp một loại đó là hàm Để tạo một hàm chúng ta cần xác định - Hàm tạo ra sẽ thực hiện công việc gì ? - Sau khi thưc hiện song có cần trả về một dữ liệu hay nhiều dữ liệu không ? - Để thực hiện được công việc đó ta cần những dữ liệu nào ? 1.2 Quy tắc hoạt động của hàm Khi gặp một lời gọi hàm, thì hàm sẽ được thực hiện theo trình tự sau: Cấp phát bộ nhớ cho các đối và các biến cục bộ. Gán giá trị của các tham số thực cho các đối tượng tương ứng.
Thực hiện các câu lệnh trong thân hàm. Khi gặp câu lệnh return hoặc dấu } cuối cùng của thân hàm thì máy sẽ xóa các đối, các biến cục bộ và thoát khỏi hàm. Chú ý: Số tham số thực sự phải bằng số tham số hình thức (đối của hàm) và kiểu của tham số thực phải cùng kiểu với tham số hình thức tương ứng. Nếu trở về từ một câu lệnh return có chứa biểu thức thì giá trị của biểu thức được gán cho hàm.
Giá trị của hàm sẽ được sử dụng trong biểu thức chứa nó. Xây dựng hàm 2.1 Định nghĩa hàm Khai báo hàm Khai báo hàm được thực hiện ở phần đầu chương trình, khai báo để chỉ cho máy biết các thông tin về hàm bao gồm : kiểu dữ liệu trả về có hay không, tên hàm, các tham số bao gồm kiểu và tên của từng tham số. Cú pháp khai báo như sau : 53 Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1, kiểu2 tham_số2. ) ; Trong đó : - Tên kiểu trả về : là một tên kiểu dữ liệu quy định kết quả trả về là khiểu gì.
- Tên hàm : Tự đặt theo quy định đặt tên của ngôn ngữ C. - Kiểu1 tham_số1 : xác định tên của tham số thứ nhất và kiểu của tham số đó,. Nếu có nhiều tham số, mỗi tham số phân cách nhau bởi dấu phẩy (,) Ví dụ: int sum(int a , int b) ; float max(float x, float y); Nếu trong hàm không có dữ liệu trả về thì viết kiểu trả về là void nếu không có tham số thì bỏ trống và phải có cặp dấu đóng mở ngoăc () sau tên hàm. Ví dụ: void hien(); Xây dựng hàm Sau khi khai báo xong hàm chúng ta có thể viết lệnh thực hiện công việc đặt ra cho chương trình con.
Cú pháp: Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2. ) { Các câu lệnh thực hiện công việc đặt ra cho hàm. } Khi cần kết thúc thực hiện hàm và trả về dữ liệu nào đây, chúng ta viết lệnh return vào vị trí cần thiết nhất trong hàm. Cú pháp: return giá-trị-dữ-liệu-trả-về; Ví dụ: int sum(int a, int b) { return a+b; } Hoặc 54 Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái float max(float x, float y) { if(x>y) return x; else return y; } Đối với hàm có kiểu void có thể không cần lệnh return Ví dụ: void hien() { printf(“ho va ten: Nguyen Van Nam”); printf(“Ngay sinh :12\08\2014”); printf(“que quan : Yen Bai”); } Chú ý: Thông thường với những chương trình đơn giản có ít chương trình con thì người ta viết lệnh cho hàm ngay tại nơi khai báo.2 Sử dụng hàm Một hàm khi định nghĩa thì chúng vẫn chưa được thực thi trừ khi ta có một lời gọi đến hàm đó.
Khi thực hiện chương trình máy sẽ thực hiện các lệnh trong chương trình chính(hàm main), do đó để yêu cầu máy thực hiện công việc của chương trình con ta phải viết lệnh gọi chương trình con với cú pháp sau. Cú pháp: <tên_hàm>([Danh sách các tham số]) Lời gọi này có thể là một câu lệnh độc lập hoặc đặt trong biểu thức, nếu đặt trong biểu thức thì hàm đó phải có giá trị trả về để thực hiện tính toán biểu thức đó. Ví dụ: printf(“Tong hai so 5 va 6 la: %d”,tong(5,6)); Hoặc: float x ; 55 Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái x = max(a,b) ; Hoăc: hien(); Chú ý: Thông thường lời gọi hàm được viết trong chương trình chính, tuy nhiên có thể viết trong chương trình con khác. Các chương trình con có thể gọi lẫn nhau.
Các tham số của hàm 3.1 Phân biệt các loại tham số Trong lập trình, tham số là biến được thu nhận bởi một chương trình con. Tại thời gian chạy, chương trình con sử dụng các giá trị được gán cho các tham số để thay đổi cách ứng xử của mình. Hầu hết các ngôn ngữ lập trình có thể định nghĩa các chương trình con không có tham số hoặc chấp nhận một vài tham số. Tham số hình thức: Là biến được liệt kê trong danh sách tham số (thường nằm tại phần đầu của định nghĩa chương trình con).
Tham số thực sự : Là giá trị cụ thể của biến đó tại thời gian chạy. Để phân biệt rõ hai khái niệm trên, xét ví dụ dưới đây: int sum(int gt1, int gt2) { return (gt1+gt2); } Hàm sum nhận hai tham số hình thức: gt1và gt2. Nó lấy tổng của các giá trị được truyền vào các tham số này và trả về kết quả cho nơi gọi hàm (bằng cách sử dụng một kỹ thuật được cung cấp tự động bởi trình biên dịch C). Mã gọi hàm sum có thể trông như dưới đây: int a=40; int b=2; int c = sum(a,b); Các biến a và b được khởi tạo với các giá trị 40 và 2.
Các biến này không phải tham số hình thức hay tham số thực sự. Tại thời gian chạy, giá trị đã được gán cho các biến này được truyền vào cho hàm sum. Trong hàm sum, các tham số hình thức gt1 và gt2 được tính giá trị và lần lượt cho kết quả là hai tham số thực 56 Giáo trình: Lập trình cơ bản Trường Cao đẳng nghề Yên Bái sự 40 và 2. Giá trị của các tham số thực sự được cộng lại, kết quả được trả về cho nơi gọi hàm - nơi nó được gán cho biến c Tham số hình thức thường được gọi tắt là tham số.
Tham số thực sự còn được gọi là tham số thực, tham đối hoặc đối số.2 Cách truyền tham số Có hai cách để truyền tham số cho hàm: Truyền theo tham trị và truyền theo tham chiếu. Truyền bằng tham trị Trong cơ chế truyền tham số bằng giá trị (gọi là truyền tham trị), khi chương trình con được chạy, một bản sao của tham số thực sự được gán cho tham số hình thức (sao chép giá trị). Nghĩa là mọi sửa đổi của chương trình con đối với tham số hình thức không gây ảnh hưởng tới biến được truyền vào chương trình con theo kiểu truyền tham trị. Các tham số được truyền bằng giá trị được gọi là tham trị.
Do chỉ có giá trị được truyền vào chương trình con, tham số thực sự không nhất thiết phải là một biến thông thường mà có thể là hằng giá trị, hằng biến, biểu thức trả về giá trị. Truyền bằng biến Trong cơ chế truyền tham số bằng biến (gọi là truyền tham biến), khi chương trình con được chạy, tham số hình thức trở thành một tham chiếu tham số thực sự. Nghĩa là mọi sửa đổi của chương trình con đối với tham số hình thức sẽ có tác dụng với tham số thực sự. Đây được gọi là hiệu ứng phụ của chương trình con.
Các tham số được truyền bằng biến được gọi là tham biến. Ngược lại với cơ chế truyền bằng giá trị, cơ chế truyền bằng biến đòi hỏi tham số thực sự phải là một biến. Các đối số mặc định Một số ngôn ngữ lập trình cho phép một đối số mặc định (default argument) được cho trước một cách tường mình hay ngầm định trong phần khai báo của một chương trình con. Điều này cho phép nơi gọi bỏ qua đối số này khi gọi chương trình con đó.