Hàm là một trong những cấu trúc cực kỳ quan trọng trong lập trình. Việc sử dụng hàm trong lập trình sẽ diễn ra rất thường xuyên. Vì vậy nắm, hiểu “hàm là gì? cách khai báo và sử dụng hàm trong C++” sẽ đóng vai trò then chốt trong việc học lập trình của bạn. Vậy thì bây giờ, chúng ta hãy cùng nhau tìm hiểu vấn đề này nhé.
Hàm là gì?
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định sau đó trả về giá trị cho chương trình gọi nó, hay nói cách khác hàm là sự chia nhỏ của chương trình.
Đọc khái niệm trên, bạn có hiểu gì không? Có lẽ nếu bạn là người đã biết về lập trình qua các ngôn ngữ khác thì mình nghĩ bạn sẽ hiểu. Nhưng với những bạn mới học thì chắc sẽ thấy khó hiểu quá nhỉ? Để dễ hiểu hơn, mình sẽ lấy ví dụ như thế này:
➤ Ví dụ: Giả sử có 10 bạn đều thích uống trà sữa trân châu. Lẽ ra cả 10 bạn này đều phải đi mua trà, sữa, bột (làm trân châu),… để pha chế trà sữa. Nhưng như thế thì sẽ khá mất công đúng không nhỉ? Thay vì vậy, 10 bạn này chỉ cần gọi “trà sữa trân châu” từ một cửa hàng nào đó là đã có trà sữa để uống rồi.
Tóm lại qua tất cả các phần trên, bạn có thể hiểu hàm như sau: gọi hàm “trà sữa trân châu” để được cửa hàng thực hiện công việc “pha chế trà sữa” cho bạn. Cuối cùng, “ly trà sữa” chính là kết quả mà bạn nhận được từ việc pha chế.
Khái niệm hàm
Từ những phân tích ở trên, mình tóm lược lại khái niệm hàm qua những ý như sau:
- Hàm là một khối lệnh được xây dựng để thực hiện một chức năng cụ thể nào đó. Ví dụ: pha chế trà sữa trân châu.
- Hàm luôn luôn được xác định bởi một tên gọi cụ thể. Mọi thao tác với hàm đều sẽ được thực hiện thông qua tên gọi này. Ví dụ: “Trà sữa trân châu”.
- Thông thường, chúng ta sẽ có 2 dạng cơ bản:
- Hàm: sau khi thực hiện một chức năng cụ thể, hàm trả ra bên ngoài một giá trị nào đó. Ví dụ: “những ly trà sữa đã được pha chế hoàn tất”.
- Thủ tục: là một trường hợp của hàm sau khi thực hiện một chức năng cụ thể, thủ tục không trả ra bên ngoài bất kỳ giá trị nào.
Mục đích việc xây dựng và sử dụng hàm
- Khi có một công việc giống nhau cần thực hiện ở nhiều vị trí.
- Khi cần chia một chương trình lớn phức tạp thành các đơn thể nhỏ (hàm con) để chương trình được trong sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán và giải quyết vấn đề.
Tóm lại, sử dụng hàm sẽ giúp cho chương trình của bạn rõ ràng, xúc tích, ngắn gọn và tiện lợi hơn rất nhiều.
Cú pháp xây dựng hàm
Để xây dựng một hàm trong C++, bạn cần khai báo theo cú pháp tổng quát như sau:
Trong cú pháp trên, bạn lưu ý những thành phần nào đặt trong cặp dấu ngoặc vuông “[ ]” là nhưng thành phần có thể khuyết (tuỳ trường hợp và ngữ cảnh mà linh động sử dụng). Còn những thành phần đặt trong cặp dấu nhọn “< >” là những thành phần bắt buộc phải có khi khai báo hàm. Ngoài ra
- Kiểu dữ liệu trả về của hàm (kết quả của hàm/ đầu ra), gồm 2 loại:
- void: Không trả về giá trị nào cả (dạng này chính là thủ tục).
- float / int / long / char * / kiểu cấu trúc / … : Trả về giá trị kết quả có kiểu dữ liệu tương ứng với bài toán (chỉ trả về được 1 giá trị theo kiểu dữ liệu).
- Tên hàm: Đặt tên theo qui ước sao cho phản ánh đúng chức năng thực hiện của hàm.
- Danh sách các tham số (nếu có): đây chính là các tham số hình thức. Những tham số này sẽ nhận giá trị thực bằng cách truyền tham số mỗi khi hàm này được gọi đến. Nếu có nhiều tham số thì phải có dấu phẩy (,) để phân cách. Trong trường hợp hàm không có tham số thì vẫn phải để cặp dấu ngoặc đơn.
➤ Lưu ý: các tham số (nếu có) sẽ được khai báo tương tự khai báo biến. Nghĩa là mỗi tham số cũng phải có kiểu dữ liệu và tên tham số.
Sử dụng hàm
Sau khi khai báo và xây dựng hàm, việc gọi sử dụng hàm lại khá đơn giản. Bạn chỉ cần gọi tên hàm và truyền các tham số thực, như cú pháp sau:Trong trường hợp hàm có trả ra ngoài một kết quả nào đó, thì bạn sẽ cần khai báo biến có kiểu dữ liệu tương ứng với kiểu dữ liệu của hàm để nhận kết quả trả về. Như bên dưới:
Trong trường hợp hàm không có tham số thì vẫn phải để cặp dấu ngoặc đơn.
Có lẽ đọc nãy giờ bạn vẫn chưa mường tượng được cách sử dụng đâu nhỉ? Thôi thì hãy cứ xem kỹ lại một lần nữa, sau đó mình cùng làm ví dụ minh hoạ để hiểu rõ hơn nhé.
Ví dụ minh hoạ
Trong phần này, mình sẽ làm 02 ví dụ để minh hoạ cho 02 trường hợp hàm và thủ tục nhé.
Ví dụ 1
Bài toán trên rất đơn giản phải không nào? Dù là đơn giản, nhưng mình hãy cứ thử phân tích một xíu nhé.
- Đầu vào: một số nguyên n (đây chính là dữ liệu để chúng ta xác định tham số cho hàm).
- Đầu ra: in ra các ước số của n (đây chính là dữ liệu để chúng ta xác định kiểu dữ liệu trả về của hàm). Tuy nhiên, trong trường hợp này là “in” ra màn hình, vì thế mà sẽ không trả về một giá trị nào cả. Do đó chúng ta sẽ dùng kiểu void cho hàm này.
- Xác định tên hàm: Hàm này có chức năng in ra các ước số của số nguyên n nên có thể đặt là LietKeUocS.
Từ những phân tích ở trên, chúng ta sẽ có chương trình nhau sau:
Trong ví dụ trên, mình đã minh hoạ cách khai báo và sử dụng hàm LietKeUocSo kèm theo các chú thích. Không biết bạn có hiểu ví dụ ở trên không? Cũng giống như ví dụ trà sữa vậy. Khi bạn cần liệt kê các ước số của một số, tương tự như khi bạn muốn uống trà sữa. Lúc này bạn gọi hàm LietKeUocSo, cũng sẽ giống việc bạn gọi “trà sữa trân châu”. Khi đó chương trình sẽ tự tìm đến khối lệnh của hàm LietKeUocSo để thực hiện cho bạn. Bạn thấy đó, hàm chỉ cần viết 01 lần duy nhất nhưng có thể gọi nhiều lần mà không cần phải viết lại. Quá tiện phải không nào?
Ví dụ 2
Tương tự ví dụ trước, chúng ta hãy thử phân tích đã nhé.
- Đầu vào: một số nguyên n (đây chính là dữ liệu để chúng ta xác định tham số cho hàm).
- Đầu ra: tổng S (đây chính là dữ liệu để chúng ta xác định kiểu dữ liệu trả về của hàm). Trong trường hợp này tổng S là kết của của một biểu thức tính tổng các số nguyên. Vì vậy tổng S sẽ phải là một giá trị nguyên nào đó. Từ những phân tích như vậy, hàm sẽ cần trả về một số nguyên dương có kiểu int.
- Xác định tên hàm: Hàm này có chức năng tính tổng của các số nguyên n nên có thể đặt là TongS.
Từ những phân tích ở trên, chúng ta sẽ có chương trình nhau sau:
Điểm khác biệt giữa hàm TongS và hàm LietKeUocSo chính là việc hàm TongS trả giá trị ra bên ngoài bằng lệnh return. Bạn hãy cố gắng đọc các chú thích trong ví dụ trên để hiểu rõ hơn nhé. Nếu có chỗ nào còn thắc mắc thì hãy comment xuống bên dưới để mọi người cùng thảo luận nhé.
Nguyên tắc hoạt động của hàm
Nếu bạn đã đọc kỹ các phần trên thì mình nghĩ rằng bạn cũng đã phần nào hiểu được cách thức mà hàm hoạt động. Nhưng nếu vẫn chưa hiểu thì cũng không sao, chúng ta hãy cùng xem và phân tích thử nguyên tắc hoạt động của hàm, có thể bạn sẽ hiểu rõ hơn đấy.
Chỗ này giải thích thì hơi dài dòng, thôi thì chúng ta hãy cùng xem từng bước debug chương trình để hiểu hơn nhé.
Tổng kết
Trong cả 02 ví dụ trên, mình sẽ không chạy thử chương trình. Thay vào đó, mình muốn bạn hãy xem, ngẫm nghĩ, làm lại rồi tự chạy thử chương trình để xem kết quả như thế nào nhé. Đến thời điểm này, mình nghĩ bạn đã có thể tự làm được những việc như vậy.
Bài viết này mình sẽ tạm dừng ở đây, nội dung bài viết mới chỉ hướng dẫn bạn khai báo và sử dụng hàm ở khía cạnh cơ bản. Vì vậy mình mong muốn bạn hãy đọc thật kỹ và cố gắng vận dụng, phải hiểu được bài này đã rồi chúng ta mới có thể đi tiếp được. Nếu có bất kỳ vấn đề nào thắc măc thì đừng ngần ngại gì mà hãy comment ngay bên dưới để cùng thảo luận bạn nhé.