Trong bài viết này chúng ta sẽ cùng tìm hiểu về Hàm và cách sử dụng trong lập trình C/C++, với những nội dung sau:
- Khái quát về các giai đoạn phát triển lập trình.
- Hàm là gì? Và ý nghĩa của nó.
- Cú pháp khai báo và nguyên tắc hoạt động của hàm.
- Các bước để viết 1 hàm và ví dụ minh họa.
1. Khái quát về các giai đoạn phát triển lập trình
Đến nay, lập trình đã trải qua 3 giai đoạn:
- Lập trình tuyến tính: Là viết hết toàn bộ chương trình vào 1 hàm duy nhất gọi là hàm main.
- Lập trình thủ tục, hàm: Là chia chương trình nhỏ ra thành các chương trình con. Khắc phục được nhược điểm của lập trình tuyến tính, sẽ làm cho chương trình trở nên gọn gàng, dễ bảo trì, dễ quản lý và có thể tái sử dụng được source code.
- Lập trình hướng đối tượng.
2. Hàm là gì? Và ý nghĩa của nó.
– Hàm là một nhóm các câu lệnh cùng xử lý một nhiệm vụ cụ thể nào đó. Mỗi chương trình có ít nhất 1 hàm – main().
・ Hàm có thể là hàm có sẵn của hệ thống như strlen(), memcpy(),… hoặc hàm do người lập trình tự định nghĩa như tinhTong(), nhapGiaTri(),…
・ Trong một chương trình thì các hàm cần phải có tên khác nhau để phân biệt chức năng mà nó thực hiện.
・ Trong C/C++ chương trình con chỉ tồn tại dưới 1 dạng duy nhất là hàm chứ không có thủ tục.
Đọc thêm: Nguyên mẫu hàm trong C/C++ là gì? Và cách sử dụng.
– Ý nghĩa của hàm: Hàm là một chương trình con thực hiện một khối công việc được lặp đi lặp lại nhiều lần trong khi chạy chương trình hoặc dùng tách một khối công việc cụ thể để chương trình đỡ phức tạp.
- Dễ bảo trì, dễ quản lý: Việc chia nhỏ 1 chương trình lớn thành các hàm sẽ giúp chúng ta dễ quản lý, khi cần bảo trì hay nâng cấp thì dễ dàng và nhanh chóng chỉ cần chỉnh sửa tại chức năng mà hàm đó đảm nhận.
- Có thể tái sử dụng code: nếu trong chương trình có một số lệnh, hoặc công việc nào đó có xử lý giống hoặc tương tự nhau cần lặp đi lặp lại nhiều lần ở các vị trí khác nhau, để khỏi mất thời gian và công sức sao chép những dãy lệnh đó chúng ta nên tổ chức và xây dựng nó thành một hàm, chỗ nào trong chương trình cần thực hiện công việc đó thì chỉ cần gọi hàm đó mà thôi.
3. Cú pháp khai báo và nguyên tắc hoạt động của hàm
■ 1.Cú pháp khai báo:
<Kiểu dữ liệu trả về> <Tên hàm>( <Danh sách tham số nếu có> ) { // Các câu lệnh thực hiện //... <return Giá trị trả về nếu có> }
*** Trong đó:
- Kiểu dữ liệu trả về: là kiểu giá trị mà hàm trả về. Một hàm có thể trả về hoặc không trả về giá trị nào:
・ Kiểu trả về có thể là: int, float, bool, char,…
・ Không trả về giá trị gì thì sẽ dùng: void - Tên hàm: Nên đặt tên gợi nhớ đến công việc/ xử lý mà hàm thực hiện.
- Danh sách tham số nếu có: Mỗi hàm có thể có 1, hoặc nhiều, hoặc không có tham số. Tham số gồm [Kiểu dữ liệu và tên biến dùng làm tham số]
- Các câu lệnh thực hiện: là tập hợp các câu lệnh xác định nhiệm vụ của hàm.
- Giá trị trả về nếu có: Nếu <Kiểu dữ liệu trả về> là void thì sẽ không có return, khác void thì có return giá trị về kiểu dữ liệu tương ứng đó.
*** Tham số truyền cho hàm sẽ gồm 3 loại (sẽ được trình bày chi tiết ở bài Cách truyền tham trị, tham chiếu trong lập trình C/C++)
- Tham trị
- Tham chiếu
- Con trỏ
■ 2.Nguyên tắc hoạt động của hàm:
- Khi hàm được gọi ở bất kỳ chỗ nào trong chương trình thì hàm sẽ bắt đầu được thực hiện, tức sẽ rời chỗ đó để đi đến thực hiện hàm được gọi.
- Nếu là hàm có tham số thì chương trình sẽ thực hiện truyền tham số thực cho các tham số hình thức tương ứng trong hàm.
- Chương trình bắt đầu thực hiện lần lượt các câu lệnh trong thân hàm đến khi nào lệnh return hoặc dấu kết thúc hàm } thì dừng lại, và thoát khỏi hàm trở về vị trí chương trình đã gọi nó và thực hiện tiếp các câu lệnh của chương trình.
- Nếu hàm trả về giá trị thì giá trị của biểu thức return trong hàm sẽ là giá trị của hàm.
4. Các bước để viết 1 hàm và ví dụ minh họa
■ Các bước để viết 1 hàm:
- Xác định xem hàm đó có trả về giá trị hay không? Nếu không thì sử dụng Kiểu là void, nếu có thì giá trị trả về thuộc loại kiểu dữ liệu nào: int/ float/ char/ bool/ …
- Xác định xem hàm đó làm công việc gì? Để đặt tên hàm cho nó gợi nhớ tới công việc hàm sẽ thực hiện.
- Xác định xem tham số trong hàm cần những gì? Để mà hỗ trợ trong quá trình xử lý tính toán.
- Cài đặt cho hàm, tức là định nghĩa hàm.
■ Ví dụ: nhập vào 2 số nguyên a, b. Tính tổng, hiệu của 2 số nguyên đó.
#include <conio.h>
/* B1. Hàm có trả về giá trị kiểu int
* B2. Hàm tính tổng 2 số => tên hàm TinhTong, hoặc TinhTong2So
* B3. Vì hàm tính tổng 2 số nên cần tham số là 2 biến kiểu nguyên
*/
int TinhTong(int a, int b)
{
/* B4. Định nghĩa hàm */
int tong = a + b;
return tong;
}
/* Hàm tính hiệu 2 số */
int TinhHieu(int a, int b)
{
return a – b;
}
int main()
{
// Khai báo biến
int a, b, tong, hieu;
// Nhập 2 số nguyên
printf( "Nhap vao a = " );
scanf_s( "%d", &a );
printf( "Nhap vao b = " );
scanf_s( "%d", &b );
tong = TinhTong( a, b );
printf( "Tong cua 2 so la: %d\n", tong );
hieu = TinhHieu( a, b );
printf( "Hieu cua 2 so la: %d\n", hieu );
getch();
return 0;
}
[/code]
– Ở ví dụ trên ta thấy, ở phần nhập số nguyên thì code là giống nhau chỉ khác nhau 2 chữ a, b. Giả sử muốn nhập vào 5 số thì cần copy-paste 5 lần. Do đó ta nên viết phần nhập số nguyên thành 1 hàm để có thể tái sử dụng code và tránh trùng lặp.
Để làm được điều này thì sau khi đọc bài viết Cách truyền tham trị, tham chiếu trong lập trình C/C++ các bạn làm thử xem sao nhé.
[…] Hàm và thủ tục trong lập trình C […]
[…] Ở bài viết trước chúng ta đã biết được khái niệm Hàm là gì và và cách sử dụng hàm trong lập trình C/C++. Trong bài viết này sẽ trình bày một trong những tính năng quan trọng khác của […]