Bài giảng Ngôn ngữ lập trình C - Chương 4: Hàm cung cấp cho người học các kiến thức: Giới thiệu, khai báo prototype, viết nội dung của hàm, tham số trong lời gọi hàm, hàm đệ quy. Mời các bạn cùng tham khả nội dung chi tiết.
Ngơn ngữ lập trình C Chương – Hàm Giới thiệu Khai báo prototype Viết nội dung hàm Tham số lời gọi hàm Hàm đệ quy Giới thiệu Một chương trình viết ngôn ngữ C dãy hàm, phải có hàm (hàm main() ) Hàm chia tốn lớn thành cơng việc nhỏ hơn, giúp thực công việc lặp lại cách nhanh chóng mà khơng phải viết lại đoạn chương trình Thứ tự hàm viết chương trình bất kỳ, song chương trình bắt đầu thực từ hàm main() Hàm xem đơn vị độc lập chương trình Các hàm có vai trị ngang nhau, khơng cho phép xây dựng hàm bên hàm khác Quy tắc xây dựng hàm Cú pháp: ([danh sách tham số]) { [return ;] } Trong : kiểu C (char, int, long, float,…) Nếu khơng có kiểu trả void : theo quy tắc đặt tên định danh : tham số hình thức đầu vào giống khai báo biến, cách dấu , Nếu khơng có đối, dung void để khai báo đối : trả cho hàm qua lệnh return Khai báo prototype Khi biên dịch chương trình C: Biên dịch theo thứ tự từ xuống Trường hợp hàm bị gọi trước vị trí hàm định nghĩa? => Phải khai báo prototype (nguyên mẫu) hàm trước sử dụng hàm Cú pháp khai báo prototype: ([Danh sách tham số]) Khai báo prototype Ví dụ: #include double power(float,int); // Khai báo prototype hàm main() { float x=12.3; int n=3; printf(“lũy thừa bậc %d %f %f”,power(x,n)); } double power(float base, int exp) { //Định nghĩa hàm … } Quy tắc hoạt động hàm Lời gọi hàm có dạng: Tên_hàm ([Danh sách đối số]); Chú ý: Số đối số = số tham số hình thức Quy trình thực gọi hàm: Cấp phát vùng nhớ cho biến cục tham số hình thức Gán giá trị đối số cho tham số hình thức Thực câu lệnh thân hàm Khi gặp câu lệnh return dấu } cuối thân hàm máy xố biến cục bộ, tham số hình thức khỏi hàm Nếu trở từ câu lệnh return có chứa biểu thức giá trị biểu thức gán cho hàm Giá trị hàm sử dụng biểu thức chứa Tham số hàm Tham số (function parameter): Như biến khai báo khai báo hàm khai báo prototype Có phạm vi hoạt động hàm mà chúng khai báo Là biến tự động, cấp phát nhớ hàm gọi bị xóa khỏi hàm Có phạm vi hoạt động tạm thời, đó, đặt tên trùng với đại lượng ngồi hàm Đối số hàm Đối số (argument): Là giá trị truyền vào hàm (khi gọi hàm) vị trí tham số Khi hàm gọi, tất tham số (parameter) hàm tạo biến, giá trị đối số (argument) copy vào tham số Việc copy giá trị đối số vào tham số gọi truyền tham số (parameter passing) Truyền tham số cho hàm Có cách truyền tham số cho hàm: Truyền Truyền theo tham trị (by value) theo tham biến hay tham trỏ (by variable/pointer) Truyền tham số cho hàm Truyền giá trị Truyền đối số cho hàm dạng giá trị Có thể truyền hằng, biến, biểu thức hàm nhận giá trị Được sử dụng khơng có nhu cầu thay đổi giá trị tham số sau thực hàm void TruyenGiaTri(int x) { … x++; } Truyền tham số cho hàm Truyền Địa (Call by Address) Truyền đối số cho hàm dạng địa (con trỏ) Không truyền giá trị cho tham số Được sử dụng có nhu cầu thay đổi giá trị tham số sau thực hàm void TruyenDiaChi(int *x) { … (*x)++; } Truyền tham số cho hàm Truyền mảng vào hàm: Chỉ có địa mảng truyền vào (tên mảng không kèm theo số địa mảng) Ví dụ: int a[20], n = 10; Input_array(a, n); /*Input_array(int a[], int n) hàm nhập giá trị phần tử mảng từ bàn phím*/ Truyền tham số cho hàm Lưu ý truyền tham số Trong hàm, tham số truyền theo nhiều cách void HonHop(int x, int *y) { … x++; (*y)++; } Truyền tham số cho hàm Lưu ý truyền đối số Sử dụng tham chiếu cách để trả giá trị cho chương trình int TinhTong(int x, int y) { return x + y; } void TinhTong(int x, int y, int *tong) { *tong = x + y; } void TinhTongHieu(int x, int y, int *tong, int *hieu) { *tong = x + y; *hieu = x – y; } Truyền tham số cho hàm Một số lưu ý gọi hàm { Các hàm khai báo } void main() { int n = 9; XuatTong(1, 2); XuatTong(1, n); TinhTong(1, 2); int tong = TinhTong(1, 2); TruyenGiaTri(1); TruyenGiaTri(n); TruyenDiaChi(1); TruyenDiaChi(&n); } Hàm đệ quy Định nghĩa: Hàm đệ quy hàm cho phép gọi đến thân hàm Khi hàm gọi đệ qui đến nó, lần gọi máy tạo tập hoàn toàn độc lập với tập tạo lần gọi trước 17 Hàm đệ quy Các toán sử dụng hàm đệ quy: Thường áp dụng cho tốn phụ thuộc tham số có đặc điểm sau: Bài toán dễ dàng giải số trường hợp riêng ứng với giá trị đặc biệt tham số Người ta thường gọi trường hợp suy biến Trong trường hợp tổng qt, tốn qui tốn dạng giá trị tham số bị thay đổi Sau số hữu hạn bước biến đổi đệ qui dẫn tới trường hợp suy biến Hàm đệ quy Cách xây dựng hàm đệ quy: if (trường hợp suy biến){ Thực cách giải toán suy biến } else { /* Trường hợp tổng quát */ Gọi đệ qui tới hàm viết với giá trị khác tham số } Hàm đệ quy Ví dụ: Tính n! #include "stdio.h“ #include "ctype.h“ long gtdq(int n) { if (n==0 || n==1) return 1; else return(n*gtdq(n-1)); } main() { char kt; int n; do{ printf("Nhap vao mot so: "); scanf("%d",&n); printf("\n n!=%ld",gtdq(n)); printf("\nCo tinh tiep? (c/k)"); kt=getche(); } while (toupper(kt)=='C'); } Giải thích hoạt động hàm đệ qui: • Lần gọi, máy lấy giá trị đối số lần cho hàm giai thừa, số n, tính biểu thức: n*gtdq(n-1); (*) • Trong biểu thức khơng tính trực tiếp được, thơng tin cũ đưa vào Stack, máy gọi lại hàm giai thừa tính với đối số n-1, tính biểu thức: (n-1)*gtdq(n-2); • Tương tự đến Khi thực hiện: 2*gtdq(1) ; (**) • Khi đến thực hiện: return 1; (***) • Đến đây, máy lấy Stack để tính, tính cho biểu thức: 2*gtdq(1) kết (**) • Tương tự Stack rỗng, ta có n! • Chú ý: • Khi dùng hàm đệ qui, máy tính dùng nhiều nhớ ngăn xếp dẫn đến tràn ngăn xếp Vì gặp tốn mà có cách giải vịng lặp (khơng dùng đệ qui) ta nên dùng cách Hàm đệ quy Một số ví dụ: Tính tổng + + … + n Tính số Fibonaci Tìm USCLN số nguyên Chuyển số nguyên n từ số 10 sang số Tìm kiếm nhị phân mảng xếp Đảo ngược mảng ... chóng mà khơng phải viết lại đoạn chương trình Thứ tự hàm viết chương trình bất kỳ, song chương trình bắt đầu thực từ hàm main() Hàm xem đơn vị độc lập chương trình Các hàm có vai trị ngang... tính biểu th? ?c: n*gtdq(n-1); (*) • Trong biểu thức khơng tính trực tiếp được, thông tin cũ đưa vào Stack, máy gọi lại hàm giai thừa tính với đối số n-1, tính biểu th? ?c: (n-1)*gtdq(n-2); • Tương.. .Chương – Hàm Giới thiệu Khai báo prototype Viết nội dung hàm Tham số lời gọi hàm Hàm đệ quy Giới thiệu Một chương trình viết ngơn ngữ C dãy hàm, phải có hàm