Lập trình C

Hàm và cách sử dụng trong lập trình C/C++

Hàm và cách sử dụng trong lập trình C/C++
Được viết bởi Minh Hoàng

Series lập trình C, ngôn ngữ lập trình hệ thống mạnh mẽ.

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:

  1. Khái quát về các giai đoạn phát triển lập trình.
  2. Hàm là gì? Và ý nghĩa của nó.
  3. Cú pháp khai báo và nguyên tắc hoạt động của hàm.
  4. Các bước để viết 1 hàm và ví dụ minh họa.
  5. Nguyên mẫu hàm là gì? Và cách sử dụng.
1. Khái quát về các giai đoạn phát triển lập trình
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:

  1. 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.
  2. 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.
  3. Lập trình hướng đối tượng.
2. Hàm là gì? Và ý nghĩa của nó.
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.

– Ý 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
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++)

  1. Tham trị
  2. Tham chiếu
  3. Con trỏ

■ 2.Nguyên tắc hoạt động của hàm:

  1. 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.
  2. 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.
  3. 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.
  4. 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
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:

  1. 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/ …
  2. 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.
  3. 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.
  4. 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 <stdio.h>
#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;
}

– Ở 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é.

5. Nguyên mẫu hàm là gì? Và cách sử dụng
5. Nguyên mẫu hàm là gì? Và cách sử dụng

Nguyên mẫu hàm (Function Prototype) cung cấp cho trình biên dịch (compiler) tên của hàm, kiểu dữ liệu mà hàm trả về, số lượng các tham số của hàm (gồm kiểu dữ liệu và thứ tự của các tham số đó). Nhờ đó, hàm nguyên mẫu giúp cho trình biên dịch xác nhận các lời gọi hàm mà chưa cần định nghĩa hàm đó.

– Cách khai báo và vị trí đặt của nguyên mẫu hàm:
■ 1.Cách khai báo:

// Trường hợp hàm không có tham số
Kiểu_dữ_liệu_trả_về Tên_hàm();

// Trường hợp hàm có tham số
Kiểu_dữ_liệu_trả_về Tên_hàm( Kiểu_dữ_liệu_1 tham_số_1, ..., Kiểu_dữ_liệu_n tham_số_n );

// Hoặc khai báo ngắn gọn, không cần ghi tên tham số
Kiểu_dữ_liệu_trả_về Tên_hàm( Kiểu_dữ_liệu_1, ..., Kiểu_dữ_liệu_n );

Ví dụ:
・ TinhTong( int a, int b );
・ TinhHieu( int, int );
・ HoanVi( int &, int & );
・ RemoveExtension( char *, bool );

■ 2.Vị trí đặt của nguyên mẫu hàm:
Nguyên mẫu hàm khi khai báo cần phải được đặt trên/ đặt trước lời gọi hàm tức là trước hàm gọi nó thực hiện. (Xem ví dụ mình họa bên dưới)

– Nguyên mẫu hàm được sử dụng khi nào?

・ Ở ví dụ ở mục 4. ta thấy 2 hàm TinhTong va TinhHieu 2 số nguyên được đặt trên hàm main() (tức là hàm gọi) thì không cần khai báo nguyên mẫu hàm. Vì chương trình chạy từ trên xuống dưới thì trình biên dịch (compiler) đã nhận biết dc sự có mặt của 2 hàm này rồi, nên ở hàm main() có lời gọi hàm TinhTong, TinhHieu sẽ được thực hiện được bình thường.

・ Dùng nguyên mẫu hàm khi:
■ 1.Khi hàm thực hiện chức năng (TinhTong, TinhHieu) được định nghĩa dưới hàm (main) gọi nó.

#include <stdio.h>

// Khai báo nguyên mẫu hàm trước khi nó được gọi
// Lưu ý: Có dấu ; khi kết thúc khai báo
int TinhTong(int a, int b);
int TinhHieu(int, int);

int main()
{
	// Khai báo biến
	int a, b, tong, hieu;

	// Nhập 2 số
	printf( "Nhap vao a = " );
	scanf_s( "%d", &a );

	printf( "Nhap vao b = " );
	scanf_s( "%d", &b );

	// Thực hiện lời gọi hàm
	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);

	getchar();

	return 0;
}

// Định nghĩa hàm
int TinhTong(int a, int b)
{
	return a + b;
}

int TinhHieu(int a, int b)
{
	return a - b;
}

■ 2.Khi các hàm được tổ chức trong các file khác nhau, có nghĩa là mỗi hàm sẽ được viết trong từng file riêng biệt. Ví dụ các file trong chương trình được tổ chức như hình bên dưới:

Cấu trúc các file của chương trình

Cấu trúc các file của chương trình

– Trong đó:

  • File NguyenMauHam.h : Khai báo các nguyên mẫu hàm
  • File TinhTong.c : chứa định nghĩa của hàm tính tổng 2 số
  • File TinhHieu.c : chứa định nghĩa của hàm tính hiệu 2 số
  • File Main.c : hàm main() thực hiện chương trình

– Nội dung của các file như sau:

*** File NguyenMauHam.h

#ifndef NGUYEN_MAU_HAM
#define NGUYEN_MAU_HAM

// Nguyên mẫu hàm tính tổng 2 số
int TinhTong(int a, int b);

// Nguyên mẫu hàm tính hiệu 2 số
int TinhHieu(int, int);

#endif

*** File TinhTong.c

#include <stdio.h>

// include file header khai báo nguyên mẫu hàm
#include "NguyenMauHam.h"

// Hàm tính tổng 2 số
int TinhTong(int a, int b)
{
	return a + b;
}

*** File TinhHieu.c

#include <stdio.h>

// include file header khai báo nguyên mẫu hàm
#include "NguyenMauHam.h"

// Hàm tính hiệu 2 số
int TinhHieu(int a, int b)
{
	return a - b;
}

*** File Main.c

#include <stdio.h>

// include file header khai báo nguyên mẫu hàm
// trước khi 2 hàm TinhTong, TinhHieu được gọi bên trong hàm main()
#include "NguyenMauHam.h"

int main()
{
	// Khai báo biến
	int a, b, tong, hieu;

	// Nhập 2 số
	printf( "Nhap vao a = " );
	scanf_s( "%d", &a );

	printf( "Nhap vao b = " );
	scanf_s( "%d", &b );

	// Thực hiện lời gọi hàm
	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);

	getchar();

	return 0;
}
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi! Minh Hoàng Blog | Nào cùng vui hehe


Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp người đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[…]

Bình luận của bạn

1 bình luận cho bài viết "Hàm và cách sử dụng trong lập trình C/C++"

avatar
Sắp xếp theo:   Mới nhất | Cũ nhất | Thích nhiều nhất
trackback

[…] Hàm và thủ tục trong lập trình C […]

wpDiscuz
Chúc bạn có một cuộc sống ngoại hạng!