Chuyển tới nội dung
Home » Hàm Int Trong C | Khai Báo Hàm Trong C

Hàm Int Trong C | Khai Báo Hàm Trong C

#6 [Lập Trình C]. Hàm Trong Ngôn Ngữ Lập Trình C

Khai báo hàm trong C++

Một khai báo hàm cho trình biên dịch biết về tên hàm và cách gọi hàm. Cơ thể thực tế của hàm có thể được định nghĩa riêng.

Một khai báo hàm có các phần sau:

return_type function_name(parameter list);

Đối với hàm được định nghĩa ở trên max (), khai báo hàm như sau:

int max(int num1, int num2);

Tên tham số không quan trọng trong khai báo hàm chỉ loại của chúng là bắt buộc, vì vậy sau đây cũng là khai báo hợp lệ:

int max(int, int);

Khai báo hàm là bắt buộc khi bạn định nghĩa một hàm trong một tệp nguồn và bạn gọi hàm đó trong một tệp khác. Trong trường hợp này, bạn nên khai báo hàm ở đầu tệp gọi hàm.

Gọi một hàm trong C

Hàm trong lập trình C hoạt động như thế nào? Hình ảnh sau đây mô tả gọi một hàm do người dùng định nghĩa bên trong hàm main():

Trong khi tạo một hàm C, bạn đưa ra một định nghĩa về chức năng của hàm. Để sử dụng một hàm, bạn sẽ phải gọi hàm đó để thực hiện tác vụ được xác định.

Khi một chương trình gọi một hàm, điều khiển chương trình được chuyển đến hàm được gọi. Một hàm được gọi thực hiện một nhiệm vụ đã định nghĩa và khi câu lệnh trả về của nó được thực hiện hoặc khi nó kết thúc bằng hàm đóng, nó sẽ trả về chương trình điều khiển quay trở lại chương trình chính.

Để gọi một hàm, bạn chỉ cần chuyển các tham số bắt buộc cùng với tên hàm và nếu hàm trả về một giá trị, thì bạn có thể lưu trữ giá trị trả về. Ví dụ:

#include

/* khai bao ham */ int max(int num1, int num2); int main () { /* dinh nghia bien local */ int a = 100; int b = 200; int ret; /* goi mot ham de lay gia tri lon nhat */ ret = max(a, b); printf( “Max value is : %d\n”, ret ); return 0; } /* ham tra ve gia tri lon nhat giua hai so */ int max(int num1, int num2) { /* dinh nghia bien local */ int result; if (num1 > num2) result = num1; else result = num2; return result; }

Kết quả:

Max value is : 200

#6 [Lập Trình C]. Hàm Trong Ngôn Ngữ Lập Trình C
#6 [Lập Trình C]. Hàm Trong Ngôn Ngữ Lập Trình C

Khai báo hàm trong C

Một khai báo hàm cho trình biên dịch biết về tên hàm và cách gọi hàm. Cơ thể thực tế của hàm có thể được định nghĩa riêng.

Một khai báo hàm có các phần sau:

return_type function_name(parameter list);

Đối với hàm được định nghĩa ở trên max (), khai báo hàm như sau:

int max(int num1, int num2);

Tên tham số không quan trọng trong khai báo hàm chỉ loại của chúng là bắt buộc, vì vậy sau đây cũng là khai báo hợp lệ:

int max(int, int);

Khai báo hàm là bắt buộc khi bạn định nghĩa một hàm trong một tệp nguồn và bạn gọi hàm đó trong một tệp khác. Trong trường hợp này, bạn nên khai báo hàm ở đầu tệp gọi hàm.

Các hàm trong C

Sau khi đã biết các định nghĩa sử dụng trong hàm C, sau đây chúng ta sẽ cùng tìm hiểu các loại hàm trong C nhé.Trong C có 3 loại hàm, đó là hàm main trong C, các hàm có sẵn trong C, và hàm C do người dùng định nghĩa.

Hàm main trong C

Trong ngôn ngữ C, một chương trình là một tập hợp các hàm, với mỗi hàm trong chương trình là “tập hợp các quy trình” cần xử lý. Và trong các hàm đó thì hàm main() trong C là hàm đầu tiên được thực thi khi bắt đầu chạy một chương trình C.

Chi tiết về hàm main() đã được Kiyoshi trình bày chi tiết ở bài viết sau đây:

  • Xem thêm: Hàm main trong C

Các hàm có sẵn trong C

Các hàm có sẵn trong C là các hàm được chuẩn bị sẵn trong các thư viện chuẩn của C. Các hàm này được tích hợp bên trong các header file, ví dụ như hàm strlen() tích hợp trong header file [string.h] chẳng hạn.

Các hàm này mặc dù đã được chuẩn bị sẵn, nhưng chúng ta chỉ có thể thực thi chúng trong chương trình C, nếu chúng ta gọi chúng bên trong hàm main() mà thôi.

Lại nữa, để sử dụng được các hàm có sẵn này, chúng ta cần phải thêm (include) các header file này vào đầu mỗi chương trình.

Ví dụ, các hàm như hàm print(), hàm scanf() v.v.. đều là các hàm có sẵn trong tích hợp trong header file [stdio.h], hay hàm strlen() lại được tích hợp trong header file [string.h], và chúng ta cần include các file này trong chương trình như sau:

Kết quả:

Nhap chuoi ky tu: abc

Hàm C do người dùng định nghĩa

Hàm C do người dùng định nghĩa (user-defined functions)) là các hàm mà chúng ta tự mình tạo ra bằng cách khai báo chúng trong chương trình. Sau khi khai báo hàm, chúng ta có thể sử dụng chúng trực tiếp trong chương trình bằng cách gọi chúng tại bất kỳ thời điểm nào mà chúng ta muốn.

Hàm C do người dùng định nghĩa có ưu điểm rất lớn, đó là sự tự do điều chỉnh hàm theo ý mà bạn muốn, bởi vì hàm là do bạn tự tạo ra, tự bạn thiết kế và làm chủ nó.

Khác với các ngôn ngữ lập trình khác như Python hay JavaScript với hệ thống phong phú các hàm có sẵn, giúp chúng ta thực thi dễ dàng hầu như tất cả các xử lý cần có trong chương trình, thì trong ngôn ngữ C, phần lớn các xử lý cần thiết trong chương trình đều không có hàm có sẵn tương ứng trong thư viện chuẩn.

Đây cũng là cái khó, nhưng cũng là điểm thú vị khi lập trình bằng ngôn ngữ C. Khó là ở chỗ chúng ta hầu như phải tự tạo ra tất cả các hàm để có thể xử lý trong chương trình, và thú vị ở đây là ở chỗ, chúng ta có thể tự do trong việc viết chương trình, cũng như tìm được niềm vui thông qua việc tự lập trình hàm.

Cách khai báo hàm trong C cũng khá là đơn giản, chúng ta viết kiểu dữ liệu trả về từ hàm trước, sau đó đến tên hàm, rồi kiểu và tên biến sử dụng trong hàm, và cuối cùng là các xử lý trong hàm nằm giữa cặp ngoặc nhọn

{}

.

Ví dụ chính là hàm tính tổng mà chúng ta đã sử dụng ở trên.

