Khái niệm
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định sau đó trả về giá trị cho chương trình gọi nó, hay nói cách khác hàm là sự chia nhỏ của chương trình.
Cú pháp khai báo nguyên mẫu hàm
<Kiểu_hàm> Tên_hàm ([Danh_sách_tham_số]);
Trong đó:
Tên_hàm: là một tên hợp lệ theo quy tắc về tên của ngôn ngữ C/C++. Mỗi hàm có tên duy nhất và không được trùng với các từ khóa. Tên hàm sẽ được dùng để gọi hàm.
Kiểu_hàm: Hàm có thể trả về một giá trị cho nơi gọi, giá trị đó thuộc một kiểu dữ liệu nào đó, kiểu đó được gọi là kiểu hàm. Kiểu hàm có thể là kiểu chuẩn cũng có thể là kiểu do người dùng định nghĩa. Nếu hàm không trả về giá trị thì kiểu hàm là void.
Danh_sách_tham_số: Hàm có thể nhận dữ liệu vào thông qua các tham số của nó (tham số hình thức), các tham số này cũng thuộc kiểu dữ liệu xác định. Có thể có nhiều tham số, các tham số cách nhau bởi dấu phẩy (,). Trong nguyên mẫu không bắt buộc phải có tên tham số nhưng kiểu của nó thì bắt buộc. Nếu hàm không có tham số chúng ta có thể để trống phần này hoặc có thể khai báo là void.
Ví dụ:
int max(int a, int b); // khai báo nguyên mẫu hàm max, có hai tham số kiểu int, kết quả trả về kiểu int.
float f(float, int); // nguyên mẫu hàm f, có hai tham số, tham số thứ nhất kiểu float, tham số thứ 2 kiểu int, kết quả trả về kiểu float.
void nhapmang(int a[], int ); // hàm nhapmang, kiểu void (không có giá trị trả về), tham số thứ nhất là một mảng nguyên, tham số thứ 2 là một số nguyên.
void g(); // hàm g không đối, không kiểu.
Định nghĩa hàm
Cú pháp:
<kiểu_hàm> <tên_hàm>([khai_báo_tham_số])
{
< thân hàm>
}
Ví dụ:
unsigned long giaithua (int n)
{
unsigned long ketqua =1;
int i;
for (i =2; i<=n; i++)
ketqua = ketqua*i;
return ketqua;
}
Kết quả trả về của hàm – lệnh return
Nếu hàm có giá trị trả về (kiểu hàm khác void) thì trong thân hàm trước khi kết thúc phải có câu lệnh trả về giá trị:
return <giá trị>;
<giá_trị> sau lệnh return chính là giá trị trả về của hàm, nó phải có kiểu phù hợp với kiểu của hàm được khai báo trong dòng tiêu đề. Trường hợp hàm void chúng ta có thể dùng câu lệnh return (không có giá trị) để kết thúc hàm hoặc khi thực hiện xong lệnh cuối cùng (gặp } cuối cùng) hàm cũng kết thúc.
Lời gọi hàm và cách truyền tham số cho hàm
• Một hàm có thể gọi thực hiện thông qua tên hàm, với những hàm có tham số thì trong lời gọi phải truyền cho hàm các tham số thực sự (đối số) tương ứng với các tham số hình thức.
• Khi hàm được gọi và truyền tham số phù hợp thì các lệnh trong thân hàm được thực hiên bắt đầu từ lệnh đầu tiên sau dấu mở móc { và kết thúc khi gặp lệnh return, exit hay gặp dấu đóng móc } kêt thúc hàm.
Cú pháp:
<tên_hàm> ([danh sách các tham số thực sự]);
Các tham số thực sự phải phù hợp với các tham số hình thức
Số tham số thực sự phải bằng số tham số hình thức.
Tham số thực sự được truyền cho các tham số hình thức tuần tự từ trái sang phải, tham số thực sự thứ nhất truyền cho tham số hình thức thứ nhất, tham số thực sự thứ 2 truyền cho tham số hình thức thứ 2,.. kiểu của các tham số thực sự phải phù hợp với kiểu của các tham số hình thức. Sự phù hợp ở đây được hiểu là kiểu trùng nhau hoặc kiểu của tham số thực sự có thể ép về kiểu của tham số hình thức.
Đệ quy
Một hàm được gọi có tính đệ qui nếu trong thân của hàm đó có lệnh gọi lại chính nó một cách tường minh hay tiềm ẩn.
Ví dụ 1: Tính tổng S = 1 + 2 + 3 + … + n (n là số nguyên dương, được nhập từ bàn phím).
Thuật toán giải bằng phương pháp đệ quy như sau:
long TongS (int n)
{
if(n==0)
return 0;
return ( TongS(n-1) + n );
}