Lập Trình C: Hàm (Function) | V1Study

Học viện Đào tạo và Công nghệ V1Study
  • Đào tạo Độ tuổi từ 5 - 11 Độ tuổi từ 12 - 17 Từ 18 tuổi
  • Lập trình Python Lập trình C C++ Java C# - C Sharp Android Scratch Pascal Robot mBot
  • Web ReactJS HTML5 CSS3 JavaScript Node.js JSP ASP.NET Core jQuery PHP
  • FW-CMS Laravel AngularJS Flutter Magento Bootstrap VueJS CodeIgnitor WordPress Sass Drupal
  • Video Video Python Video Lập trình C Video C# Video Java Video HTML5-CSS3-JavaScript Video SQL Server Video PHP Video jQuery Video Android Video C++ Video Scratch
  • Video1 Video XML-JSON Video MySQL Video Excel Video Giải thuật và Lập trình Video Sức khỏe Video Drupal Video mBot Video Giáo dục - Khoa học
  • Other Unity Giải thuật và lập trình Giải thuật và lập trình - C CCNA Mạng máy tính Design Patterns English Facebook SEO Git Tin học đại cương Japanese App-Uti Download
  • Data SQL Server XML JSON MySQL
  • News
Học viện Đào tạo và Công nghệ V1Study ≡ Lập trình C Bài học Danh sách bài học Bài 1. Giới thiệu Bài 2. Đặc điểm Bài 3. Hướng dẫn viết mã lệnh Bài 4. Hướng dẫn lập tư liệu nội bộ Bài 5. Quy tắc đặt tên Bài 6. Từ khoá (Keyword) Bài 7. Kiểu dữ liệu (Data type) Bài 8. Hằng (Constant) Bài 9. Biến (Variable) Bài 10. Định dạng, ký tự đặc biệt và bổ từ Bài 11. Lớp lưu trữ Bài 12. Phép toán số học Bài 13. Phép Gán (Assignment) Bài 14. Phép toán So sánh Bài 15. Phép toán Logic (Logical) Bài 16. Phép toán Logic nhị phân Bài 17. Độ ưu tiên phép toán Bài 18. printf() & scantf() Bài 19. Ép kiểu (Cast) Bài 20. if-else và ?: Bài 21. switch-case Bài 22. Vòng lặp for Bài 23. Vòng lặp while Bài 24. Vòng lặp do-while Bài 25. break; và continue; Bài 26. Hàm (Function) Bài 27. Lời gọi hàm (Call Function) Bài 28. Biến tổng thể và biến cục bộ Bài 29. Đệ quy (Recursion) Bài 30. Mảng (Array) một chiều Bài 31. Mảng hai chiều Bài 32. Chuỗi (String) Bài 33. Mảng chuỗi Bài 34. Hàm xử lý chuỗi (String) Bài 35. Con trỏ (Pointer) Bài 36. Cấp phát bộ nhớ Bài 37. Cấu trúc (Struct) Bài 38. Cơ bản về tập tin Bài 39. Quản lý tập tin văn bản Bài 40. Quản lý tập tin nhị phân Bài 41. Các hàm xử lý tập tin Ví dụ Giải phương trình bậc 1 Giải phương trình bậc 2 Nguyên hay thực Nguyên âm hay Phụ âm Số ngày trong tháng Tam giác vuông trái xuôi Cách nhập liệu cho mảng Cách xóa phần tử khỏi mảng Cách sắp xếp mảng Tìm Max, Min bằng phương pháp sắp xếp Tìm số nguyến tố trong mảng số thực Kiểm tra một số có phải số nguyên hay không Kiểm tra một số có phải số chính phương không Kiểm tra một số có phải số nguyên tố không Đếm số từ trong chuỗi Xóa phần tử mảng Tính điểm tổng kết môn học Lập trình C Tuổi cha và tuổi con Bài tập Bài tập cơ bản Bài tập phần điều kiện Bài tập phần vòng lặp (Loop) Bài tập phần mảng (Array) Bài tập phần hàm (function) Bài tập phần cấu trúc (struct) Bài tập phần tập tin (File) Quiz Tham khảo Hàm toán học (Math) Bảng mã ASCII Hệ thống nhớ máy tính Danh sách kiểu dữ liệu Phím tắt BorlandC Cách lấy kích thước mảng Chuyển từ kiểu int sang chuỗi Hàm hoán vị 2 số không cần dùng con trỏ Tìm kiếm nhị phân (Binary Search) Hướng dẫn sử dụng CodeBlocks bản nosetup 7 lý do bạn nên nắm được kiến thức C/C++ Sự khác biệt giữa mã định dạng %d và %i QuickSort Bài toán mã đi tuần Hàm xử lý ký tự (Character) Tích hợp C/C++ vào VS Code Videos Chỉnh sửa cơ bản Khung chương trình C Xác định nguyên hay thực Hoán vị hai số Xác định tính nguyên tố (prime) Demo giải phương trình bậc 1 Demo giải phương trình bậc 2 Phương trình bậc 2 - Tạo hàm Cách nhập liệu cho mảng một chiều Cách xóa phần tử khỏi mảng Cách sắp xếp mảng Tìm Max, Min bằng phương pháp sắp xếp Cách khai báo biến Xác định tính chính phương Kiểm tra số nguyên Kiểm tra tính chính phương Cách sắp xếp mảng 2 chiều Solutions Solution bài tập cơ bản Solution Bài tập phần điều kiện Solution bài tập phần vòng lặp Solution bài tập phần mảng số Tính tổng dãy số nguyên (không phải mảng) Đáp án tham khảo Bộ đề Đề 1 Đề 2 Đề 3 Đề 4 Đề 5 Đề 6 Đề 7 Đề 8 Đề 9 Đề 10 Đề 11 Đề 12 Đề 13 Đề 14 Đề 15 Đề 16 Đề 17 Đề 18 Đề 19 Đề 20 Đề 24 Taught Cơ sở lập trình - Buổi 1 Chữa bài tập 1 phần hàm Kiến thức phần hàm (function) Kiến thức phần mảng Mảng ký tự - Chuỗi Struct Lập trình C: Hàm (Function) Khóa học qua video: Lập trình Python All Lập trình C# All SQL Server All Lập trình C Java PHP HTML5-CSS3-JavaScript Đăng ký Hội viên Tất cả các video dành cho hội viên

