Các hàm trong lập trình C với các ví dụ: Đệ quy, Nội tuyến

Mục lục:

Anonim

Hàm trong C là gì?

Hàm trong lập trình C là một khối mã có thể tái sử dụng giúp chương trình dễ hiểu, dễ kiểm tra hơn và có thể dễ dàng sửa đổi mà không cần thay đổi chương trình đang gọi. Các chức năng phân chia mã và mô-đun hóa chương trình để có kết quả tốt hơn và hiệu quả. Tóm lại, một chương trình lớn hơn được chia thành nhiều chương trình con khác nhau được gọi là các hàm

Khi bạn chia một chương trình lớn thành nhiều chức năng khác nhau, bạn sẽ dễ dàng quản lý từng chức năng riêng lẻ. Bất cứ khi nào có lỗi xảy ra trong chương trình, bạn có thể dễ dàng điều tra các chức năng bị lỗi và chỉ sửa những lỗi đó. Bạn có thể dễ dàng gọi và sử dụng các chức năng bất cứ khi nào chúng được yêu cầu, giúp tiết kiệm thời gian và không gian một cách tự động.

Trong hướng dẫn này, bạn sẽ học-

  • Thư viện Vs. Chức năng do người dùng xác định
  • Khai báo chức năng
  • Định nghĩa hàm
  • Gọi hàm
  • Đối số hàm
  • Phạm vi biến đổi
  • Biến tĩnh
  • Hàm đệ quy
  • Các chức năng nội tuyến

Thư viện Vs. Chức năng do người dùng xác định

Mỗi chương trình 'C' đều có ít nhất một chức năng là chức năng chính, nhưng một chương trình có thể có bất kỳ số chức năng nào. Hàm main () trong C là một điểm bắt đầu của một chương trình.

Trong lập trình 'C', các hàm được chia thành hai loại:

  1. Chức năng thư viện
  2. Các chức năng do người dùng xác định

Sự khác biệt giữa thư viện và các hàm do người dùng định nghĩa trong C là chúng ta không cần viết mã cho một hàm thư viện. Nó đã hiện diện bên trong tệp tiêu đề mà chúng tôi luôn đưa vào ở phần đầu của chương trình. Bạn chỉ cần nhập tên của một hàm và sử dụng nó cùng với cú pháp thích hợp. Printf, scanf là các ví dụ về hàm thư viện.

Trong khi, hàm do người dùng định nghĩa là một loại hàm trong đó chúng ta phải viết phần thân của hàm và gọi hàm bất cứ khi nào chúng ta yêu cầu hàm thực hiện một số thao tác trong chương trình của chúng ta.

Một hàm do người dùng định nghĩa trong C luôn được viết bởi người dùng, nhưng sau này nó có thể là một phần của thư viện 'C'. Đó là một lợi thế lớn của lập trình 'C'.

Các hàm lập trình C được chia thành ba hoạt động như,

  1. Khai báo hàm
  2. Định nghĩa hàm
  3. Gọi hàm

Khai báo chức năng

Khai báo hàm nghĩa là viết tên chương trình. Nó là một phần bắt buộc để sử dụng các hàm trong mã. Trong một khai báo hàm, chúng ta chỉ cần chỉ định tên của một hàm mà chúng ta sẽ sử dụng trong chương trình của mình giống như một khai báo biến. Chúng ta không thể sử dụng một hàm trừ khi nó được khai báo trong một chương trình. Một khai báo hàm còn được gọi là " Nguyên mẫu hàm ".

Các khai báo hàm (được gọi là nguyên mẫu) thường được thực hiện bên trên hàm main () và có dạng chung:

return_data_type function_name (data_type arguments);
  • Các return_data_type : là kiểu dữ liệu của hàm giá trị trả lại cho tuyên bố kêu gọi.
  • Các function_name : Tiếp theo là dấu ngoặc đơn
  • Các tên đối số có khai báo kiểu dữ liệu của chúng tùy ý được đặt bên trong dấu ngoặc đơn.

Chúng ta xem xét chương trình sau đây trình bày cách khai báo một hàm lập phương để tính giá trị lập phương của một biến số nguyên

#include /*Function declaration*/int add(int a,b);/*End of Function declaration*/int main() {

Hãy nhớ rằng một hàm không nhất thiết phải trả về một giá trị. Trong trường hợp này, từ khóa void được sử dụng.

Ví dụ, khai báo hàm output_message chỉ ra rằng hàm không trả về giá trị: void output_message ();

Định nghĩa hàm

Định nghĩa hàm nghĩa là chỉ viết phần thân của một hàm. Phần thân của một hàm bao gồm các câu lệnh sẽ thực hiện một tác vụ cụ thể. Một thân hàm bao gồm một hoặc một khối câu lệnh. Nó cũng là một phần bắt buộc của một chức năng.

int add(int a,int b) //function body{int c;c=a+b;return c;}

