Thứ Tư, 10 tháng 4, 2024

23.Khai báo và định nghĩa hàm-Function Declaration and Definition

Chúng ta đã thấy trong phần trước cách tạo ra và gọi một hàm tương tự thế này:


     // Tạo ra một hàm với tên gọi là myFunction
void myFunction() {
  printf("Xin Chào Đất Việt Lập Trình!");
}

int main() {
  myFunction(); // Gọi hàm myFunction
  return 0;
}


Tức là ta tạo một hàm ngoài hàm main(). Sau đó, trong main() chúng ta gọi hàm đó để in câu Xin Chào Đất Việt Lập Trình! lên màn hình.

Từ ví dụ trên, ta thấy rằng một hàm bao gồm hai phần:

  • Khai báo (Declaration): tên hàm, kiểu trả về và tham số (nếu có)
  • Định nghĩa (Definition): phần thân của hàm (mã sẽ được thực thi)

 

Đại khái mọi hàm sẽ có hình hài tương tự thế này:

void myFunction() { // Khai báo (Declaration)
 
// Thân hàm, định nghĩa hàm (Definition) nơi viết các câu lệnh
}

 

Để tối ưu hóa mã, nên tách phần khai báo và định nghĩa hàm.

Bạn sẽ thường thấy các chương trình C có khai báo hàmTrên main() và định nghĩa hàmDưới main(). Điều này sẽ làm cho mã được tổ chức tốt hơn và dễ đọc hơn:
 

Nói chung ta nên tổ chức chương trình với cấu trúc tương tự thế này

// Khai báo hàm
void myFunction();


// Hàm main
int main() {
  myFunction();  // Gọi hàm
  return 0;
}

// Định nghĩa hàm
void myFunction() {
  printf("Xin chào Dat Viet Lap Trinh!");

}



Trong nhiều tài liệu bạn sẽ thấy khái niệm Khai báo nguyên mẫu hàm - Function Prototype, đây chính là việc khai báo hàm ở Trên hàm main(). Trong nhiều tài liệu đề cập tới Khai báo nguyên mẫu hàm - Function Prototype, thường có ví dụ khai báo hàm ở trên main() và định nghĩa hàm cũng ở trên main() ngay sau phần khai báo. Việc này không sai nhưng nó lại làm mất đi mục đích khai báo hàm là làm cho mã dễ đọc hơn.

Đây là ví dụ khi mọi thứ đều ở trên main()

#include <stdio.h>

//Khai báo nguyên mẫu-function prototype
void loiChao();
int tinhTong(int, int, int);
long long giaiQuyet(int, long long);

void loiChao(){
    printf("Xin chào Dat Viet Lap Trinh\n");
}

int tinhTong(int a, int b, int c){
    return a + b + c;
}

long long giaiQuyet(int a, long long b){
    return 2 * a + 3 * b;
}


int main(){
    loiChao();
    printf("%d\n", tinhTong(10, 20, 30));
    printf("%lld\n", giaiQuyet(10, 20));
    return 0;
}


Đây là ví dụ khai báo hàm ở trên main() và định nghĩa hàm ở dưới main()

#include <stdio.h>

//Khai báo nguyên mẫu-function prototype
void loiChao();
int tinhTong(int, int, int);
long long giaiQuyet(int, long long);



int main(){
    loiChao();
    printf("%d\n", tinhTong(10, 20, 30));
    printf("%lld\n", giaiQuyet(10, 20));
    return 0;
}


void loiChao(){
    printf("Xin chào Dat Viet Lap Trinh\n");
}

int tinhTong(int a, int b, int c){
    return a + b + c;
}

long long giaiQuyet(int a, long long b){
    return 2 * a + 3 * b;
}

Chạy thử hai chương trình (Bắt đầu từ đây, chúng ta tạm biệt chương trình Tào Lao) đều ra kết quả như nhau. Nhưng rõ ràng ví dụ sau dễ hiểu, dễ dọc và dễ sửa lỗi hơn.

Nói chung bạn nên tập một phong cách viết code giống ví dụ thứ hai ngay từ đầu. 

  • Đầu tiên hãy viết hàm main()
  • Sau đó dù chưa biết cụ thể một hàm nào đó sẽ có các lệnh bên trong thế nào, hãy khai báo trước bên trên main().
  • Tiếp theo ta mới viết cụ thể định nghĩa hàm bên dưới hàm main().
  • Cuối cùng gọi hàm trong main() 

Ví dụ bạn muốn viết chương trình đóng mở mái che vườn rau tự động, bạn sẽ viết dòng code đầu tiên là 

main(){

}

Sau đó bạn sẽ nghĩ ràng cần một hàm đóng mái che, một hàm mở mái che, một hàm đo nhiệt độ, độ ẩm, một hàm tưới cây, một hàm ngừng tưới cây...

Bạn sẽ tiếp tục viết code phía trên main()

void dongMai();

void moMai();

void doDac();

void tuoiNuoc();


.....

main(){

}

 

Sau đó bạn mới viết code cụ thể từng hàm bên dưới main()

 

Phần tiếp theo

Phần trước

Không có nhận xét nào:

Đăng nhận xét