Các loại hàm trong C

0 phút đọc

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ện stdio.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ện math.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

  1. 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.
  2. 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.
  3. 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.
  4. 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.

#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:

#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:

returnType functionName(dataType1 argument1, dataType2 argument2, ...);

Với ví dụ ở trên ta có thể phân tích hàm addition():

  1. Tên của hàm là addition().
  2. Kiểu trả về là int.
  3. 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:

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:

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 xy là đối số.
  • Các tham số (parameter) ab 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:

return (expression);

Ví dụ:

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ặp functionName(); 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 trong functionName();

  • 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ại main().

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.
Avatar TechMely Team
Được viết bởi

TechMely Team

Bạn sẽ tìm thấy niềm vui khi giúp đỡ người khác bằng tất cả tấm lòng