Gọi hàm

Một cuộc gọi hàm có nghĩa là gọi một hàm bất cứ khi nào nó được yêu cầu trong một chương trình. Bất cứ khi nào chúng ta gọi một hàm, nó sẽ thực hiện một thao tác mà nó đã được thiết kế. Lời gọi hàm là một phần tùy chọn trong chương trình.

 result = add(4,5);

Đây, là mã hoàn chỉnh thứ:

#include int add(int a, int b); //function declarationint main(){int a=10,b=20;int c=add(10,20); //function callprintf("Addition:%d\n",c);getch();}int add(int a,int b) //function body{int c;c=a+b;return c;}

Đầu ra:

Addition:30

Đối số hàm

Các đối số của một hàm được sử dụng để nhận các giá trị cần thiết bởi lời gọi hàm. Chúng được khớp theo vị trí; đối số đầu tiên được truyền cho tham số đầu tiên, tham số thứ hai đến tham số thứ hai, v.v.

Theo mặc định, các đối số được truyền theo giá trị trong đó một bản sao dữ liệu được cấp cho hàm được gọi. Biến thực sự được truyền sẽ không thay đổi.

Chúng tôi xem xét chương trình sau đây trình bày các tham số được truyền bởi giá trị:

int add (int x, int y);int main() {int a, b, result;a = 5;b = 10;result = add(a, b);printf("%d + %d\ = %d\n", a, b, result);return 0;}int add (int x, int y) {x += y;return(x);}

Đầu ra của chương trình là:

5 + 10 = 15 

Hãy nhớ rằng các giá trị của a và b được chuyển cho hàm add không được thay đổi vì chỉ giá trị của nó được truyền vào tham số x.

Phạm vi biến đổi

Phạm vi biến có nghĩa là khả năng hiển thị của các biến trong mã của chương trình.

Trong C, các biến được khai báo bên trong một hàm là cục bộ của khối mã đó và không thể được tham chiếu bên ngoài hàm. Tuy nhiên, các biến được khai báo bên ngoài tất cả các hàm là toàn cục và có thể truy cập được từ toàn bộ chương trình. Các hằng được khai báo bằng #define ở đầu chương trình có thể truy cập được từ toàn bộ chương trình. Chúng tôi xem xét chương trình sau đây in ra giá trị của biến toàn cục từ cả hàm chính và hàm do người dùng xác định:

#include int global = 1348;void test();int main() {printf("from the main function : global =%d \n", global);test () ;return 0;}void test (){printf("from user defined function : global =%d \n", global);}

Kết quả:

from the main function : global =1348from user defined function : global =1348

Chúng tôi thảo luận về chi tiết chương trình:

  1. Chúng tôi khai báo một biến toàn cầu số nguyên với giá trị ban đầu là 1348.
  2. Chúng tôi khai báo và định nghĩa một hàm test () không nhận đối số hay trả về giá trị. Hàm này chỉ in ra giá trị biến toàn cầu để chứng minh rằng các biến toàn cục có thể được truy cập ở bất kỳ đâu trong chương trình.
  3. Chúng tôi in biến toàn cục trong hàm main.
  4. Chúng tôi gọi hàm kiểm tra trong orde để in ra giá trị biến toàn cục.

Trong C, khi các đối số được truyền cho các tham số hàm, các tham số hoạt động như các biến cục bộ sẽ bị hủy khi thoát khỏi hàm.

Khi bạn sử dụng các biến toàn cục, hãy sử dụng chúng một cách thận trọng vì có thể dẫn đến lỗi và chúng có thể thay đổi ở bất kỳ đâu trong chương trình. Chúng nên được khởi tạo trước khi sử dụng.

Biến tĩnh

Các biến tĩnh có phạm vi cục bộ. Tuy nhiên, chúng không bị phá hủy khi thoát khỏi hàm. Do đó, một biến static vẫn giữ nguyên giá trị của nó mãi mãi và có thể được truy cập khi hàm được nhập lại. Biến static được khởi tạo khi được khai báo và cần có tiền tố static.

Chương trình sau sử dụng một biến tĩnh:

#include void say_hi();int main() {int i;for (i = 0; i < 5; i++) { say_hi();}return 0;}void say_hi() {static int calls_number = 1;printf("Hi number %d\n", calls_number);calls_number ++; } 

Chương trình hiển thị:

Hi number 1Hi number 2Hi number 3Hi number 4Hi number 5

Hàm đệ quy

Hãy xem xét giai thừa của một số được tính như sau 6! = 6 * 5 * 4 * 3 * 2 * 1.

Phép tính này được thực hiện như lặp đi lặp lại tính toán fact * (fact -1) cho đến khi fact bằng 1.