Giới thiệu

Hầu hết các chương trình viết bằng ngôn ngữ C (cũng như viết bằng những ngôn ngữ khác như C++, Java, C#, Python) thường được phân nhỏ thành các hàm (function) trong đó có một hàm chính là main() và chương trình luôn luôn bắt đầu từ hàm main(). Hàm (Function) là phần kiến thức rất quan trọng trong C, nắm tốt kiến thức về hàm bạn sẽ có được thuận lợi khi tìm hiểu các ngôn ngữ lập trình khác.

Khái niệm

Hàm là đoạn chương trình thực hiện trọn vẹn một công việc nhất định (cụ thể). Hàm giúp chia cắt việc lớn thành nhiều việc nhỏ hơn, điều này tương đương với việc chia bài toán lớn thành các bài toán nhỏ hơn để giải, như vậy thì việc giải bài toán sẽ trở nên dễ dàng hơn. Ngoài ra, hàm còn giúp cho chương trình trở nên sáng sủa, dễ sửa, nhất là đối với các chương trình lớn.

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

Để định nghĩa hay tạo một hàm, ta có thể sử dụng cú pháp như sau:

Kiểu_dữ_liệu Tên_hàm(Khai_báo Các_đối_số) { Khai_báo_các_biến_của_hàm; //Nếu cần Khối_lệnh; return Giá_trị; //Nếu Kiểu_dữ_liệu là void thì không cần câu lệnh này }

, trong đó:

+ Kiểu_dữ_liệu: Là một trong 5 kiểu dữ liệu cơ bản hoặc một trong các kiểu dữ liệu dẫn xuất hay nâng cao. Nếu Kiểu_dữ_liệu là kiểu int thì không cần khai báo Kiểu_dữ_liệu vì int là kiểu dữ liệu mặc định của ngôn ngữ C.

+ Tên_hàm buộc phải có và việc đặt tên phải tuân theo quy tắc đặt tên. Ví dụ muốn sử dụng tên hàm là "Tinh binh phuong" thì không được vì có dấu cách trong đó, ta có thể thay bằng "Tinh_binh_phuong" hoặc "tinhBinhPhuong".

+ Các_đối_số: Không bắt buộc, nghĩa là Các_đối_số có thể có hoặc không có tuỳ thuộc vào mục đích dùng hàm đó để làm gì.

+ Cặp () bao ngoài Các_đối_số và sau Tên_hàm là bắt buộc phải có, ngay cả không có Các_đối_số.

+ Cặp {} là bắt buộc phải có đối với mọi định nghĩa hàm.

+ return Giá_trị: Lệnh này dùng để trả về giá trị cho hàm, nếu Kiểu_dữ_liệu của hàm không phải là void thì lệnh này buộc phải có. Giá_trị có thể là một hằng, giá trị của biến, giá trị của biểu thức hoặc giá trị trả về từ một lời gọi hàm khác.

Một số chú ý đối với hàm:

- Có thể thể gọi một hàm từ hàm khác nhưng bạn không được định nghĩa hàm bên trong hàm (kể cả trong hàm main()).

- Kiểu dữ liệu của Giá_trị nên cùng kiểu (nhưng không được lớn hơn) với kiểu dữ liệu của hàm.

- Bạn có thể định nghĩa hàm nằm trên hoặc nằm dưới hàm main(). Trong trường hợp bạn muốn định nghĩa hàm nằm dưới hàm main() thì bạn cần phải khai báo hàm.

- Mỗi hàm chỉ có thể trả về được duy nhất một giá trị. Trong trường hợp bạn muốn trả về nhiều hơn một giá trị thì bạn có thể sử dụng phương pháp tham chiếu.

- Nơi mà hàm trả về giá trị chính là nơi mà nó được gọi.

Sau đây là một ví dụ áp dụng hàm, đó là viết chương trình tính giai thừa: S = n! (=1*2*3*4*…*n). Chương trình được viết như sau:

#include<stdio.h> float Giaithua(int n) { //định nghĩa hàm Giaithua() có kiểu trả về là float có một đối số kiểu int int i; //biến cục bộ của hàm float KQ=1.0; //đây cũng là biến cục bộ for (i=1; i<=n; i++) //n ở đây là đối số của hàm Giaithua() KQ = KQ*i; return KQ ; //hàm trả về giá trị lưu trong biến KQ cho nơi gọi } int main() { //mọi chương trình C luôn bắt đầu từ hàm main() int n; //khai báo biến nguyên n printf("Nhap n = "); //in ra màn hình chuỗi scanf("%d",&n); //nhập giá trị cho n printf("\nGiai thua cua %d la %f", n, Giaithua(n)); //gọi đến hàm Giaithua() trong đó truyền giá trị của n (thuộc hàm main()) cho đối số n của hàm Giaithua() return 0; }

Dưới đây là một kết quả thực hiện chương trình trên:

Giai thừa

Khai báo hàm

Việc khai báo một hàm đơn giản hơn so với định nghĩa một hàm. Mục đích của việc khai báo hàm là để cho việc kiểm soát code chương trình của bạn được dễ dàng hơn. Mặt khác, nếu bạn muốn định nghĩa một hàm nằm dưới hàm main() thì bạn bắt buộc phải khai báo hàm. Cú pháp của việc khai báo hàm như sau:

Kiểu_dữ_liệu Tên_hàm(Khai_báo Các_đối_số);

Lưu ý là bạn có thể khai báo hàm nằm bên trong hàm khác, nhưng bạn cần phải khai báo trước khi có lời gọi hàm đến hàm đó. Trong trường hợp khai báo hàm trong hàm main() thì lệnh khai báo phải nằm trên lời gọi hàm clrscr().

Ví dụ trên đây có thể được viết lại như sau:

#include<stdio.h> float Giai_thua(int n); //Khai báo nhằm mục đích đặt hàm Giai_thua() ở sau hàm main() int main(){ int n; printf("Nhap n = "); scanf("%d",&n); printf("\nGiai thua cua %d la %g", n, Giai_thua(n)); return 0; } float Giai_thua(int n) { int i; float GT=1.0; for(i=1; i<=n ; i++) GT = GT * i; return GT; }

Lời gọi hàm

Các hàm thường giao tiếp hay gọi đến nhau bằng lời gọi hàm (call function). Việc giao tiếp hay gọi đến nhau của các hàm thông qua cách truyền tham số.

Các tham số được truyền theo một trong hai cách sau đây:

Truyền đối số bằng tham trị (hay giá trị)

Ý nghĩa: Đây là lời gọi hàm mà trong đó đối số thực sự không thay đổi giá trị sau khi hàm được gọi thực hiện xong công việc. Truyền bằng tham trị là lời gọi mặc định của các chương trình C.

Truyền đối số bằng tham chiếu (hay tham biến)

* Bản chất của truyền bằng tham chiếu là truyền địa chỉ của biến.

* Ý nghĩa: cách gọi hàm bằng truyền tham chiếu có thể làm thay đổi giá trị của đối số thực sự. Việc truyền tham chiếu được thực hiện thông qua biện pháp con trỏ. Cú pháp như sau:

Kiểu_dữ_liệu Tên_hàm(Kiểu _dữ_liệu *Tên_con_trỏ_1, Kiểu_dữ_liệu *Tên_con_trỏ_2,…) { Khối_lệnh; } void main() { Kiểu_dữ_liệu Biến_1; Kiểu_dữ_liệu Biến_2; Tên_hàm(&Biến_1,&Biến_2,…); }

Ví dụ dưới đây sẽ viết một hàm có nhiệm vụ hoán đổi giá trị của hai số x và y cho nhau với x và y nhập vào từ bàn phím.

Nếu không dùng phương pháp tham chiếu thì chương trình sẽ không thực hiện được mục đích, tức là hai số x và y vẫn giữ nguyên giá trị sau lời gọi hàm. Chương trình được viết như sau:

#include <stdio.h> void hoanVi(float x, float y) { int z; z=x; //cách khác: x=x+y; x=y; //y=x-y; //y= (x+y)-y = x y=z; //x=x-y; //x= (x+y)-x = y } int main() { float x, y; printf("Nhap 2 so x, y: "); scanf("%f%f",&x,&y); hoanVi(x, y); printf("\nSau khi tien hanh hoan vi, ta duoc: x=%g va y=%g", x, y); return 0; }

Nếu dùng phương pháp tham chiếu thì chương trình sẽ thực hiện được mục đích, x và y sẽ hoán đổi giá trị cho nhau. Chương trình được viết như sau:

#include<stdio.h> void DoiGT(float *x, float *y) { int z; z=*x; //cách khác: *x=*x+*y; *x=*y; //*y=*x-*y; //*y= (*x+*y)-*y = *x *y=z; //*x=*x-*y; //*x= (*x+*y)-*x = *y } int main() { float x, y; printf("\nNhap 2 so x, y: "); scanf("%f%f", &x, &y); DoiGT(&x,&y); printf("\nSau khi tien hanh hoan vi, ta duoc: x=%g va y=%g", x, y); return 0; }

Một kết quả demo thể hiện như hình sau:

Lời gọi hàm - Hoán vị

Còn đây là ví dụ viết chương trình nhập vào 3 giá trị kiểu thực (float hoặc double), sau đó tìm giá trị lớn nhất trong 3 giá trị đó. Yêu cầu:

· Phải viết chương trình dưới dạng các hàm.

· Không được sử dụng các biến tổng thể (biến toàn cục).

Theo yêu cầu trên thì ta phải có 3 biến để lưu 3 giá trị muốn so sánh và các biến này phải là các biến địa phương khai báo trong các hàm. Vì hàm main() là hàm chính của chương trình nên ta sẽ khai báo các biến trong hàm main(), và vì chương trình được viết dưới dạng các hàm nên ta khai báo thêm các con trỏ ứng với các biến đó. Sau đây là đoạn code thể hiện:

#include<stdio.h> void nhap(float *a, float *b, float *c) { //hàm nhập các số a, b và c printf("\nNhap a: "); scanf("%f", a); printf("\nNhap b: "); scanf("%f", b); printf("\nNhap c: "); scanf("%f", c); } float sosanh(float a, float b, float c) { //hàm tìm giá trị lớn nhất float max; //biến lưu lại giá trị lớn nhất max = a; //giả sử a là số lớn nhất if(max < b) //nếu b lớn hơn max max = b; //thì gán b cho max if(max < c) //nếu c lớn hơn max max = c; //thì gán c cho max return max; //trả lại giá trị lớn nhất lưu trong biến max } int main() { float a, b, c; //khai báo 3 biến a, b, c float max; //khai báo biến lưu trữ giá trị lớn nhất nhap(&a,&b,&c); //Gọi hàm nhap() truyền đối số ở dạng tham chiếu max=sosanh(a,b,c); //Gọi và gán giá trị trả về của hàm sosanh() cho biến max printf("\nSo lon nhat trong 3 so nhap vao la: %g", max); return 0; }

Chú ý: Mọi hàm nhập giá trị cho các biến địa phương (cục bộ) đều được truyền theo phương pháp tham chiếu theo mẫu chương trình như trên.

» Tiếp: Lời gọi hàm (Call Function) « Trước: break; và continue; Khóa học qua video: Lập trình Python All Lập trình C# All SQL Server All Lập trình C Java PHP HTML5-CSS3-JavaScript Đăng ký Hội viên Tất cả các video dành cho hội viên Khóa học qua video: Lập trình Python All Lập trình C# All SQL Server All Lập trình C Java PHP HTML5-CSS3-JavaScript Đăng ký Hội viên Tất cả các video dành cho hội viên Copied !!! Copy linkCopied link!
Bạn muốn tìm kiếm điều gì?

Từ khóa » Hàm Main Trong C Là Gì