MyRoad

Published on

Hàm trong lập trình C

Authors

Mục lục


Hàm là gì và dùng làm gì?

Trong khi viết chương trình, chúng ta sẽ gặp phải tình trạng : muốn tính giai thừa của 4!, rồi 5!,... thì chúng ta phải code lại nhiều lần đoạn code tính giai thừa như dưới đây:

int giaithua = 1;
//tính 4!
for(int i=1; i<=4; i++){
    giaithua *= i;
}

Việc này rất mất thời gian và làm đoạn code của chúng ta trở nên quá dài và khó debug hay fixbug.
Hay trong 1 trường hợp khác, chúng ta viết các tính năng cho chương trình như tính tổng các số rồi sắp xếp kí tự ,... nhưng lại để hết ở 1 hàm main thì nó cũng làm cho code dài dòng khó debug. Bởi vậy, chúng ta cần dùng đến hàm (function).

1 hàm là 1 khối lệnh thực hiện 1 nhiệm vụ hoàn chỉnh, ví dụ như hàm tính tổng a+b, hàm tính giai thừa của a!,...


Cấu trúc hàm (function)

Khi 1 chương trình C chạy, nó sẽ chạy vào hàm main đầu tiên, thực hiện các lệnh trong hàm main theo thứ tự từ trên xuống dưới. Bạn có thể tưởng tượng rằng hàm main giống như 1 nhà máy sản xuất, khi đó các function sẽ là những cỗ máy trong nhà máy đó, mỗi cỗ máy function sẽ có 1 chức năng và có cấu tạo như dưới đây:

Kiểu_dữ_liệu Tên_hàm(Khai_báo Các_đối_số) {
  Khai_báo_các_biến_của_hàm;  //Nếu cần
  Khối_lệnh;
  return Giá_trị; //Nếu Kiểu_dữ_liệu là void thì không cần câu lệnh này
}

/*VD:
int example (char a, int b){
    printf("gia tri tham so %c va %d",a,b);
    return 1;
}

Trong cấu trúc trên:

  • Kiểu_dữ_liệu là kiểu dữ liệu trả về của hàm, giống như thông báo cho chương trình biết cái máy function này cho ra sản phẩm là cái gì.
  • Tên_hàm là tên để chúng ta có thể gọi hàm (gọi hàm làm việc), giống như việc chúng ta cần phải biết bật máy 1 hay máy 2 chứ không thể nói chung là bật máy lên được.
  • Khai_báo Các_đối_số là thành phần không bắt buộc, các đối số được khai báo sẽ phải khai báo theo dạng: Kiểu_dữ_liệu_của_đối_số Tên_đối_số, các đối số phải cách nhau bởi dấu ,. Đối số cũng giống như nguyên liệu bỏ vào máy (function).
  • Các lệnh bên trong dấu {} là các bước làm việc của hàm.
  • return giá trị trả về của hàm, giống như máy trả về sản phẩm sau khi làm xong vậy.

Chúng ta sẽ cùng lấy 1 ví dụ chi tiết để thấy rõ hơn cách hoạt động của hàm nhé:

#include <stdio.h>

//Khai báo hàm tính lũy thừa ex
double ex(double a, int n){
    //khai báo biến trong hàm, chỉ có giá trị trong hàm đó.
    double res =1;
    //Vòng lặp nhân res với a n lần, tương đương a^n
    for(int i=0;i<n;i++ ){
        res *= a;
    }
    return res; //trả về giá trị là res
}

int main(){
    //Khai báo biến x và n
    double x;
    int n;
    //lấy giá trị x và n nhập vào
    scanf("%lf %d",&x,&n);
    //in ra giá trị x^n
    //gọi hàm ex(x,n)
    //hàm sẽ trả về giá trị x^n có type là double
    //In nó ra thôi :>
    printf("%.4lf",ex(x,n));
    return 0;
}