Một hàm đệ quy là một hàm gọi chính nó và bao gồm một điều kiện thoát để kết thúc các cuộc gọi đệ quy. Trong trường hợp của phép tính số giai thừa, điều kiện thoát là thực tế bằng 1. Đệ quy hoạt động bằng cách gọi "xếp chồng" cho đến khi điều kiện thoát là đúng.

Ví dụ:

#include int factorial(int number);int main() {int x = 6;printf("The factorial of %d is %d\n", x, factorial(x));return 0;}int factorial(int number) {if (number == 1) return (1); /* exiting condition */elsereturn (number * factorial(number - 1));} 

Chương trình hiển thị:

 The factorial of 6 is 720 

Ở đây, chúng tôi thảo luận về chi tiết chương trình:

  1. Chúng ta khai báo hàm giai thừa đệ quy nhận một tham số nguyên và trả về giai thừa của tham số này. Hàm này sẽ tự gọi và giảm số cho đến khi kết thúc hoặc đạt được điều kiện cơ sở. Khi điều kiện là đúng, các giá trị được tạo trước đó sẽ được nhân với nhau và giá trị giai thừa cuối cùng được trả về.
  2. Chúng tôi khai báo và khởi tạo một biến số nguyên có giá trị "6" và sau đó in giá trị giai thừa của nó bằng cách gọi hàm giai thừa của chúng tôi.

Hãy xem xét biểu đồ sau để hiểu rõ hơn về cơ chế đệ quy bao gồm việc gọi hàm là chính nó cho đến khi đạt được trường hợp cơ sở hoặc điều kiện dừng và sau đó, chúng tôi thu thập các giá trị trước đó:

Các chức năng nội tuyến

Hàm trong lập trình C được sử dụng để lưu trữ các hướng dẫn được sử dụng thường xuyên nhất. Nó được sử dụng để mô-đun hóa chương trình.

Bất cứ khi nào một hàm được gọi, con trỏ lệnh sẽ nhảy đến định nghĩa hàm. Sau khi thực thi một hàm, con trỏ lệnh sẽ quay trở lại câu lệnh mà từ đó nó đã chuyển đến định nghĩa hàm.

Bất cứ khi nào chúng ta sử dụng các hàm, chúng ta yêu cầu thêm một đầu con trỏ để chuyển đến định nghĩa hàm và quay trở lại câu lệnh. Để loại bỏ sự cần thiết của các đầu con trỏ như vậy, chúng tôi sử dụng các hàm nội tuyến.

Trong một hàm nội tuyến, một lệnh gọi hàm được thay thế trực tiếp bằng một mã chương trình thực tế. Nó không nhảy đến bất kỳ khối nào vì tất cả các hoạt động được thực hiện bên trong hàm nội tuyến.

Các hàm nội tuyến chủ yếu được sử dụng cho các tính toán nhỏ. Chúng không phù hợp khi liên quan đến máy tính lớn.

Một hàm nội tuyến tương tự như hàm bình thường ngoại trừ từ khóa nội dòng được đặt trước tên hàm. Các hàm nội tuyến được tạo theo cú pháp sau:

inline function_name (){//function definition}

Hãy để chúng tôi viết một chương trình để thực hiện một hàm nội tuyến.

inline int add(int a, int b) //inline function declaration{return(a+b);}int main(){int c=add(10,20);printf("Addition:%d\n",c);getch();}

Đầu ra:

Addition: 30

Chương trình trên trình bày việc sử dụng một hàm nội tuyến để cộng hai số. Như chúng ta có thể thấy, chúng ta đã trả về phép cộng trên hai số chỉ trong hàm nội tuyến mà không viết thêm bất kỳ dòng nào. Trong khi gọi hàm, chúng ta vừa chuyển các giá trị mà chúng ta phải thực hiện phép cộng.

Tóm lược

  • Một hàm là một chương trình nhỏ hoặc một chương trình con.
  • Các hàm được sử dụng để mô đun hóa chương trình.
  • Thư viện và do người dùng định nghĩa là hai loại chức năng.
  • Một hàm bao gồm phần khai báo, phần thân hàm và phần gọi hàm.
  • Khai báo hàm và nội dung là bắt buộc.
  • Một lệnh gọi hàm có thể là tùy chọn trong một chương trình.
  • Chương trình C có ít nhất một chức năng; nó là hàm main ().
  • Mỗi hàm có một tên, kiểu dữ liệu của giá trị trả về hoặc khoảng trống, các tham số.
  • Mỗi hàm phải được định nghĩa và khai báo trong chương trình C của bạn.
  • Hãy nhớ rằng các biến thông thường trong một hàm C sẽ bị hủy ngay sau khi chúng ta thoát khỏi lệnh gọi hàm.
  • Các đối số được truyền cho một hàm sẽ không bị thay đổi vì chúng được truyền theo giá trị không theo địa chỉ.
  • Phạm vi biến được gọi là khả năng hiển thị của các biến trong một chương trình
  • Có các biến cục bộ và toàn cục trong lập trình C