int find_sum(int a,int b){

Cách sử dụng hàm C do người dùng định nghĩa cũng giống như các hàm khác, sau khi bạn đã khai báo hàm xong, chỉ cần gọi tên hàm khi cần sử dụng là xong.

  • Chi tiết về cách khai báo và gọi hàm trong c, bạn hãy xem tại bài viết Khai báo và gọi hàm trong C.
Lập trình C - 27. Khái niệm về hàm trong lập trình C, kiểm tra số nguyên tố | Tự học lập trình C
Lập trình C – 27. Khái niệm về hàm trong lập trình C, kiểm tra số nguyên tố | Tự học lập trình C

Gọi một hàm trong C++

Hàm trong lập trình C++ hoạt động như thế nào? Hình ảnh sau đây mô tả gọi một hàm do người dùng định nghĩa bên trong hàm main():

Trong khi tạo một hàm C, bạn đưa ra một định nghĩa về chức năng của hàm. Để sử dụng một hàm, bạn sẽ phải gọi hàm đó để thực hiện tác vụ được xác định.

Khi một chương trình gọi một hàm, điều khiển chương trình được chuyển đến hàm được gọi. Một hàm được gọi thực hiện một nhiệm vụ đã định nghĩa và khi câu lệnh trả về của nó được thực hiện hoặc khi nó kết thúc bằng hàm đóng, nó sẽ trả về chương trình điều khiển quay trở lại chương trình chính.

Để gọi một hàm, bạn chỉ cần chuyển các tham số bắt buộc cùng với tên hàm và nếu hàm trả về một giá trị, thì bạn có thể lưu trữ giá trị trả về. Ví dụ:

#include

using namespace std; /* khai bao ham */ int max(int num1, int num2); int main () { /* dinh nghia bien local */ int a = 100; int b = 200; int ret; /* goi mot ham de lay gia tri lon nhat */ ret = max(a, b); cout << “Max value is: ” << ret << endl; return 0; } /* ham tra ve gia tri lon nhat giua hai so */ int max(int num1, int num2) { /* dinh nghia bien local */ int result; if (num1 > num2) result = num1; else result = num2; return result; }

Kết quả:

Max value is : 200

Hàm trong C là gì

Trong bài Cấu trúc cơ bản và quy tắc viết chương trình C chúng ta đã biết trong ngôn ngữ C, chương trình là một tập hợp các hàm, với mỗi hàm trong chương trình là “tập hợp các quy trình” cần xử lý. Nói cách khác, ngôn ngữ C sử dụng hàm để tạo nên các chương trình, và hàm chính là thành phần quan trọng bậc nhất lập trình C.

Vậy, hàm trong C là gì?

Hàm trong C là một tập hợp các xử lý nhằm thực hiện một chức năng cụ thể nào đó trong chương trình. Hàm cho phép bạn kết hợp các xử lý khác nhau thành một và đặt tên cho nó. Sau khi tạo và đặt tên cho một hàm, chúng ta chỉ cần gọi tên hàm ra mỗi khi cần sử dụng đến nó trong chương trình.

Bằng cách kết hợp các xử lý lại thành một hàm, chúng ta không cần viết lại các xử lý nhiều lần, qua đó có thể giảm sai sót khi viết code, cũng như có thể tái sử dụng hàm cho một chương trình khác.

Một hàm có thể nhận một giá trị và trả về một giá trị đã trải qua một số xử lý, do đó nó có khả năng tạo ra công suất tối đa chỉ với lượng mã chương trình tối thiểu.

Không quá lời khi nói rằng làm chủ hàm trong C là một kỹ năng cần thiết mà bất kỳ lập trình viên nào cũng cần phải có.

C - Bài 16: Hàm - function.
C – Bài 16: Hàm – function.

Định nghĩa một hàm

Dạng chung của định nghĩa hàm trong C++ như sau:

return_type function_name(parameter list) { // code }

Định nghĩa hàm trong lập trình C++ bao gồm tên hàm và phần thân hàm . Dưới đây là tất cả các phần của hàm:

  • Kiểu trả về: Một hàm có thể trả về một giá trị. Các return_type là kiểu dữ liệu của giá trị hàm trả về. Một số hàm thực hiện các hoạt động mong muốn mà không trả về một giá trị. Trong trường hợp này, return_type là từ khóa void.
  • Tham số: Một tham số giống như một trình giữ chỗ. Khi một hàm được gọi, bạn chuyển một giá trị cho tham số. Giá trị này được gọi là tham số hoặc đối số thực tế. Danh sách tham số tham chiếu đến loại, thứ tự và số tham số của hàm. Các tham số là tùy chọn; có nghĩa là, một hàm có thể không chứa tham số.
  • Thân hàm: Phần thân hàm chứa một tập hợp các câu lệnh xác định chức năng của hàm.

Tên hàm: Đây là tên thực của hàm.

Định nghĩa một hàm

Dạng chung của định nghĩa hàm trong C như sau:

return_type function_name(parameter list) { // body of the function }

Định nghĩa hàm trong lập trình C bao gồm tên hàm và phần thân hàm . Dưới đây là tất cả các phần của hàm:

  • Kiểu trả về: Một hàm có thể trả về một giá trị. Các return_type là kiểu dữ liệu của giá trị hàm trả về. Một số hàm thực hiện các hoạt động mong muốn mà không trả về một giá trị. Trong trường hợp này, return_type là từ khóa void.
  • Tham số: Một tham số giống như một trình giữ chỗ. Khi một hàm được gọi, bạn chuyển một giá trị cho tham số. Giá trị này được gọi là tham số hoặc đối số thực tế. Danh sách tham số tham chiếu đến loại, thứ tự và số tham số của hàm. Các tham số là tùy chọn; có nghĩa là, một hàm có thể không chứa tham số.
  • Thân hàm: Phần thân hàm chứa một tập hợp các câu lệnh xác định chức năng của hàm.

Tên hàm: Đây là tên thực của hàm.

[Lập trình C] Hàm là gì?
[Lập trình C] Hàm là gì?

Ví dụ hàm trong C++

Ví dụ dưới đây là mã nguồn cho một hàm được gọi là max(). Hàm này truyền vào hai tham số num1 và num2 và trả về giá trị lớn nhất giữa hai tham số:

/* hàm trả về giá trị lớn nhất giữa 2 số */ int max(int num1, int num2) { /* khai báo biến local */ int result; if (num1 > num2) result = num1; else result = num2; return result; }

Cấu trúc hàm trong C

Khi học về hàm trong C chúng ta cần nắm rõ cấu trúc hàm gồm 3 thành phần chính, đó là tham số, đối số và giá trị trả về.Để hình dung ra các thành phần có hàm trong C, hãy cùng xem một ví dụ đơn giản về hàm sau đây. Hàm giúp chúng ta tính tổng hai số và trả về kết quả trong chương trình như sau:

int find_sum(int a,int b){

Chúng ta viết kiểu dữ liệu trả về từ hàm trước (trong hàm trên là kiểu int), sau đó đến tên hàm (find_sum), rồi kiểu và tên biến sử dụng trong hàm (int a,int b), và cuối cùng là các xử lý trong hàm nằm giữa cặp ngoặc nhọn

{}

.

Trong hàm trên, các biến có tên như a và b sử dụng khi chúng ta khai báo hàm ở trên được gọi là tham số.

Sau khi khai báo một hàm, chúng ta có thể sử dụng hàm đó bằng cách gọi hàm trong C như dưới đây:

  • Chi tiết về cách khai báo và gọi hàm trong c, bạn hãy xem tại bài viết Khai báo và gọi hàm trong C.

Khi chúng ta gọi hàm trong C, chúng ta truyền các giá trị thực như 1 và 2 ở ví dụ trên vào tham số và tính toán trong hàm. Các giá trị thực được truyền vào khi gọi hàm được gọi là đối số, và việc truyền giá trị thực vào hàm để tính toán gọi là truyền tham số trong C.

Sau khi hàm được thực thi xong, hàm sẽ trả về cho chúng ta một giá trị, và chúng ta gọi đây là giá trị trả về của hàm C.

Hãy cùng tìm hiểu kỹ hơn về tham số, đối số và giá trị trả về trong C ở dưới đây.

Lập trình C - Hàm trong C
Lập trình C – Hàm trong C

Khai báo hàm trong C

Trong phần này, bạn sẽ được tìm hiểu về các phương pháp tiếp cận khác nhau để giải quyết cùng một vấn đề bằng cách sử dụng, khai báo hàm trong C.

4 lập trình dưới đây sẽ kiểm tra xem số nguyên mà người dùng nhập vào có phải là số nguyên tố không.

Đầu ra của tất cả các lập trình dưới đây đều giống nhau, và tôi chỉ tạo một hàm do người dùng xác định trong mỗi ví dụ. Tuy nhiên, cách tiếp cận mà tôi thực hiện trong mỗi ví dụ là khác nhau.

Ví dụ 1: Không có đối số nào được truyền và không có giá trị nào trả về

#include

void checkPrimeNumber();

int main()

checkPrimeNumber(); // argument is not passed

return 0;

// return type is void meaning doesn’t return any value

void checkPrimeNumber()

int n, i, flag = 0;

printf(“Enter a positive integer: “);

scanf(“%d”,&n);

for(i=2; i <= n/2; ++i)

if(n%i == 0)

flag = 1;

if (flag == 1)

printf(“%d is not a prime number.”, n);

else

printf(“%d is a prime number.”, n);

Hàm checkPrimeNumber() nhận đầu vào từ người dùng, kiểm tra xem nó có phải là số nguyên tố hay không và hiển thị nó lên màn hình.

Các dấu ngoặc đơn trống trong câu lệnh checkPrimeNumber (); bên trong hàm main() có nghĩa là không có đối số nào được truyền vào hàm.

Kiểu trả về của hàm là void. Do đó, không có giá trị nào được trả về từ hàm này.

Ví dụ 2: Không có đối số nào được truyền nhưng có giá trị trả về

#include

int getInteger();

int main()

int n, i, flag = 0;

// no argument is passed

n = getInteger();

for(i=2; i<=n/2; ++i)

if(n%i==0){

flag = 1;

break;

if (flag == 1)

printf(“%d is not a prime number.”, n);

else

printf(“%d is a prime number.”, n);

return 0;

// returns integer entered by the user

int getInteger()

int n;

printf(“Enter a positive integer: “);

scanf(“%d”,&n);

return n;

Các dấu ngoặc đơn trống trong câu lệnh n = getInteger(); đồng nghĩa với việc không có đối số nào được truyền cho hàm này. Và giá trị được trả về từ hàm được gán cho n.

Hàm getInteger() nhận đầu vào từ người dùng và trả về nó. Mã nằm trong hàm main() sẽ kiểm tra xem số nhập vào có phải là số nguyên tố hay không

Ví dụ 3: Đối số được truyền nhưng không có giá trị trả về

#include

void checkPrimeAndDisplay(int n);

int main()

int n;

printf(“Enter a positive integer: “);

scanf(“%d”,&n);

// n is passed to the function

checkPrimeAndDisplay(n);

return 0;

// return type is void meaning doesn’t return any value

void checkPrimeAndDisplay(int n)

int i, flag = 0;

for(i=2; i <= n/2; ++i)

if(n%i == 0){

flag = 1;

break;

if(flag == 1)

printf(“%d is not a prime number.”,n);

else

printf(“%d is a prime number.”, n);

Giá trị số nguyên do người dùng nhập vào sẽ được truyền vào hàm checkPrimeAndDisplay()

Hàm checkPrimeAndDisplay() sẽ kiểm tra xem đối số được truyền vào có phải là số nguyên tố hay không và hiển thị thông báo thích hợp.

Ví dụ 4: Đối số được truyền và có giá trị trả về

#include

int checkPrimeNumber(int n);

int main()

int n, flag;

printf(“Enter a positive integer: “);

scanf(“%d”,&n);

// n is passed to the checkPrimeNumber() function

// the returned value is assigned to the flag variable

flag = checkPrimeNumber(n);

if(flag == 1)

printf(“%d is not a prime number”,n);

else

printf(“%d is a prime number”,n);

return 0;

// int is returned from the function

int checkPrimeNumber(int n)

int i;

for(i=2; i <= n/2; ++i)

if(n%i == 0)

return 1;

return 0;

Đầu vào được người dùng nhập vào sẽ được truyền đến hàm checkPrimeNumber ().

Hàm checkPrimeNumber() kiểm tra xem đối số được truyền vào có phải là số nguyên tố hay không.

Nếu đối số được truyền vào là số nguyên tố, hàm trả về 0. Nếu đối số được truyền vào không phải là số nguyên tố, hàm trả về 1. Giá trị trả về được gán cho biến flag.

Tùy thuộc vào việc biến flag là 0 hay 1 thì đầu ra sẽ hiển thị thông báo thích hợp từ hàm main()

Cách tiếp cận nào tốt hơn?

Để đánh giá cách tiếp cận nào tốt hơn thì phải xem xét đến vấn đề mà bạn đang muốn giải quyết. Nhưng trong trường hợp này, truyền đối số và trả về giá trị từ một hàm (ví dụ 4) là tốt nhất.

Một chức năng nên thực hiện một nhiệm vụ cụ thể. Hàm checkPrimeNumber() không thể lấy đầu vào từ người dùng cũng như không thể hiển thị thông báo thích hợp được. Nó chi có chức năng kiểm tra một số có phải là số nguyên tố hay không.

Tham số của hàm trong C

Một hàm sử dụng các danh sách tham số, nó phải khai báo các biến và chấp nhận giá trị các biến này. Các biến này được gọi là các biến chính thức.

Các biến chính thức giống các biến cục bộ khác bên trong hàm.

Khi bạn gọi hàm, có 2 cách để bạn truyền các giá trị vào cho hàm:

Kiểu gọi Mô tả

Gọi bởi giá trị

Phương thức này sao chép giá trị thực sự của tham số vào trong tham số chính thức của một hàm. Trong trường hợp này, các thay đổi của bản thân các tham số bên trong hàm không ảnh hưởng tới các tham số.

Gọi bởi tham chiếu

Phương thức này sao chép địa chỉ của tham số vào trong tham số chính thức. Bên trong hàm, địa chỉ được dùng để truy cập tham số thực sự được sử dụng khi gọi hàm. Có nghĩa là các thay đổi tới tham số làm tham số thay đổi.

Theo mặc định, C sử dụng gọi bởi giá trị để truyền các tham số. Nhìn chung, code đó trong một hàm không thể thay đổi các tham số được dùng để gọi hàm đó và trong ví dụ trên, khi gọi hàm timGTLN() là dùng phương thức tương tự.

Bài trước: Vòng lặp trong lập trình C

Bài tiếp: Quy tắc phạm vi trong lập trình C

Chương trình con (Hàm) trong C - Lớp buổi sáng.
Chương trình con (Hàm) trong C – Lớp buổi sáng.

Hàm trong c – Hàm tự định nghĩa


Kiểu_Dữ_Liệu Tên_Hàm(Tham_Số_1, Tham_Số_2, ...) {


Xử lý;

Giải thích

Kiểu dữ liệu có thể là int, long, float, double, char hoặc void. Đây chính là dữ liệu mà hàm có thể trả về (hay còn gọi là đâu ra – output).

Tên hàm phải là: động từ, không chứa khoảng trắng, không trùng từ khoá, không chứa ký tự đặc biệt và đặt tên có ý nghĩa.

Tham số là dữ liệu đầu vào của hàm và được khai báo theo cú pháp sau:


Kiểu_Dữ_Liệu Tên_Tham_Số_1, Kiểu_Dữ_Liệu Tên_Tham_Số_2,...

Ví dụ: Xây dựng hàm tính tổng 2 số nguyên

Cách 1: Hàm không trả về giá trị và không nhận tham số đầu vào


void tinhTong1() {


int a, b, tong;


printf("a = ");


scanf("%d", &a);


printf("b = ");


scanf("%d", &b);


tong = a + b;


printf("Tong hai so la %d", tong);

Cách 2: Hàm nhận tham số đầu vào và không trả về giá trị


void tinhTong2(int a, int b) {


int tong;


tong = a + b;


printf("Tong hai so la %d", tong);

Cách 3: Hàm trả về giá trị và không nhận tham số đầu vào


int tinhTong3() {


int a,b, tong;


printf("Nhap so thu nhat a = ");


scanf("%d", &a);


printf("Nhap so thu hai b = ");


scanf("%d", &b); tong = a + b;


//Kết thúc hàm và trả về kết quả


return tong;

Cách 4: Hàm trả về giá trị và nhận tham số đầu vào


int tinhTong4(int a, int b) { int tong; tong = a + b; //Kết thúc hàm và trả về kết quả return tong; }

Lớp lưu trữ trong lập trình C

Trong phần này, bạn sẽ được tìm hiểu về phạm vi và thời gian tồn tại của các biến cục bộ và các biến toàn cục. Bên cạnh đó, bạn cũng sẽ biết thêm thông tin về biến tĩnh và biến register.

Tất cả các biến trong lập trình C đều có 2 tính năng: loại và lớp lưu trữ.

Loại đề cập đến kiểu dữ liệu của một biến. Và lớp lưu trữ xác định phạm vi, khả năng hiển thị và thời gian tồn tại của một biến.

Có 4 loại lớp lưu trữ:

  1. Tự động
  2. bên ngoài
  3. tĩnh
  4. register

5.1 Biến cục bộ

Các biến được khai báo bên trong một khối chính là biến tự động hoặc biến cục bộ. Cá biến cục bộ chỉ tồn tạo bên trong một khối mà nó được khai báo.

Ví dụ:

#include

int main(void) {

for (int i = 0; i < 5; ++i) {

printf(“C programming”);

// Error: i is not declared at this point

printf(“%d”, i);

return 0;

Khi chạy, lập trình trên sẽ báo lỗi là undeclared identifier i. Bởi vì i được khai báo bên trong khối vòng lặp for. Còn bên ngoài khối đó thì nó không được khai báo.

Xem thêm ví dụ dưới đây:

int main() {

int n1; // n1 is a local variable to main()

void func() {

int n2; // n2 is a local variable to func()

Trong ví dụ này, n1 là biến cục bộ của hàm main() và n2 là biến cục bộ của hàm func().

Điều này có nghĩa là bạn không thể truy cập vào biến n1 bên trong hàm func() bởi nó chỉ tồn tại bên trong hàm main(). Tương tự, bạn cũng không thể truy cập vào biến n2 trong hàm main() vì nó chỉ tồn tại bên trong hàm func().

5.2 Biến toàn cục

Các biến được khai báo bên ngoài tất cả các hàm được gọi là biến bên ngoài hoặc biến toàn cục. Chúng có thể được truy cập từ bất kỳ hàm nào trong lập trình.

Ví dụ 1: Biến toàn cục

#include

void display();

int n = 5; // global variable

int main()

++n;

display();

return 0;

void display()

++n;

printf(“n = %d”, n);

Đầu ra

n = 7

Giả sử, một biến toàn cục được khai báo trong file1. Nếu bạn cố gắng sử dụng biến đó trong tệp file2, trình biên dịch sẽ khiếu nại. Để giải quyết vấn đề này, bạn nên sử dụng từ khóa extern trong file2 để ám chỉ rằng rằng biến bên ngoài đã được khai báo trong một tệp khác.

5.3 Biến register

Từ khóa register dùng để khai báo biến register. Biến register sẽ chạy nhanh hơn biến cục bộ.

Tuy nhiên, các trình biên dịch hiện đại có ưu điểm là tối ưu hóa mã nhanh chóng. Và sử dụng biến register cũng không giúp lập trình của bạn chạy nhanh hơn.

Trừ khi bạn làm việc trên hệ thống nhúng và bạn biết cách tối ưu hóa mã cho những ứng dụng nhất định thì không cần sử dụng các biến register.

5.4 Biến tĩnh

Biến tĩnh được khai báo bằng cách sử dụng từ khóa static. Ví dụ;

static int i;

Giá trị của biến tĩnh vẫn tồn tại cho đến khi lập trình kết thúc.

Ví dụ 2: Biến tĩnh

#include

void display();

int main()

display();

display();

void display()

static int c = 1;

c += 5;

printf(“%d “,c);

Đầu ra

6 11

Trong lần gọi hàm đầu tiên, giá trị của c được khởi tạo bằng 1. Giá trị của nó tăng thêm 5. Lúc này, giá trị của c sẽ là 6 và số 6 được in lên màn hình

Trong lần gọi thứ 2, c không được khởi tạo từ 1 nữa vì c là một biến tĩnh. Lúc này, giá trị của c tăng thêm 5. Và giá trị của c sẽ là 11, số 11 được in lên màn hình.

Trên đây là tất cả các kiến thức về các hàm trong C, ưu điểm của việc sử dụng hàm. Hy vọng bài viết sẽ giúp bạn có thêm kiến thức về (hàm) function trong C. Chúc bạn thành công!

Một hàm là một nhóm các câu lệnh cùng nhau thực hiện một nhiệm vụ. Mỗi chương trình C có ít nhất một hàm, là hàm main().

Bạn có thể chia mã của bạn thành các hàm riêng biệt. Cách bạn phân chia mã của bạn giữa các hàm khác nhau tùy thuộc vào bạn, nhưng về mặt logic mỗi hàm thực hiện một tác vụ cụ thể.

Một khai báo hàm cho trình biên dịch biết về tên, kiểu trả về và các tham số của hàm. Định nghĩa hàm cung cấp phần thân thực của hàm.

Thư viện chuẩn C cung cấp nhiều hàm được tích hợp sẵn mà chương trình của bạn có thể gọi. Ví dụ, strcat() để nối hai chuỗi, memcpy() để sao chép một vị trí bộ nhớ sang một vị trí khác và nhiều hàm khác.

Một hàm cũng có thể được gọi là một phương thức hoặc một thường trình con hoặc một thủ tục, v.v.

Nội dung chính

Ý nghĩa của Function trong lập trình? | Vũ Nguyễn Coder
Ý nghĩa của Function trong lập trình? | Vũ Nguyễn Coder

Hàm trong c – Hàm là gì

Hàm là một đoạn chương trình bao gồm một hoặc nhiều xử lý nhằm giải quyết một công việc nào đó và được xây dựng với mục đích TÁI SỬ DỤNG.

Như vậy trong một chương trình nếu có những xử lý giống nhau chúng ta nên xây dựng hàm.

Hàm có thể được xây dựng bởi lập trình viên hoặc hàm có sẵn trong ngôn ngữ lập trình. Ví dụ trong lập trình C, chúng ta có thể liệt kê các hàm có sẵn như printf, scanf, pow, sqrt,…

Các đối số của hàm trong C++

Nếu một hàm sử dụng các đối số, nó phải khai báo các biến chấp nhận các giá trị của các đối số. Các biến này được gọi là các tham số chính thức của hàm.

Các tham số chính thức hoạt động giống như các biến địa phương (local) khác bên trong hàm và được tạo khi nhập vào hàm và bị hủy khi thoát.

Trong khi gọi một hàm, có hai cách trong đó các đối số có thể được chuyển đến một hàm:

No. Kiểu gọi & mô tả
Call by value

Phương thức này sao chép giá trị thực của một đối số vào tham số chính thức của hàm. Trong trường hợp này, các thay đổi được thực hiện cho tham số bên trong hàm không ảnh hưởng đến đối số.

Call by reference

Phương thức này sao chép địa chỉ của một đối số vào tham số chính thức. Bên trong hàm, địa chỉ được sử dụng để truy cập đối số thực tế được sử dụng trong cuộc gọi. Điều này có nghĩa là các thay đổi được thực hiện cho tham số ảnh hưởng đến đối số.

Theo mặc định, C++ sử dụng call by value để chuyển đối số. Nói chung, nó có nghĩa là mã trong một hàm không thể thay đổi các đối số được sử dụng để gọi hàm.

Live trực tiếp - Chủ đề (khán giả chọn )  , tri ân đầu năm mới -  Captain X neo 2
Live trực tiếp – Chủ đề (khán giả chọn ) , tri ân đầu năm mới – Captain X neo 2

Tham số và đối số trong C

Tham số là gì | Parameter

Tham số (parameter) là các biến có kiểu và tên được sử dụng để nhận các giá trị truyền vào(Đối số- argument) để xử lý trong hàm. Tham số được sử dụng khi chúng ta khai báo hàm trong C.

Các tham số sử dụng trong hàm đều cần chỉ định kiểu và tên của nó. Và kiểu, tên của tham số cần phải giống với kiểu, tên của loại đối tượng mà nó sẽ nhận khi đối tượng đó được truyền vào hàm.

Ví dụ, nếu bạn muốn truyền giá trị là một số thuộc kiểu int, thì bắt buộc là tham số khai báo trong hàm cũng phải thuộc kiểu int. Tương tự nếu đối tượng truyền vào là một char, hay một chuỗi, bạn cũng cần phải chỉ định kiểu char hay char[] tương ứng.

Đối số là gì | Argument

Đối số (argument) là các giá trị thực được truyền vào khi gọi hàm. Đối số được truyền vào hàm qua sẽ được gán vào tham số, và được sử dụng khi chúng ta gọi hàm trong C.

Có nhiều loại giá trị có thể truyền vào hàm khi chúng ta gọi hàm, ví dụ như biến, con trỏ và cấu trúc chẳng hạn. Với mỗi loại đối tượng như vậy sẽ có kiểu dữ liệu khác nhau, và chúng ta cần cần chú ý phải truyền đối tượng vào hàm có kiểu dữ liệu giống với kiểu của tham số tương ứng trong hàm dùng để nhận nó.

Ví dụ nếu khi khai báo hàm, chúng ta sử dụng một tham số có kiểu int, thì chúng ta cũng chỉ có thể truyền đối số có cùng kiểu int vào hàm mà thôi. Nếu không thì hàm không chạy được và lỗi sẽ bị xảy ra.

Sự khác biệt giữa một đối số và một tham số

Kiyoshi chắc chắn rằng trước khi đọc bài viết này, sẽ có không ít bạn còn mập mờ chưa biết cách phân biệt tham số và đối số trong C đâu nhỉ. Tuy nhiên qua những phân tích ở trên, bạn đã hiểu đươc tham số và đối số trong C khác nhau như thế nào chưa? Hãy cùng tổng kết sự khác nhau giữa đối số và tham số nhé.

  • Tham số là các biến có tên được sử dụng trong khai báo hàm.
  • Đối số của hàm là các giá trị thực được truyền vào khi gọi hàm.
  • Tham số nhận giá trị của các đối số được truyền vào từ ngoài hàm và thực hiện tính toán bên trong hàm.

Truyền tham số trong C

Khi gọi một hàm số trong javascript, chúng ta sẽ truyền các đối số (giá trị thực) vào hàm thông qua các tham số. Việc truyền đối số vào hàm thông qua tham số được gọi là truyền tham số trong C, và được miêu tả như hình dưới đây:

Các hàm trong C

Trong hướng dẫn này, bạn sẽ được giới thiệu về các hàm trong C (cả hàm do người dùng định nghĩa và hàm thư viện chuẩn). Ngoài ra, bạn cũng sẽ biết được lý do tại sao các hàm lại được sử dụng trong lập trình.

Các hàm trong C

Hàm trong C (ngôn ngữ lập trình) là một khối mã thực hiện một nhiệm vụ cụ thể.

Giả sử, bạn cần viết một lập trình để tạo một hình tròn và tô màu cho nó. Bạn cần chọn bán kính và màu sắc. Bạn có thể tạo 2 hàm dưới đây để thực hiện nhiệm vụ trên:

  • Tạo một hàm vẽ hình tròn: createCircle() function
  • Tạo một hàm tô màu: color() function

Việc phân chia các vấn đề phức tạp thành các vấn đề nhỏ hơn giúp lập trình của bạn dễ hiểu và dễ sử dụng lại hơn.

Có hai loại hàm trong C:

  • Các hàm thư viện tiêu chuẩn
  • Các hàm do người dùng định nghĩa

1.1 Các hàm thư viện tiêu chuẩn

Các hàm thư viện tiêu chuẩn chính là các hàm sẵn có trong lập trình C.

Các hàm này được xác định trong các header files (tệp có phần mở rộng .h)

  • Printf() là một hàm thư viện chuẩn có chức năng xuất kết quả đã được định dạng sẵn ra màn hình (hiển thị kết quả trên màn hình). Hàm này được xác định trong tệp tiêu đề stdio.h. Do đó, để sử dụng hàm printf (), chúng ta cần bao gồm tệp tiêu đề stdio.h bằng cách sử dụng #include
  • Hàm sqrt() có chức năng tính căn bậc hai của một số. Hàm được xác định trong tệp tiêu đề math.h.

Truy cập vào các hàm thư viện tiêu chuẩn trong lập trình C để tìm hiểu thêm.

1.2 Các hàm do người dùng xác định

Bạn cũng có thể tạo các hàm trong C phù hợp với nhu cầu của mình. Các hàm do người dùng tạo ra được gọi là hàm do người dùng xác định.

Hàm do người dùng xác định hoạt động như thế nào?

#include

void functionName()

… .. …

… .. …

int main()

… .. …

… .. …

functionName();

… .. …

… .. …

Lập trình này sẽ thực thi các mã sau hàm main()

Khi trình biên dịch gặp hàm functionName():, điều khiển của lập trình sẽ nhảy tới

void functionName()

Và, trình biên dịch bắt đầu thực thi các mã bên trong functionName ().

Điều khiển lập trình sẽ quay lại hàm main() sau khi mã bên trong hàm này được thực thi.

Lưu ý, tên hàm là định danh và phải là duy nhất.

Ưu điểm của các hàm trong C do người dùng xác định

  • Lập trình này sẽ dễ hiểu, dễ bảo trì và dễ sửa lỗi hơn.
  • Các mã tái sử dụng có thể được dùng trong những lập trình khác
  • Một lập trình lớn có thể được chia thành các mô-đun nhỏ hơn. Do đó, có thể chia một dự án lớn thành nhiều phần và mỗi lập trình viên đảm nhận một phần.
Chuẩn bị gì cho phỏng vấn thực tập sinh IT
Chuẩn bị gì cho phỏng vấn thực tập sinh IT

Các hàm trong C do người dùng xác định

2.1 Ví dụ: Hàm trong C do người dùng xác định

Đây là ví dụ về việc thêm 2 số nguyên. Để thực hiện nhiệm vụ này, bạn cần tạo hàm addNumbers do người dùng xác định.

#include

int addNumbers(int a, int b); // function prototype

int main()

int n1,n2,sum;

printf(“Enters two numbers: “);

scanf(“%d %d”,&n1,&n2);

sum = addNumbers(n1, n2); // function call

printf(“sum = %d”,sum);

return 0;

int addNumbers(int a, int b) // function definition

int result;

result = a+b;

return result; // return statement

2.2 Nguyên mẫu hàm

Nguyên mẫu hàm chính là sự khai báo hàm: tên hàm, các tham số và kiểu trả về. Nó không phải là phần thân của hàm.

Nguyên mẫu hàm thông báo cho trình biên dịch rằng hàm đó có thể sẽ được sử dụng trong lập trình này.

Cú pháp của nguyên mẫu hàm

returnType functionName(type1 argument1, type2 argument2, …);

note: argument: đối số

Trong ví dụ trên, int addNumbers(int a, int b); chính là nguyên mẫu hàm cung cấp thông tin cho trình biên dịch:

  • tên của hàm là addNumbers ()
  • kiểu trả về của hàm là int
  • hai đối số kiểu int được chuyển cho hàm

Không cần tạo nguyên mẫu hàm nếu hàm do người dùng xác định được đặt trước hàm main().

2.3 Lời gọi hàm

Quyền kiểm soát lập trình được chuyển sang cho hàm do người dùng xác định thông qua lời gọi hàm

Cú pháp của lời gọi hàm

functionName(argument1, argument2, …);

Trong ví dụ trên, lời gọi hàm được thực hiện bằng lệnh addNumbers(n1, n2); nằm trong hàm main().

2.4 Định nghĩa hàm

Định nghĩa hàm chứa khối mã để thực hiện một nhiệm vụ cụ thể. Trong ví dụ trên, định nghĩa hàm chính là thêm 2 số và trả lại nó.

Cú pháp định nghĩa hàm

returnType functionName(type1 argument1, type2 argument2, …)

//body of the function

Khi một hàm được gọi, quyền điều khiển của lập trình sẽ được chuyển sang định nghĩa hàm. Và trình biên dịch bắt đầu thực thi các mã bên trong phần thân của hàm.

2.5 Truyền đối số cho một hàm

Trong lập trình, đối số ám chỉ một biến được truyền cho hàm. Trong ví dụ trên, 2 biến số n1 và n2 được truyền thông qua quá trình gọi hàm.

Các tham số a và b chấp nhận các đối số được truyền vào trong định nghĩa hàm. Các đối số này được gọi là tham số chính thức của hàm.

Loại đối số được truyền cho một hàm và các tham số chính thức phải khớp nhau. Nếu không, trình biên dịch sẽ báo lỗi.

Nếu n1 thuộc kiểu char thì a cũng phải thuộc kiểu char. Nếu n2 thuộc kiểu float thì biến b cũng phải thuộc kiểu float.

Cũng có thể gọi một hàm mà không cần truyền đối số.

2.6 Câu lệnh return (trả về)

Câu lệnh return kết thúc việc thực thi một hàm và trả về giá trị cho hàm đang gọi. Điều khiển của lập trình sẽ được chuyển cho hàm đang gọi nằm sau câu lệnh return.

Trong ví dụ trên, giá trị của biến result được trả về cho hàm main. Biến sum trong hàm main() được gán giá trị này.

Cú pháp của câu lệnh return

return (expression);

Ví dụ,

return a;

return (a+b);

Kiểu giá trị được trả về từ hàm, kiểu trả về được chỉ định trong nguyên mẫu hàm và định nghĩa hàm phải khớp nhau.

Truy cập vào đây để biết thêm thông tin chi tiết về cách truyền đối số và giá trị trả về từ một hàm.

Các hàm xác định trước trong C

Giờ bạn đã biết hàm trong lập trình C là gì. Thực tế, việc dùng nó cũng không quá khó.

Ví dụ,

main()

là một hàm. Nó được dùng để chạy code.

Print()

cũng là một hàm. Nó được dùng để xuất/in văn bản trên màn hình.

Ví dụ:


int main() { printf("Hello World!"); return 0; }

Chấm thi cuối kỳ Vi tích phân 1C hệ đại trà | Phòng thi E204-Part01 | Học kỳ 1 2023-2024 | HCMUS
Chấm thi cuối kỳ Vi tích phân 1C hệ đại trà | Phòng thi E204-Part01 | Học kỳ 1 2023-2024 | HCMUS

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về hàm trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/ham-trong-c/ham-trong-c/

Viết bởi Kiyoshi. Đã đăng ký bản quyền tác giả tại Creativecommons và DMCA

Bài viết liên quan

HOME › lập trình c cơ bản dành cho người mới học lập trình>>10. hàm trong c

Nội dung

Gọi hàm trong C

Trong khi tạo một hàm, bạn định nghĩa những gì hàm phải làm. Để sử dụng một hàm, bạn phải gọi hàm đó để thực hiện một nhiệm vụ cụ thể.

Khi một chương trình gọi một hàm, phần điều khiển được chuyển đến hàm được gọi. Một hàm được gọi thực hiện các nhiệm vụ được định nghĩa và trả về giá trị sau khi thực hiện chương trình.

Để gọi hàm, bạn đơn giản cần truyền các tham số được yêu cầu cùng với tên của hàm và nếu hàm trả về các giá trị, bạn có thể dự trữ các giá trị trả về này, ví dụ:


#include

/* khai bao ham */ int timGTLN(int so1, int so2); int main () { /* phan dinh nghia bien cuc bo */ int a = 667; int b = 7028; int kq; /* goi ham de tim gia tri lon nhat */ kq = timGTLN(a, b); printf( "Gia tri lon nhat la : %d\n", kq ); printf("\n===========================\n"); printf("QTM chuc cac ban hoc tot! \n"); return 0; } /* phan dinh nghia ham de tra ve gia tri lon nhat giua hai so */ int timGTLN(int so1, int so2) { /* khai bao bien cuc bo */ int ketqua; if (so1 > so2) ketqua = so1; else ketqua = so2; return ketqua; }

Tôi giữ giá trị hàm timGTLN() trong hàm main vào biến kq. Biên dịch và chạy chương trình C trên để xem kết quả:

#14 [C++]. Hướng Dẫn Sử Dụng Pair Trong C++ | Kiểu Pair Trong Ngôn Ngữ Lập Trình C++
#14 [C++]. Hướng Dẫn Sử Dụng Pair Trong C++ | Kiểu Pair Trong Ngôn Ngữ Lập Trình C++

Hàm trong c – Một số lỗi thường gặp khi làm việc với hàm

1/ Gọi sai tên hàm.

2/ Gọi hàm không phù hợp với định nghĩa 3/ Hàm có nhận tham số nhưng khi gọi hàm thì không truyền tham số đầu vào


ketqua = tinhTong4();

4/ Truyền không đúng số lượng tham số


ketqua = tinhTong4(1502);

5/ Truyền tham số không phù hợp với kiểu dữ liệu lúc định nghĩa hàm


ketqua = tinhTong4(12.5, 20.9);

Hàm tinhTong4 chỉ nhận 2 tham số kiểu int nhưng khi gọi hàm chúng ta truyền 2 tham số kiểu số thực.

Các đối số của hàm trong C

Nếu một hàm sử dụng các đối số, nó phải khai báo các biến chấp nhận các giá trị của các đối số. Các biến này được gọi là các tham số chính thức của hàm.

Các tham số chính thức hoạt động giống như các biến địa phương (local) khác bên trong hàm và được tạo khi nhập vào hàm và bị hủy khi thoát.

Trong khi gọi một hàm, có hai cách trong đó các đối số có thể được chuyển đến một hàm:

No. Kiểu gọi & mô tả
Call by value

Phương thức này sao chép giá trị thực của một đối số vào tham số chính thức của hàm. Trong trường hợp này, các thay đổi được thực hiện cho tham số bên trong hàm không ảnh hưởng đến đối số.

Call by reference

Phương thức này sao chép địa chỉ của một đối số vào tham số chính thức. Bên trong hàm, địa chỉ được sử dụng để truy cập đối số thực tế được sử dụng trong cuộc gọi. Điều này có nghĩa là các thay đổi được thực hiện cho tham số ảnh hưởng đến đối số.

Theo mặc định, C sử dụng call by value để chuyển đối số. Nói chung, nó có nghĩa là mã trong một hàm không thể thay đổi các đối số được sử dụng để gọi hàm.

Hàm trong c nói riêng và trong các ngôn ngữ lập trình khác nói chung là phần xử lý được tạo ra để sử dụng lại. Trong đoạn chương trình bên dưới phần xử lý nhập và kiểm tra số nguyên dương LẶP LẠI 3 LẦN, việc này dẫn đến một số vấn đề như: Viết xử lý (code) nhiều lần và khi có sự thay đổi thì phải thay đổi nhiều lần


#include


main() {


int x, y, z;


//Nhập số thứ nhất


do {


printf("x = ");


scanf("%d", &x);


} while (x<0);


//Nhập số thứ hai


do {


printf("y = ");


scanf("%d", &y);


} while(y<0);


//Nhập số thứ ba


do {


printf("z = ");


scanf("%d", &z);


} while (z<0);


int tong = x + y + z;


printf("Tong 3 so la %d", tong);

Hướng giải quyết: Những xử lý giống nhau sẽ xây dựng thành một đoạn chương trình và đoạn chương trình này sẽ được sử dụng lại ở những yêu cầu tương tự và được gọi là hàm.

Recap EURUSD: Lệnh Khai Xuân Trước Thềm CPI
Recap EURUSD: Lệnh Khai Xuân Trước Thềm CPI

Hàm trong c – Bài tập thực hành

Bài thực hành số 1: Viết hàm tính chu vi và diện tích hình tròn

Bài thực hành số 2: Viết chương trình hỗ trợ người dùng thực hiện các phép tính gồm cộng, trừ, nhân và chia hai số

  • Nếu ký tự được nhập từ bàn phím là “+” thì phép tính cộng
  • Nếu ký tự được nhập từ bàn phím là “-” thì phép tính trừ
  • Nếu ký tự được nhập từ bàn phím là “*” thì phép tính nhân
  • Nếu ký tự được nhập từ bàn phím là “/” thì phép tính chia

Yêu cầu thực hiện:

  • Viết hàm tính tổng
  • Viết hàm tính trừ
  • Viết hàm tính nhân
  • Viết hàm tính chia

Hàm trong lập trình C

Hàm trong lập trình C là gì? Cách dùng hàm trong lập trình C như thế nào? Hãy cùng Quantrimang.com tìm hiểu nhé!

Một hàm trong lập trình C về cơ bản là một khối code. Nó chỉ chạy khi được gọi. Bạn có thể truyền dữ liệu, còn gọi là tham số vào trong một hàm.

Các hàm thường được dùng để triển khai những tác vụ nhất định. Chúng quan trọn đối với việc tái sử dụng code: Xác định code một lần và dùng nó nhiều lần.

Bạn có thể chia đoạn code của bạn thành những hàm riêng biệt. Cách bạn chia đoạn code của bạn thành các hàm khác nhau phụ thuộc vào bạn, nhưng theo tính logic, một hàm thường có một nhiệm vụ nhất định.

Một sự khai báo hàm thông báo với bộ biên dịch về tên của hàm, kiểu trả về và tham số. Một định nghĩa hàm cung cấp phần thân của một hàm.

Các thư viện tiêu chuẩn của ngôn ngữ C cung cấp rất nhiều hàm có sẵn để chương trình của bạn có thể gọi. Ví dụ, hàm strcat() có thể nối hai đoạn chuỗi, hàm memcpy() dùng để copy một vùng nhớ đến một vùng nhớ khác và rất nhiều hàm khác nữa.

Một hàm được biết đến với các tên khác nhau như một phương thức, một tuyến phụ hoặc một thủ tục.

Định nghĩa một hàm trong C

Mẫu chung của định nghĩa hàm trong Ngôn ngữ C như sau:

kieu_tra_ve ten_ham( danh_sach_tham_so ) { than_cua_ham }

Một định nghĩa hàm trong ngôn ngữ C bao gồm đầu hàm và một thân hàm. Dưới đây là các phần của một hàm:

Kiểu trả về: Một hàm có thể trả về một giá trị. Kieu_tra_ve là dạng dữ liệu của giá trị mà hàm trả về. Vài hàm cung cấp các hoạt động và không trả về giá trị nào cả. Đó là hàm void.

Tên hàm: Đây là tên thực sự của hàm. Tên hàm và danh sách tham số cấu tạo nên dấu hiệu hàm.

Tham số: Khi hàm được gọi, bạn phải truyền vào danh sách các tham số. Một giá trị hướng đến một tham số thực tế. Danh sách tham số có các kiểu, thứ tự và số lượng các tham số của hàm. Các tham số trong hàm là tùy chọn, nghĩa là một hàm có thể không có tham số.

Thân hàm: Phần thân của một hàm bao gồm tập hợp các lệnh xác định những gì mà hàm thực hiện.

Ví dụ:

Sau đây là mã nguồn cho một hàm có tên gọi là timGTLN(). Hàm này có 2 tham số: so1 và so2 và trả về giá trị lớn nhất giữa hàm số:

/* ham tra ve gia tri lon nhat giua hai so */ int timGTLN(int so1, int so2) { /* khai bao bien cuc bo */ int ketqua; if (so1 > so2) ketqua = so1; else ketqua = so2; return ketqua; }

#19 [C++]. Cách Sử Dụng Hàm Sắp Xếp Trong C++ | Xây Dựng Comparator Cho Hàm Sort của STL
#19 [C++]. Cách Sử Dụng Hàm Sắp Xếp Trong C++ | Xây Dựng Comparator Cho Hàm Sort của STL

Cùng tìm hiểu về hàm trong C.Bạn sẽ học được khái niệm hàm trong C là gì, cấu trúc hàm trong C với các thành phần cơ bản như tham số, đối số và giá trị trả về. Bạn cũng sẽ biết về các loại hàm trong C bao gồm hàm main() trong C, các hàm có sẵn trong Cvà hàm C do người dùng định nghĩa sau bài học này.

Chúng ta cần quan tâm tới ba thành phần sử dụng trong hàm C như sau:

  • Tham số (Parameter)
  • Đối số (Argument)
  • Giá trị trả về (Return values)

Và chúng ta cũng cần làm chủ 3 loại hàm trong C như sau:

  • Hàm main trong c
  • Hàm có sẵn trong C
  • Hàm C do người dùng định nghĩa

Hãy cùng Kiyoshi làm rõ các kiến thực này ở phần dưới đây.

Lợi thế của các hàm trong C++

1. Tái sử dụng mã

Bằng cách tạo các hàm trong C++, bạn có thể gọi nó nhiều lần. Vì vậy, bạn không cần phải viết cùng một mã một hoặc nhiều lần nữa.

2. Tối ưu hóa mã

Nó làm cho mã được tối ưu hóa, chúng ta không cần phải viết nhiều mã.

Giả sử, bạn phải kiểm tra 3 số (531, 883 và 781) có phải là số nguyên tố hay không. Không sử dụng hàm, bạn cần viết logic số nguyên tố 3 lần. Vì vậy, có sự lặp lại của mã.

Nhưng nếu bạn sử dụng các hàm, bạn chỉ cần viết logic một lần và bạn có thể sử dụng lại nó nhiều lần.

Có thể bạn quan tâm

1.Định Nghĩa Hàm

Bạn đã từng sử dụng các hàm như sqrt, pow, abs… của các thư viện có sẵn trong C, tuy nhiên để giải quyết bài toán của bạn thì bạn cần phải tự xây dựng các hàm để giải quyết các chức năng nhỏ cho bài toán của mình.

Hàm (function) là một các khối lệnh có nhiệm vụ thực hiện một chức năng nào đó.

Ở các bài học trước bạn đều viết mã nguồn C bên trong hàm main, chương trình sẽ trở nên khó quản lý khi số lượng dòng code trở nên lớn, cùng điểm qua các lợi ích của việc sử dụng hàm

Cú Pháp :

data_type function_name(type1 parameter1, type2 parameter2…){ //code }

Các thành phần của hàm :

  • data_type : Kiểu trả về của hàm, có thể là các kiểu dữ liệu như int, long long, float, char, double, hoặc void (tương ứng với kiểu trả về là rỗng)
  • function_name : Tên của hàm, cần tuân theo quy tắc như đặt tên biến
  • parameter : Tham số của hàm, đây được coi như đầu vào của hàm. Bạn có thể xây dựng bao nhiêu tham số tùy ý và lựa chọn kiểu dữ liệu cho từng tham số.
  • code : Các câu lệnh bên trong của hàm

Ví dụ 1 : Hàm có kiểu trả về là int, có 3 tham số là a, b, c

int tong(int a, int b, int c){ int sum = a + b + c; return sum; }

Ví dụ 2 : Hàm có kiểu trả về là void, có 3 tham số là a kiểu int, b kiểu long long, c kiểu double

void display(int a, long long b, double c){ printf(“%d %lld %.2lf\n”, a, b, c); }

2. Lời Gọi Hàm

Sau khi xây dựng hàm xong để hàm có thể thực thi bạn cần gọi nó trong hàm main và truyền cho nó tham số nếu cần.

Khi bạn gọi hàm trong hàm main thì các câu lệnh bên trong hàm sẽ được thực thi, sau khi thực thi hết các câu lệnh thì hàm kết thúc và chương trình tiếp tục thực hiện các câu lệnh bên dưới hàm.

Mỗi lần bạn gọi hàm thì các câu lệnh trong hàm sẽ được thực hiện.

Ví dụ 1 :

#include “stdio.h” void greet(){ printf(“Hello 28tech !\n”); printf(“blog.28tech.com.vn\n”); } int main(){ printf(“Before\n”); greet(); // Lời gọi hàm printf(“After\n”); return 0; }

Output :

Before Hello 28tech ! blog.28tech.com.vn After

Giải thích :

  1. Hàm main thực hiện câu lệnh đầu tiên in ra “Before”
  2. Câu lệnh thứ 2 trong main là lời gọi hàm greet(), chương trình tiến hành nhảy vào bên trong hàm greet() và thực hiện lần lượt 2 câu lệnh in ra “Hello 28tech !” và “blog.28tech.com.vn”
  3. Sau khi thực hiện xong 2 câu lệnh thì hàm greet() kết thúc tương đương câu lệnh thứ 2 trong main thực hiện xong
  4. Hàm main tiếp tục thực hiện câu lệnh thứ 3 in ra “After” sau đó kết thúc chương trình

3. Đối Số Và Tham Số

Tham số (Parameter) hay tham số hình thức là các thành phần khi bạn xây dựng hàm, xem xét ví dụ dưới đây thì a, b, c sẽ được gọi là tham số

Đối số (Argument) hay tham số chính thức là các giá trị bạn truyền vào cho hàm khi gọi hàm, xem xét ví dụ dưới đây thì m, n, p được gọi là đối số

Khi bạn gọi hàm thì lần lượt giá trị của các đối số sẽ được gán cho tham số, trong ví dụ dưới thì m được gán cho a, n được gán cho b, p được gán cho c. Những gì thay đổi trên tham số sẽ không có ảnh hưởng gì tới đối số

Chú ý : Kiểu dữ liệu của đối số và tham số nên trùng nhau hoặc của tham số nên là kiểu dữ liệu lớn hơn kiểu dữ liệu của đối số. Ví dụ bạn xây dựng 1 hàm có tham số là long long thì nó có thể áp dụng với 1 số int nhưng ngược lại thì không.

Ví dụ 1 :

#include “stdio.h” void display(int a, int b, int c){ printf(“%d %d %d\n”, a, b, c); } int main(){ int m = 100, n = 200, p = 300; display(m, n, p); return 0; }

Output :

100 200 300

Ví dụ 2 :

#include “stdio.h” void display(int a, int b, int c){ printf(“%d %d %d\n”, b, a, c); } int main(){ int x = 30; display(100.2, 200.3, x); return 0; }

Output :

200 100 30

Giải thích :

  1. a được gán giá trị là 100.2 nhưng do a có kiểu là int nên chỉ lưu được 100
  2. b được gán giá trị là 200.3 nhưng do b có kiểu là int nên chỉ lưu được 200
  3. c được gán giá trị của x tương tương với 30
  4. Câu lệnh in ra b, c, a lần lượt là 200 100 30

Ví dụ 3 : Thay đổi tham số sẽ không ảnh hưởng gì tới đố số

#include “stdio.h” void thaydoi(int n){ n += 28; printf(“%d\n”, n); } int main(){ int a = 100; thaydoi(a); printf(“%d\n”, a); return 0; }

Output :

128 100

Giải thích :

  1. Tham số n được gán giá trị của đối số a nên n = 100
  2. n += 28 => n = 128, câu lệnh printf bên trong hàm thay đổi in ra n sẽ là 128
  3. Hàm kết thúc, câu lệnh in ra a thì a vẫn là 100

4.Câu Lệnh Return

Khi hàm của bạn thực hiện các chức năng tính toán và mong muốn trả về 1 giá trị cụ thể thì bạn cần câu lệnh return, trong các ví dụ trên thì hàm của mình đều không cần trả về giá trị nào nên mình để kiểu trả về là void.

Giả sử bạn cần viết hàm tính tổng của 3 số nguyên, khi đó hàm sẽ nhận vào tham số là 3 số nguyên và cần trả về tổng 3 số. Vậy bạn cần xác định tổng của 3 số đó sẽ có kiểu là gì để làm kiểu trả về cho hàm và bổ sung thêm câu lệnh return kèm giá trị bạn muốn trả về.

Có thể hiểu đơn giản giá trị đi kèm với return chính là kết quả mà hàm trả về cho bạn khi bạn gọi hàm.

Ví dụ 1 : Hàm tính tổng 3 số nguyên int

#include “stdio.h” int tong(int a, int b, int c){ int sum = a + b + c; return sum; } int main(){ printf(“%d\n”, tong(10, 20, 30)); printf(“%d\n”, tong(28, 28, 28)); return 0; }

Output :

60 84

Ví dụ 2 : Hàm tính giai thừa của số n

#include “stdio.h” long long factorial(int n){ long long gt = 1; for(int i = 1; i <= n; i++){ gt *= i; } return gt; } int main(){ printf(“%lld\n”, factorial(5)); printf(“%lld\n”, factorial(10)); return 0; }

Output :

120 3628800

Chú ý :

  1. Hàm của bạn sẽ kết thúc ngay khi gặp câu lệnh return và giá trị return đầu tiên đó sẽ được trả về cho hàm
  2. Kiểu dữ liệu trả về của hàm với kiểu của biến mà bạn sử dụng trong câu lệnh return cần giống nhau. Ví dụ hàm factorial trả về long long thì khi trả về biến gt thì biến gt cũng nên có kiểu long long, nếu bạn sử dụng gt kiểu int có thể bị tràn dữ liệu, khi đó kiểu trả về là long long cũng không tự khôi phục cho bạn được kết quả đúng

Ví dụ 3 :

#include “stdio.h” int tong(int a, int b){ int res = a + b; return 28; // kết thúc và trả về luôn giá trị 28 return res; // không được thực hiện } int main(){ printf(“%d\n”, tong(10, 20)); printf(“%d\n”, tong(100, 200)); return 0; }

Output :

28 28

Ví dụ 4 :

#include “stdio.h” void greet(int n){ printf(“28tech\n”); printf(“%d\n”, n); return; // Kết thúc ngay hàm void printf(“blog.28tech.com.vn\n”); } int main(){ greet(28); return 0; }

Output :

28tech 28

5.Chú Ý Khi Xây Dựng Hàm

  1. Hàm này có cần trả về giá trị không, nếu có thì trả về kiểu dữ liệu là gì ?
  2. Hàm này có bao nhiêu tham số, các tham số có kiểu dữ liệu là gì ?
  3. Hàm của bạn xây dựng đã đủ tổng quát chưa hay quá quá chi tiết và chỉ phù hợp cho 1 bài toán cụ thể
  4. Bạn gọi hàm có đúng thứ tự tham số mà mình mong muốn hay không, kiểu dữ liệu của tham số hình thức và tham số chính thức có hợp lí hay không?
  5. Nếu hàm của khác void, thì hàm sẽ kết thúc ngay lập tức khi gặp câu lệnh return một giá trị nào đó, còn nếu hàm void mà các bạn muốn kết thúc tại thời điểm nào đó các bạn có thể sử dụng câu lệnh return; là đủ.

Ví dụ bài toán : Tính tổng các ước của N và in ra màn hình

Cách 1 :

#include “stdio.h” void xuly(){ int n; scanf(“%d”, &n); int tong = 0; for(int i = 1; i <= n; i++){ if(n % i == 0){ tong += i; } } printf(“%d\n”, tong); } int main(){ xuly(); return 0; }

Phân tích : Cách làm này không sai, code này sẽ tiến hành nhập, tính tổng và in ra luôn trong hàm xử lý. Tất cả các công việc đều được xử lý bởi hàm xuly(), tuy nhiên cách làm này không phù hợp vì hàm chưa đủ tổng quát.

Ví dụ nếu muốn tính tổng các ước của từng số từ 1 tới n thì hàm này không dùng được, hoặc chỉ muốn lấy ra tổng của 1 số để thực hiện các chức năng khác thì hàm này cũng không sử dụng được.

Cách 2 :

#include “stdio.h” int tonguoc(int n){ int tong = 0; for(int i = 1; i <= n; i++){ if(n % i == 0){ tong += i; } } return tong; } int main(){ int n; scanf(“%d”, &n); printf(“%d\n”, tonguoc(n)); return 0; }

Phân tích : Cách làm này tổng quát hơn, hàm tính tổng ước của bạn có thể sử dụng bất cứ lúc nào bạn cần tính tổng ước của 1 số.

Các thao tác nhập và xuất bạn nên xử lý trong hàm main, hàm chỉ nên có chức năng xử lý nhiệm vụ nhất định.

Xem thêm bài giảng của mình về Hàm trong C :

Một hàm là một nhóm các lệnh đi cùng nhau để thực hiện một nhiệm vụ. Mỗi chương trình C/C++ có ít nhất một hàm là hàm main(), và tất cả hầu hết các chương trình bình thường đều định nghĩa thêm các hàm.

Bạn có thể chia đoạn code của bạn thành những hàm riêng biệt. Cách bạn chia đoạn code của bạn thành các hàm khác nhau phụ thuộc vào bạn, nhưng theo tính logic, một hàm thường có một nhiệm vụ nhất định.

Một sự khai báo hàm thông báo với bộ biên dịch về tên của hàm, kiểu trả về và tham số. Một định nghĩa hàm cung cấp phần thân của một hàm.

Các thư viện tiêu chuẩn của ngôn ngữ C/C++ cung cấp rất nhiều hàm có sẵn để chương trình của bạn có thể gọi. Ví dụ, hàm strcat() có thể nối hai đoạn chuỗi, hàm memcpy() dùng để copy một vùng nhớ đến một vùng nhớ khác và rất nhiều hàm khác nữa.

Một hàm được biết đến với các tên khác nhau như một phương thức, một tuyến phụ hoặc một thủ tục.

Mẫu chung của định nghĩa hàm trong Ngôn ngữ C/C++ như sau:


Kieu_tra_ve Ten_ham( Danh sach tham so ) { Than ham }

Một định nghĩa hàm trong ngôn ngữ C/C++ bao gồm đầu hàm và một thân hàm. Dưới đây là các phần của một hàm:

Ví dụ

Sau đây phần code cho một hàm có tên gọi là max(). Hàm này có 2 tham số: so1 và so2 và trả về giá trị lớn nhất giữa hàm số:


// ham tra ve so lon nhat cua hai so int max(int so1, int so2) { // Khai bao bien cuc bo int result; if (so1 > so2) result = so1; else result = so2; return result; }

Một khai báo hàm thông báo cho trình biên dịch về tên hàm và cách gọi của hàm. Phần thân hàm có thể định nghĩa một cách rời rạc.

Một khai báo hàm có các phần sau đây:


kieu_tra_ve ten_ham( danh sach tham so );

Ví dụ khi định nghĩa hàm max(), dưới đây là câu khai báo hàm:


int max(int so1, int so2);

Tên các tham số không quan trọng trong việc khai báo hàm, và kiểu dưới đây là cách khai báo hợp lệ:


int max(int, int);

Một khai báo hàm được yêu cầu khi bạn định nghĩa một hàm và mã nguồn và khi gọi một hàm từ một file nguồn khác. Trong trường hợp này, bạn nên khai báo hàm trước khi gọi hàm đó.

Trong khi tạo một hàm, bạn định nghĩa những gì hàm phải làm. Để sử dụng một hàm, bạn phải gọi hàm đó để thực hiện một nhiệm vụ cụ thể.

Khi một chương trình gọi một hàm, phần điều khiển được chuyển đến hàm được gọi. Một hàm được gọi thực hiện các nhiệm vụ được định nghĩa và trả về giá trị sau khi thực hiện chương trình.

Để gọi hàm, bạn đơn giản cần truyền các tham số được yêu cầu cùng với tên của hàm và nếu hàm trả về các giá trị, bạn có thể dự trữ các giá trị trả về này, ví dụ:


#include

using namespace std; // khai bao ham int max(int so1, int so2); int main () { // Khai bao bien cuc bo: int a = 100; int b = 200; int ketqua; // goi ham de tim gia tri lon nhat. ketqua = max(a, b); cout << "Gia tri lon nhat la: " << ketqua << endl; return 0; } // ham tra ve so lon nhat cua hai so int max(int so1, int so2) { // Khai bao bien cuc bo int result; if (so1 > so2) result = so1; else result = so2; return result; }

Mình giữ giá trị hàm max() trong hàm main vào biến ketqua. Khi chạy chương trình C/C++ trên sẽ cho kết quả sau:


Gia tri lon nhat la: 200

Một hàm sử dụng các danh sách tham số, nó phải khai báo các biến và chấp nhận giá trị các biến này. Các biến này được gọi là các biến chính thức.

Các biến chính thức giống các biến cục bộ khác bên trong hàm.

Khi bạn gọi hàm, có 2 cách để bạn truyền các giá trị vào cho hàm:

Kiểu gọi Miêu tả
Phương thức này sao chép giá trị thực sự của tham số vào trong tham số chính thức của một hàm. Trong trường hợp này, các thay đổi của bản thân các tham số bên trong hàm không ảnh hưởng tới các tham số.
Phương thức này sao chép địa chỉ của tham số vào trong biến chính thức. Bên trong hàm này, địa chỉ này được sử dụng để truy cập tham số thực sự được sử dụng trong lời gọi hàm.
Phương thức này sao chép địa chỉ của tham số vào trong tham số chính thức. Bên trong hàm, địa chỉ được dùng để truy cập tham số thực sự được sử dụng khi gọi hàm. Có nghĩa là các thay đổi tới tham số làm tham số thay đổi.

Theo mặc định, C/C++ sử dụng gọi bởi giá trị để truyền các tham số. Nhìn chung, code đó trong một hàm không thể thay đổi các tham số được dùng để gọi hàm đó và trong ví dụ trên, khi gọi hàm max() là dùng phương thức tương tự.

Khi bạn định nghĩa một hàm, bạn có thể xác định một giá trị mặc định cho mỗi tham số cuối cùng. Giá trị này sẽ được sử dụng nếu tham số tương ứng là để trống bên trái khi gọi hàm đó.

Việc này được thực hiện bởi sử dụng toán tử gán và gán các giá trị cho các tham số trong định nghĩa hàm. Nếu một giá trị cho tham số đó không được truyền khi hàm được gọi, thì giá trị mặc định đã cung cấp sẽ được sử dụng, nhưng nếu một giá trị đã được xác định, thì giá trị mặc định này bị bỏ qua và, thay vào đó, giá trị đã truyền được sử dụng. Bạn theo dõi ví dụ sau:


#include

using namespace std; int sum(int a, int b=20) { int ketqua; ketqua = a + b; return (ketqua); } int main () { // Khai bao bien cuc bo: int a = 100; int b = 200; int ketqua; // goi ham de tinh tong hai so. ketqua = sum(a, b); cout << "Tong gia tri la: " << ketqua << endl; // goi ham mot lan nua. ketqua = sum(a); cout << "Tong gia tri la: " << ketqua << endl; return 0; }

Chạy chương trình C/C++ trên sẽ cho kết quả sau:


Tong gia tri la: 300 Tong gia tri la: 120

Gọi hàm bởi giá trị trong C/C++

Phương thức thức gọi hàm bởi giá trị của các tham số đã truyền tới một hàm sao chép giá trị thực sự của một tham số vào trong tham biến chính thức của hàm. Trong trường hợp này, các thay đổi được tạo ra tới tham biến bên trong hàm không có ảnh hưởng tới tham số.

Theo mặc định, Ngôn ngữ C++ sử dụng hàm gọi bởi giá trị để truyền các tham số. Hiểu theo nghĩa chung là code bên trong một hàm không thể thay đổi tham số đã sử dụng để gọi hàm. Giả sử định nghĩa hàm traodoi() như sau:


// phan dinh nghia ham de trao doi cac gia tri. void traodoi(int x, int y) { int temp; temp = x; /* luu giu gia tri cua x */ x = y; /* dat y vao trong x */ y = temp; /* dat x vao trong y */ return; }

Bây giờ chúng ta gọi hàm traodoi() bởi truyền các giá trị thực sự như ví dụ sau:


#include

using namespace std; // Phan khai bao ham void traodoi(int x, int y); int main () { // Khai bao bien cuc bo: int a = 100; int b = 200; cout << "Truoc khi trao doi, gia tri cua a la: " << a << endl; cout << "Truoc khi trao doi, gia tri cua b la: " << b << endl; // goi ham de trao doi cac gia tri. traodoi(a, b); cout << "Sau khi trao doi, gia tri cua a la: " << a << endl; cout << "Sau khi trao doi, gia tri cua b la: " << b << endl; return 0; }

Bạn đặt phần định nghĩa hàm trên vào cuối đoạn code này, sau đó biên dịch và chạy chương trình C++ trên sẽ cho kết quả như hình sau:

Nó chỉ rằng không có thay đổi về giá trị mặc dù chúng đã được thay đổi bên trong hàm.

Gọi hàm bởi con trỏ trong C/C++

Phương thức gọi hàm bởi con trỏ trong C++ truyền các tham số tới một hàm, sao các địa chỉ của một tham số vào trong tham số chính thức. Bên trong hàm, địa chỉ này được sử dụng để truy cập tham số thực sự được sử dụng trong lời gọi hàm. Nghĩa là các thay đổi được tạo ra cho tham số chính thức ảnh hưởng tới tham số đã truyền.

Để truyền giá trị bởi con trỏ, các con trỏ tham số được truyền tới các hàm giống như bất kỳ giá trị khác. Vì thế, bạn cần khai báo các tham số hàm ở dạng kiểu con trỏ như trong hàm traodoi() sau, mà trao đổi giá trị của hai biến integer được trỏ bởi tham số của nó.


// phan dinh nghia ham de trao doi cac gia tri. void traodoi(int *x, int *y) { int temp; temp = *x; /* luu giu gia tri tai dia chi x */ *x = *y; /* dat y vao trong x */ *y = temp; /* dat x vao trong y */ return; }

Để kiểm tra chi tiết về con trỏ trong C++, bạn truy cập chương: Con trỏ trong C++.

Bây giờ, gọi hàm traodoi() bằng việc truyền các giá trị bởi con trỏ như trong ví dụ sau:


#include

using namespace std; // Phan khai bao ham void traodoi(int *x, int *y); int main () { // Khai bao bien cuc bo: int a = 100; int b = 200; cout << "Truoc khi trao doi, gia tri cua a la: " << a << endl; cout << "Truoc khi trao doi, gia tri cua b la: " << b << endl; /* goi ham traodoi de trao doi cac gia tri cua cac bien. * &a chi rang con tro dang tro toi a (dia chi cua bien a) va * &b chi rang con tro dang tro toi b (dia chi cua bien b). */ traodoi(&a, &b); cout << "Sau khi trao doi, gia tri cua a la: " << a << endl; cout << "Sau khi trao doi, gia tri cua b la: :" << b << endl; return 0; }

Bạn đặt phần định nghĩa hàm trên vào cuối đoạn code này, sau đó biên dịch và chạy chương trình C++ trên sẽ cho kết quả như hình sau:

Gọi hàm bởi tham chiếu trong C/C++

Phương thức gọi hàm bởi tham chiếu của các tham số đã truyền tới một hàm sao chép địa chỉ của một tham số vào trong tham biến chính thức. Bên trong hàm đó, địa chỉ được sử dụng để truy cập tham số thực sự được sử dụng trong gọi hàm. Điều này có nghĩa rằng các thay đổi được tạo ra với tham biến ảnh hưởng tới tham số được truyền.

Để truyền giá trị bởi tham chiếu, các con trỏ tham số được truyền tới các hàm giống như bất kỳ giá trị khác. Vì thế theo đó, bạn cần khai báo các tham số hàm như là các kiểu con trỏ như trong hàm traodoi() như sau, mà thay đổi giá trị của hai biến integer được trỏ tới bởi các tham số của nó.


// phan dinh nghia ham de trao doi cac gia tri. void traodoi(int &x, int &y) { int temp; temp = x; /* luu giu gia tri tai dia chi x */ x = y; /* dat y vao trong x */ y = temp; /* dat x vao trong y */ return; }

Bây giờ, chúng ta gọi hàm traodoi() bởi truyền các giá trị bởi tham chiếu như sau:


#include

using namespace std; // phan khai bao ham void traodoi(int &x, int &y); int main () { // Khai bao bien cuc bo: int a = 100; int b = 200; cout << "Truoc khi trao doi, gia tri cua a la: " << a << endl; cout << "Truoc khi trao doi, gia tri cua b la: " << b << endl; /* goi ham traodoi de trao doi cac gia tri boi su dung tham chieu bien.*/ traodoi(a, b); cout << "Sau khi trao doi, gia tri cua a la: " << a << endl; cout << "Sau khi trao doi, gia tri cua b la: " << b << endl; return 0; }

Bạn đặt phần định nghĩa hàm trên vào cuối đoạn code này, sau đó biên dịch và chạy chương trình C++ trên sẽ cho kết quả như hình sau:

Điều này chỉ ra rằng các thay đổi đã phản ánh bên ngoài hàm, không giống như gọi hàm bởi giá trị mà các thay đổi không phản ánh bên ngoài hàm.

Viết câu trả lời

Một hàm là một nhóm các câu lệnh cùng nhau thực hiện một nhiệm vụ. Mỗi chương trình C++ có ít nhất một hàm, là hàm main().

Bạn có thể chia mã của bạn thành các hàm riêng biệt. Cách bạn phân chia mã của bạn giữa các hàm khác nhau tùy thuộc vào bạn, nhưng về mặt logic mỗi hàm thực hiện một tác vụ cụ thể.

Một khai báo hàm cho trình biên dịch biết về tên, kiểu trả về và các tham số của hàm. Định nghĩa hàm cung cấp phần thân thực của hàm.

Thư viện chuẩn C++ cung cấp nhiều hàm được tích hợp sẵn mà chương trình của bạn có thể gọi. Ví dụ, strcat() để nối hai chuỗi, memcpy() để sao chép một vị trí bộ nhớ sang một vị trí khác và nhiều hàm khác.

Hàm trong C++ còn được gọi là thủ tục hoặc chương trình con trong các ngôn ngữ lập trình khác.

Để thực hiện bất kỳ tác vụ nào, chúng ta có thể tạo ra các hàm. Một hàm có thể được gọi nhiều lần. Nó cung cấp tính mô đun và khả năng sử dụng lại mã. Hàm giúp phân chia vấn đề phức tạp thành các thành phần nhỏ giúp chương trình dễ hiểu và dễ sử dụng.

Nội dung chính

#3[C++]. Cấu Trúc Rẽ Nhánh Trong Ngôn Ngữ Lập Trình C++ | IF ELSE và SWITCH CASE Trong C++
#3[C++]. Cấu Trúc Rẽ Nhánh Trong Ngôn Ngữ Lập Trình C++ | IF ELSE và SWITCH CASE Trong C++

Tạo một hàm trong C

Để tạo hay còn gọi là khai báo hàm riêng của bạn, xác định tên của hàm, được theo sau bởi dấu ngoặc đơn

()

và ngoặc kép

{}

:

Công thức:


void myFunction() { // code để thực thi}

Giải thích ví dụ


  • myFunction()

    là tên của hàm

  • Void

    nghĩa là hàm không có giá trị trả về.
  • Bên trong hàm này (the body), thêm code xác định tác vụ của hàm.

Giá trị trả về (Return value) trong hàm C

Giá trị trả về giống như chính tên của chúng, là các giá trị mà một hàm trả về sau khi hàm đó đã được thực thi xong.

Các giá trị trả về của hàm có thể là một số, một con trỏ, một ký tự hay bất cứ loại dữ liệu nào được quy định khi khai báo hàm.

Và kiểu dữ liệu sẽ trả về từ hàm cần được chỉ định rõ khi chúng ta khai báo hàm trong C. Ví dụ hàm tính tổng ở trên sẽ chỉ trả về giá trị thuộc kiểu int mà thôi.

int find_sum(int a,int b){

Tuy nhiên cũng có những lúc chúng ta cần tạo ra hàm mà không trả về bất cứ giá trị nào từ nó cả. Lúc này, thay vì chỉ định kiểu cho giá trị trả về, chúng ta sẽ dùng tới void trong c, có tác dụng không trả giá trị về từ hàm.

Ví dụ, chúng ta sử dụng lệnh void trong c để không trả giá trị về từ hàm sau:

void find_sum_void(int a,int b){

Hàm find_sum_void() và hàm find_sum() ở trên đều có chức năng tính tổng, tuy nhiên thay vì trả về tổng từ hàm, thì hàm find_sum_void() sẽ in luôn kết quả bên trong hàm, mà không trả về bất cứ giá trị nào khác từ hàm.

Lại nữa, để trả về giá trị từ hàm, chúng ta cần dùng tới lệnh return trong C. Bạn có thể tìm hiểu về return tại bài viết chi tiết sau đây:

  • Xem thêm: Return trong C và giá trị trả về
# [C++]. Từ Khóa Typedef Và Define trong C++ | Phân Biệt Typedef Và Define
# [C++]. Từ Khóa Typedef Và Define trong C++ | Phân Biệt Typedef Và Define

Ví dụ hàm trong C

Ví dụ dưới đây là mã nguồn cho một hàm được gọi là max(). Hàm này truyền vào hai tham số num1 và num2 và trả về giá trị lớn nhất giữa hai tham số:

/* hàm trả về giá trị lớn nhất giữa 2 số */ int max(int num1, int num2) { /* khai báo biến local */ int result; if (num1 > num2) result = num1; else result = num2; return result; }

Hàm trong c – Gọi hàm

Gọi hàm thông qua tên hàm và truyền tham số đầu vào hoặc xử lý kết quả trả về nếu có.

Gọi hàm tinhTong1 – Hàm không trả về giá trị và không nhận tham số đầu vào


tinhTong1();

Gọi hàm tinhTong2 – Hàm nhận tham số đầu vào và không trả về giá trị


tinhTong(10, 20);

Lưu ý: Trong 10 tương ứng với a, 20 tương ứng với b, tức hàm xử lý tính tổng 10 và 20

Gọi hàm tinhTong3 – Hàm trả về giá trị và không nhận tham số đầu vào


int ketqua; ketqua = tinhTong3();

Lưu ý: Vì hàm tinhTong3 trả về kết quả là tổng của 2 số nên lúc gọi hàm chúng ta phải khai báo biến và gán kết quả trả về từ hàm.

Gọi hàm tinhTong4 – Hàm trả về giá trị và nhận tham số đầu vào


int ketqua; ketqua = tinhTong4(1020, 4190);

Tương tự như hàm tinhTong3, khi gọi hàm tinhTong4 chúng ta phải xử lý kết quả trả về. Trong ví dụ trên, chúng ta thực hiện tính tổng 2 số 1020 và 4190. Kết quả tính toán được sẽ được gán vào biến ketqua.

Kết luận: Tuỳ vào mục đích hay yêu cầu cụ thể mà chúng ta sẽ xây dựng hàm phù hợp. Gọi hàm thông qua tên hàm và phải phù hợp với định nghĩa của hàm.

TOP 10 Hàm Excel Quan Trọng Nhất Trong Công Việc
TOP 10 Hàm Excel Quan Trọng Nhất Trong Công Việc

Đệ quy trong lập trình C

Trong phần này, bạn sẽ được học cách khai báo hàm đệ quy trong lập trình C thông qua ví dụ.

Một hàm có khả năng tự gọi chính nó thì được xem là hàm đệ quy. Và kỹ thuật này được gọi là đệ quy.

Đệ quy hoạt động như thế nào?

void recurse()

… .. …

recurse();

… .. …

int main()

… .. …

recurse();

… .. …

Đệ quy diễn ra liên tục cho đến khi nó bị ngăn lại bởi một vài điều kiện nhất định.

Để ngăn chặn đệ quy lặp vô hạn, bạn sử dụng câu lệnh if … else (hoặc cách tiếp cận tương tự) tại vị trí mà một nhánh thực hiện lệnh gọi đệ quy và nhánh còn lại thì không.

Ví dụ: Tổng các số tự nhiên sử dụng đệ quy

#include

int sum(int n);

int main() {

int number, result;

printf(“Enter a positive integer: “);

scanf(“%d”, &number);

result = sum(number);

printf(“sum = %d”, result);

return 0;

int sum(int n) {

if (n != 0)

// sum() function calls itself

return n + sum(n-1);

else

return n;

Đầu ra

Enter a positive integer:3

sum = 6

Đầu tiên, hàm sum() được gọi từ hàm main() với number được truyền dưới dạng đối số.

Giả sử ban đầu giá trị của n bên trong sum() là 3. Trong lần gọi hàm tiếp theo, 2 được chuyển cho hàm sum(). Quá trình này tiếp tục cho đến khi n bằng 0.

Khi n bằng 0, điều kiện if không thành công và phần else được thực thi, trả về tổng số cuối cùng của các số nguyên cho hàm main ().

Ưu điểm và nhược điểm của đệ quy

Đệ quy giúp lập trình trở nên ngắn gọn hơn. Tuy nhiên, dùng vòng lặp thay vì đệ quy sẽ khiến lập trình diễn ra chậm hơn nhiều.

Tóm lại, đệ quy là một khái niệm quan trọng. Nó thường được sử dụng trong cấu trúc dữ liệu và các thuật toán. Ví dụ, đệ quy thường được sử dụng để giải quyết những vấn đề như duyệt cây.

Keywords searched by users: hàm int trong c

Hàm Trong C (Bài 7) - Gia Sư Tin Học
Hàm Trong C (Bài 7) – Gia Sư Tin Học
Bài 5: Hàm Trong C++
Bài 5: Hàm Trong C++
Hàm Trong C++ - Học Lập Trình C++ Online - Viettuts
Hàm Trong C++ – Học Lập Trình C++ Online – Viettuts
Hướng Dẫn Khai Báo Hàm Trong C - Gia Sư Tin Học
Hướng Dẫn Khai Báo Hàm Trong C – Gia Sư Tin Học
C++] - Bài 20: Hàm Trong C++. - Youtube
C++] – Bài 20: Hàm Trong C++. – Youtube
Code Learn
Code Learn
Bài 60. Chuyển Kiểu Int Sang String Trong C/C++ – Luyện Code
Bài 60. Chuyển Kiểu Int Sang String Trong C/C++ – Luyện Code
Thông Tin Về Các Kiểu Dữ Liệu Trong C Mà Bạn Thường Gặp
Thông Tin Về Các Kiểu Dữ Liệu Trong C Mà Bạn Thường Gặp
Hàm Chuyển Đổi Chữ Thành Số Và Số Thành Chữ Trong C\C++
Hàm Chuyển Đổi Chữ Thành Số Và Số Thành Chữ Trong C\C++
C]. Hàm
C]. Hàm
Bài 63. Con Trỏ Trong C – Lập Trình Không Khó
Bài 63. Con Trỏ Trong C – Lập Trình Không Khó
Hàm Int Trong Excel Và Những Điều Quan Trọng Cần Biết
Hàm Int Trong Excel Và Những Điều Quan Trọng Cần Biết
Số Tự Nhiên Và Số Chấm Động Trong C++ (Integer, Floating Point) | How Kteam
Số Tự Nhiên Và Số Chấm Động Trong C++ (Integer, Floating Point) | How Kteam
Hàm Int Trong Excel: Cách Sử Dụng Để Lấy Phần Nguyên Đơn Giản Nhất
Hàm Int Trong Excel: Cách Sử Dụng Để Lấy Phần Nguyên Đơn Giản Nhất
Chương Trình Con (Hàm) Trong C. Lớp Buổi Chiều. - Youtube
Chương Trình Con (Hàm) Trong C. Lớp Buổi Chiều. – Youtube
Hàm System() Trong C | Thư Viện C Chuẩn
Hàm System() Trong C | Thư Viện C Chuẩn
Tổng Hợp Các Hàm Thư Viện Chuẩn Của C++ | Pdf
Tổng Hợp Các Hàm Thư Viện Chuẩn Của C++ | Pdf
Các Kiểu Dữ Liệu Trong Lập Trình C/C++ (Data Type) | Topdev
Các Kiểu Dữ Liệu Trong Lập Trình C/C++ (Data Type) | Topdev
Bài Tập Về Chuyển Đổi Số Thành Ký Tự Trong C
Bài Tập Về Chuyển Đổi Số Thành Ký Tự Trong C
Bài Tập Struct Trong C/C++ Có Lời Giải – Luyện Code
Bài Tập Struct Trong C/C++ Có Lời Giải – Luyện Code
Các Hàm Trong C | Cách Khai Báo Hàm Trong C Chi Tiết
Các Hàm Trong C | Cách Khai Báo Hàm Trong C Chi Tiết
Đệ Quy Trong Lập Trình C – Yêu Lập Trình
Đệ Quy Trong Lập Trình C – Yêu Lập Trình
Hướng Dẫn Sử Dụng Con Trỏ Trong C - Gia Sư Tin Học
Hướng Dẫn Sử Dụng Con Trỏ Trong C – Gia Sư Tin Học
Con Trỏ Trong C Là Gì? Giới Thiệu Khái Niệm Và Nội Dung Cơ Bản
Con Trỏ Trong C Là Gì? Giới Thiệu Khái Niệm Và Nội Dung Cơ Bản
C]. Hàm
C]. Hàm
Thiết Lập Hàm Mũ X = A (1 + B) ^ T Trong C
Thiết Lập Hàm Mũ X = A (1 + B) ^ T Trong C
Tổng Hợp Vector Trong C++ | Topdev Tổng Hợp Vector Trong C++
Tổng Hợp Vector Trong C++ | Topdev Tổng Hợp Vector Trong C++

See more here: kientrucannam.vn

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *