Một hàm
là một đoạn chương trình thực hiện một tác vụ được định nghĩa cụ thể. Chúng thực
chất là những đoạn chương trình nhỏ giúp giải quyết một vấn đề lớn.
Sử dụng
các hàm
Nói
chung, các hàm được sử dụng trong C để thực thi một chuỗi các lệnh liên tiếp. Tuy
nhiên, cách sử dụng các hàm thì không giống với các vòng lặp. Các vòng lặp có
thể lặp lại một chuỗi các chỉ thị với các lần lặp liên tiếp nhau. Nhưng việc gọi
một hàm sẽ sinh ra một chuỗi các chỉ thị được thực thi tại vị trí bất kỳ trong
chương trình. Các hàm có thể được gọi nhiều lần khi có yêu cầu. Giả sử một phần
của mã lệnh trong một chương trình dùng để tính tỉ lệ phần trăm cho một vài con
số. Nếu sau đó, trong cùng chương trình, việc tính toán như vậy cần phải thực
hiện trên những con số khác, thay vì phải viết lại các chỉ thị giống như trên,
một hàm có thể được viết ra để tính tỉ lệ phần trăm của bất kỳ các con số. Sau
đó chương trình có thể nhảy đến hàm đó, để thực hiện việc tính toán (trong hàm)
và trở về nơi nó đã được gọi. Điều này sẽ được giải thích rõ ràng hơn khi thảo
luận về cách hoạt động của các hàm.
Một điểm
quan trọng khác là các hàm thì dễ viết và dễ hiểu. Các hàm đơn giản có thể được
viết để thực hiện các tác vụ xác định. Việc gỡ rối chương trình cũng dễ dàng
hơn khi cấu trúc chương trình dễ đọc, nhờ
vào sự đơn giản hóa hình thức của nó. Mỗi hàm có thể được kiểm tra một cách độc
lập với các dữ liệu đầu vào, với dữ liệu hợp lệ cũng như không hợp lệ. Các
chương trình chứa các hàm cũng dễ bảo trì hơn, bởi vì những sửa đổi, nếu yêu cầu,
có thể được giới hạn trong các hàm của chương trình. Một hàm không chỉ được gọi
từ các vị trí bên trong chương trình, mà các hàm còn có thể đặt vào một thư viện
và được sử dụng bởi nhiều chương trình khác, vì vậy tiết kiệm được thời gian viết
chương trình.
Cấu
trúc hàm
Cú pháp
tổng quát của một hàm trong C là:
type_specifier function_name
(arguments)
{
body of the function
return statement
}
type_specifier xác định kiểu dữ liệu của giá trị sẽ
được trả về bởi hàm. Nếu không có kiểu được đưa ra, hàm cho rằng trả về một kết
quả số nguyên. Các đối số được phân cách bởi dấu phẩy. Một cặp dấu ngoặc rỗng
() vẫn phải xuất hiện sau tên hàm ngay cả khi nếu hàm không chứa bất kỳ đối số
nào. Các tham số xuất hiện trong cặp dấu ngoặc () được gọi là tham số hình
thức hoặc đối số hình thức. Phần thân của hàm có thể chứa một hoặc
nhiều câu lệnh. Một hàm nên trả về một giá trị và vì vậy ít nhất một lệnh
return phải có trong hàm.
Các
đối số của một hàm
Trước
khi thảo luận chi tiết về các đối số, xem ví dụ sau,
#include
<stdio.h>
int main()
{
int i;
for(i =1; i <=10; i++)
printf(“\nSquare of %d is %d
“, i,squarer (i));
}
int squarer(int
x)
/* int x; */
{
int j;
j = x * x;
return(j);
}
Chương
trình trên tính tính bình phương các số từ 1 đến 10. Điều này được thực hiện bằng
việc gọi hàm squarer. Dữ liệu được truyền từ thủ tục gọi (trong trường hợp
trên là hàm main()) đến hàm được gọi squarer thông qua các đối số. Trong
thủ tục gọi, các đối số được biết như là các đối số thực và trong định
nghĩa của hàm được gọi (squarer()) các đối số được gọi là các đối số hình thức.
Kiểu dữ liệu của các đối số thực phải cùng kiểu với các đối số hình thức.
Hơn nữa, số lượng và thứ tự của các tham số thực phải giống như của các tham số
hình thức.
Khi một
hàm được gọi, quyền điều khiển sẽ được chuyển đến cho nó, ở đó các đối số hình
thức được thay thế bởi các đối số thực. Sau đó hàm được thực thi và khi bắt gặp
câu lệnh return, nó sẽ chuyển quyền điều khiển cho chương trình gọi nó.
Hàm
squarer() được gọi bằng cách truyền số cần được tính bình phương. Đối số x
có thể được khai báo theo một trong các cách sau khi định nghĩa hàm.
Phương
pháp 1
squarer(int
x)
/* x được
định nghĩa cùng với kiểu dữ liệu trong cặp dấu ngoặc ()*/
Phương
pháp 2
squarer(x)
int x;
/*x được
đặt trong cặp dấu ngoặc (), và kiểu của nó được khai báo ngay sau tên hàm */
Chú
ý, trong trường hợp
sau, x phải được định nghĩa ngay sau tên hàm, trước khối lệnh. Điều này
thật tiện lợi khi có nhiều tham số có cùng kiểu dữ liệu được truyền. Trong trường
hợp như vậy, chỉ phải chỉ rõ kiểu đề một lần duy nhất tại điểm bắt đầu.
Khi các
đối số được khai báo trong cặp dấu ngoặc (), mỗi đối số phải được định nghĩa
riêng lẻ, cho dù chúng có cùng kiểu dữ liệu. Ví dụ, nếu x và y là hai đối số của
một hàm abc(), thì abc(char x, char y) là một khai báo đúng và abc(char x, y)
là sai.
Đăng nhận xét