Có hai loại hàm trong lập trình C là:
- Standard library functions
- User-defined functions
Trong bài viết này, chúng ta sẽ cùng đi tìm hiểu chi tiết về 2 loại hàm này.
Các hàm trong thư viện tiêu chuẩn
- Standard library functions (Hàm thư viện chuẩn) là những hàm có sẵn trong lập trình C.
- Các hàm với tên và chức năng riêng biệt đã được định nghĩa trong các thư viện tiêu chuẩn.
Ví dụ:
- Hàm
printf()
là một hàm dùng để hiển thị đầu ra được định dạng ra màn hình. Hàm này
được định nghĩa trong thư việnstdio.h
, để sử dụng hàm chúng ta cần import thư viện
với câu lệnh:#include<stdio.h>
- Hàm
sqrt()
là một hàm dùng để tính căn bậc hai của một số. Hàm này được định nghĩa trong
thư việnmath.h
và để sử dụng được hàm này chúng ta cần import thư viện với câu lệnh:#include <math.h>
Advantages of Using C library functions
-
Các hàm chức năng này "hoạt động":
- Các hàm này đã trải qua các thử nhiệm nghiêm ngặt của nhà phát triển ngôn ngữ lập trình C nó đơn giản, dễ sử dụng.
-
Các hàm chức năng đã được tối ưu hóa về hiệu suất:
- Do các hàm đều được định nghĩa trong thư viện tiêu chuẩn (standard library), các hàm này được phát triển liên tục để nhằm mục đích làm chúng trở nên tốt hơn.
-
Tiết kiệm thời gian:
- Vì đây là hầu hết các chức năng cơ bản nhất mà người lập trình có thể sử dụng (in ra màn hình, tính căn bậc hai,...) vậy nên chúng ta không cần phải tạo lại chúng một lần nữa.
-
Các chức năng có thể di động:
- Các chức năng thư viện này giúp bạn ở chỗ chúng thực hiện điều tương tự trên mọi máy tính.
Ví dụ: Tính giá trị tuyệt đối của một số nguyên nhập từ bàn phím.
Để tính toán được giá trị tuyệt đối của một số chúng ta có thể sử dụng hàm thư viện fabs()
. Để sử dụng
nó chúng ta cần import thư viện math.h
ở phần đầu file code.
cpp
#include <stdio.h>
#include <math.h>
int main() {
int num, abs;
printf("Enter a number: ");
scanf("%d", &num);
// Tính toán giá trị tuyệt đối của "num" và gán vào biến abs
abs = fabs(num);
printf("Absolute value = %d", num);
return 0;
}
Kết quả
Enter a number: -7
Absolute value = 7
Định nghĩa hàm trong C
- Ngoài việc sử dụng các hàm viết sẵn được định nghĩa trong các thư viện của chương trình C
chúng ta cũng có thể tạo các hàm theo mục đích hoặc yêu cầu của bài toán. - Những hàm được lập trình viên tạo ra được gọi là hàm do người dùng định nghĩa.
- Mỗi hàm thực hiện một chức năng cụ thể.
Ví dụ: Tính tổng hai số nguyên có giá trị được nhập từ bàn phím.
Khác với những bài tập và ví dụ trước, với bài toán này chúng ta sẽ sử dụng hàm addition()
để tính toán:
cpp
#include <stdio.h>
int addition(int a, int b); // Nguyên mẫu hàm (Function prototype)
int main() {
int x, y, result;
printf("Enter x: ");
scanf("%d", &x);
printf("Enter y: ");
scanf("%d", &y);
result = addition(x, y); // Gọi hàm (Function call)
printf("x + y = ", result);
return 0;
}
int addition(int a, int b){ // Định nghĩa hàm (Function definition)
int sum;
sum = a + b;
return sum; // Trả về kết quả của hàm (Return statement)
}
Kết quả
Enter x: 3
Enter y: 4
x + y = 7
Function prototype
- Nguyên mẫu hàm chỉ là khai báo một hàm gồm tên hàm, các tham số và kiểu trả về. Không chứa
thân hàm. - Nó cung cấp cho trình biên dịch là hàm này có thể được sử dụng trong chương trình.
Syntax of function prototype:
cpp
returnType functionName(dataType1 argument1, dataType2 argument2, ...);
Với ví dụ ở trên ta có thể phân tích hàm addition()
:
- Tên của hàm là
addition()
. - Kiểu trả về là
int
. - Có hai tham số
int
được truyền vào hàm.
Nguyên mẫu hàm là không cần thiết nếu hàm do bạn định nghĩa ở trước
main()
.
Function call
Syntax of function call:
cpp
functionName(argument1, argument2, ...);
Trong ví dụ trên ta gọi hàm addition(x, y);
bên trong hàm main()
.
Function definition
Định nghĩa hàm cho hàm một khối lệnh để hàm thực hiện chức năng cụ thể, như ví dụ ở trên hàm thực hiện chức năng tính tổng hai số và trả về kết quả.
Syntax of function definition:
cpp
returnType functionName(dataType1 argument1, dataType2 argument2, ...){
// body of the function
}
Khi hàm được gọi (function call) trình biên dịch chuyển đến hàm và bắt đầu thực thi các câu lệnh bên trong thân hàm.
Argument & Parameters
-
Trong lập trình đối số (argument) là cách chúng ta gọi các biến được truyền cho hàm. Ở ví dụ trên, hai biến x và y là đối số.
-
Các tham số (parameter) a và b chấp nhận đối số được truyền vào hàm, được coi là tham số chính thức của hàm.
-
Kiểu dữ liệu của đối số và tham số phải trùng với nhau nếu không chương trình sẽ bị lỗi.
-
Một hàm đôi khi cũng không cần truyền đối số.
Return statement
Câu lệnh return kết thúc thực thi của một hàm và trả về giá trị cho hàm đang được gọi.
Trong ví dụ trên giá trị của biến kết quả trong hàm addition()
được trả về hàm main()
và biến result được gán giá trị này.
Syntax of return statement:
cpp
return (expression);
Ví dụ:
cpp
return a;
return a+b;
Kiểu dữ liệu được trả về từ hàm và kiểu dữ liệu trả về được chỉ định trong nguyên mẫu hàm (hoặc định nghĩa hàm) phải khớp nhau.
Chúng ta có thể xem lại cú pháp khởi tạo một hàm tại đây Structure of a function.
How user-defined function works?
Cùng xem hình ảnh mô tả cách hoạt động của hàm do người dùng định nghĩa:
Giải thích:
- Chương trình bắt đầu chạy từ hàm
main()
khi trình biên dịch gặpfunctionName();
sẽ chuyển tới:void functionName()
. Và trình biên dịch bắt đầu thực thi các đoạn code bên trongfunctionName();
- Khi kết thúc việc thực thi các dòng lệnh trong
functionName();
trình biên dịch quay trở lạimain()
.
Lưu ý
Một hàm với tên được định nghĩa phải là duy nhất.
Advantages of user-defined function
- Chương trình sẽ dễ hiểu, dễ duy trì và gỡ lỗi hơn.
- Code có thể tái sử dụng trong các chương trình khác.
- Một chương trình lớn có thể được chia thành các mô-đun nhỏ hơn. Do đó, nó có thể được chia cho nhiều lập trình viên cùng thực hiện.