Lập trình C++ / C# — August 19, 2016 at 3:08 am

Hàm là gì? Cách khai báo một hàm như thế nào?

by

Trong bài viết này chúng ta sẽ đi tìm hiểu về hàm là gì, chức năng của hàm và cách khai báo một hàm như thế nào. Hãy cùng nhau theo dõi nhé các bạn.

Trước tiên, ta sẽ đến với cấu trúc của hàm, gồm phần khai báo và mô tả hàm hay nguyên mẫu hàm (Prototype) và phần cài đặt hàm (Implementation).

Khai báo và mô tả hàm (prototype):

  • <Kiểu dữ liệu trả về>: là kiểu dữ liệu trả về của một hàm (char, int, float, …). Nếu hàm không trả về giá trị nào thì nó có kiểu float
  • <Tên hàm>: Tên của hàm
  • <Danh sách tham số>: Danh sách các tham số được truyền cho hàm, mỗi tham số có kiểu dữ liệu và cách nhau bằng dấu phẩy

Cài đặt hàm (Implementation):

Untitled-280

Có vẻ hơi khó hiểu phải không các bạn? Đừng lo, với một vài ví dụ sau, bạn sẽ nhận ra vấn đề ngay thôi

Ví dụ: Viết chương trình tính tổng 2 số nguyên a = 15 và b = 10. Yêu cầu viết riêng hàm tính tổng

#include <stdio.h>
#include <conio.h>int TinhTong(int a, int b); // prototype của hàm TinhTong

int main()
{
int a = 15, b = 10, kq;
kq = TinhTong(a, b); // Gọi hàm TinhTong và gán giá trị của hàm cho biến kq
printf(“\nTong la: %d”, kq);
getch();
return 0;
}

int TinhTong(int a, int b) // Implementation của hàm TinhTong
{
return a + b;
}

Chạy chương trình:

Untitled-281

Nào, ta hãy cùng phân tích chi tiết về ví dụ này nhé:

  • int TinhTong(int a, int b); : đây chính là phần khai báo và mô tả hàm hay nguyên mẫu hàm (Prototype). Ta thấy rằng hàm có kiểu dữ liệu trả về là int (vì phép cộng hai biến kiểu nguyên cũng cho ra kiểu nguyên). Ngoài ra, ta còn đưa vào đây vấn đề mới, đó là tham số. Vì cộng hai biến nguyên, nên ta đưa vào hàm hai tham số có kiểu int và đặt tên là a và b. Cuối cùng, sau Prototype của hàm là dấu chấm phẩy.
int main()
{}

Đây chính là hàm main, hàm mà bất cứ chương trình C nào cũng phải có mặt. Trình biên dịch luôn bắt đầu từ hàm main, sau đó dựa trên các câu lệnh có trong hàm để biên dịch chương trình

Tiếp theo, hãy khoan tiếp tục với hàm main, chúng ta sẽ nhìn xuống dưới và thấy:

int TinhTong(int a, int b) // Implementation của hàm TinhTong
{
return a + b;
}

Đây là phần cài đặt hàm (Implementation) của hàm TinhTong. Điểm khác biệt cơ bản nhất giữa nguyên mẫu hàm (Prototype) và Cài đặt hàm (Implementation) đó chính là kết thúc phần nguyên mẫu hàm sẽ là dấu chấm phẩy (;), còn phần cài đặt hàm thì không. Hàm sẽ trả về giá trị là tổng của hai số nguyên (tức return a + b; ). Lưu ý kiểu trả về phải cùng với kiểu của hàm, nếu khác kiểu chương trình sẽ báo lỗi

Quay trở lại hàm main, hầu như chúng ta đều đã được làm quen với các đoạn code trong hàm, ngoại trừ câu lệnh này: kq = TinhTong(a, b);

Câu lệnh này có công dụng như sau: Gọi hàm TinhTong mà ta đã viết, sau đó gán giá trị của hàm TinhTong cho biến kết quả. Ta cần đặc biệt chú ý đến cách gọi hàm: TinhTong(a, b); . Như ta thấy, hàm có hai tham số, và khi gọi hàm ta không được sử dụng kiểu dữ liệu ngay trước tên biến nữa.

Ta hãy nói thêm một chút về cách trình biên dịch (compiler) biên dịch khi có các hàm con. Đầu tiên, chương trình sẽ bắt đầu từ hàm main, nó sẽ duyệt lần lượt các câu lệnh bên trong hàm main cho đến khi gặp một lời gọi hàm (như ví dụ trên là TinhTong(a, b); . Khi gặp một lời gọi hàm, trình biên dịch sẽ rời khỏi hàm main và chuyển đến hàm được gọi. Trình biên dịch tiếp tục làm việc trên hàm được gọi, cho đến khi nhận được giá trị trả về (hàm có giá trị trả về) hoặc kết thúc hàm (hàm không có giá trị trả về) thì quay trở lại hàm main và tiếp tục công việc.

Tiếp theo, ta hãy đến với một ví dụ về hàm không trả về giá trị

Ví dụ: Viết chương trình tính tổng 2 số nguyên a = 15 và b = 10. Yêu cầu viết riêng hàm tính tổng

#include <stdio.h>
#include <conio.h>void TinhTong(int a, int b); // prototype của hàm TinhTong

int main()
{
int a = 15, b = 10;
TinhTong(a, b); // Gọi hàm TinhTong
getch();
return 0;
}

void TinhTong(int a, int b) // Implementation của hàm TinhTong
{
printf(“\nTong la: %d”, a+b);
}

Chạy chương trình:

Untitled-281

Đây là cách sử dụng hàm không trả về giá trị. Các hàm dạng này thường được khai báo là void.

 

Ngoài ra, còn cách viết không sử dụng phần nguyên mẫu hàm (Prototype), như sau:

#include <stdio.h>
#include <conio.h>void TinhTong(int a, int b)
{
printf(“\nTong la: %d”, a+b);
}

int main()
{
int a = 15, b = 10;
TinhTong(a, b); // Gọi hàm TinhTong
getch();
return 0;
}

Cách viết này sẽ loại bỏ phần nguyên mẫu hàm (Prototype) và đưa phần Cài đặt hàm (Implementation) lên trước hàm main. Các bạn có thể sử dụng một trong hai cách viết đều được.

Hàm đóng vai trò vô cùng quan trọng khi viết một chương trình, nó giúp cho các lập trình viên dễ dàng quản lý và làm cho chương trình của mình gọn gàng hơn không bị rối. Hy vọng bài viết này sẽ hữu ích dành cho bạn đọc.

Nguồn: tuhocit

Leave a Comment

Your email address will not be published. Required fields are marked *