Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 53 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
53
Dung lượng
1,96 MB
Nội dung
Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái CHƯƠNG 4: HÀM Khái niệm hàm 1.1Khái niệm phân loại Một chương trình viết ngơn ngữ C dãy hàm, có hàm chính(hàm main) Hàm chia tốn lớn thành cơng việc nhỏ, có đoạn chương trình viết lặp lặp lại nhiều lần, để tránh rườm rà thời gian viết chương trình; người ta thường phân chia chương trình thành nhiều module, module giải cơng việc vào Thứ tự hàm chương trình bất kỳ, song chương trình thực từ main() Trong C, chương trình gọi hàm Hàm C trả kết thơng quan tên hàm hay khơng trả kết Hàm có hai loại: Hàm chuẩn hàm tự định nghĩa Trong chương ta trọng đến cách định nghĩa hàm cách sử dụng hàm Hàm thư viện Hàm thư viện hàm định nghĩa sẵn thư viện đó, muốn sử dụng hàm thư viện phải khai báo thư viện trước sử dụng lệnh #inlcude Hàm người dùng Hàm người dùng hàm người lập trình tự tạo nhằm đáp ứng nhu cầu xử lý Một hàm định nghĩa sử dụng đâu chương trình Trong C, chương trình bắt đầu thực thi hàm main Chương trình dùng để tơí ưu hóa việc tổ chức chương trình, chia chương trình lớn thành nhiều cơng việc độc lập nhỏ Dùng chương trình thực cơng việc nhỏ, tạo thành mơ-đun Khi nhiệm vụ chương trình cung cấp liệu đầu vào cho mơ-đun để hồn thành cơng việc Một chương trình viết theo cách gọi chương trình cấu trúc Có thể minh họa chương trình hình sau : Chương trình thực cơng việc A Dữ liệu đưa vào để thực công việc A Dữ liệu kết công việc A 52 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái Hình 4.1.1 : Hình ảnh minh họa nhiệm vụ chương trình Để nhận liệu đưa vào cho chương trình chứa liệu kết phải sử dụng tham số (parameters) chương trình Tham số tồn hai hình thức tham số thực tham số hình thức Tham số hình thức tham số để khai báo xây dựng trương trình con, cịn tham số thực để xác định liệu đưa vào gọi chương trình Trong số ngơn ngữ lập trình cung cấp hai loại chương trình riêng biệt hàm(function) thủ tục (procedures) C cung cấp loại hàm Để tạo hàm cần xác định - Hàm tạo thực công việc ? - Sau thưc song có cần trả liệu hay nhiều liệu không ? - Để thực cơng việc ta cần liệu ? 1.2 Quy tắc hoạt động hàm Khi gặp lời gọi hàm, hàm thực theo trình tự sau: Cấp phát nhớ cho đối biến cục Gán giá trị tham số thực cho đối tượng tương ứng 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óa đối, biến cục thoát khỏi hàm Chú ý: Số tham số thực phải số tham số hình thức (đối hàm) kiểu tham số thực phải kiểu với tham số hình thức tương ứng 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 Xây dựng hàm 2.1 Định nghĩa hàm Khai báo hàm Khai báo hàm thực phần đầu chương trình, khai báo máy biết thông tin hàm bao gồm : kiểu liệu trả có hay khơng, tên hàm, tham số bao gồm kiểu tên tham số Cú pháp khai báo sau : 53 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1, kiểu2 tham_số2 ) ; Trong : - Tên kiểu trả : tên kiểu liệu quy định kết trả khiểu - Tên hàm : Tự đặt theo quy định đặt tên ngôn ngữ C - Kiểu1 tham_số1 : xác định tên tham số thứ kiểu tham số đó, Nếu có nhiều tham số, tham số phân cách dấu phẩy (,) Ví dụ: int sum(int a , int b) ; float max(float x, float y); Nếu hàm khơng có liệu trả viết kiểu trả void khơng có tham số bỏ trống phải có cặp dấu đóng mở ngoăc () sau tên hàm Ví dụ: void hien(); Xây dựng hàm Sau khai báo xong hàm viết lệnh thực cơng việc đặt cho chương trình Cú pháp: Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ) { Các câu lệnh thực công việc đặt cho hàm } Khi cần kết thúc thực hàm trả liệu đây, viết lệnh return vào vị trí cần thiết hàm Cú pháp: return giá-trị-dữ-liệu-trả-về; Ví dụ: int sum(int a, int b) { return a+b; } Hoặc 54 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái float max(float x, float y) { if(x>y) return x; else return y; } Đối với hàm có kiểu void khơng cần lệnh return Ví dụ: void hien() { printf(“ho va ten: Nguyen Van Nam”); printf(“Ngay sinh :12\08\2014”); printf(“que quan : Yen Bai”); } Chú ý: Thông thường với chương trình đơn giản có chương trình người ta viết lệnh cho hàm nơi khai báo 2.2 Sử dụng hàm Một hàm định nghĩa chúng chưa thực thi trừ ta có lời gọi đến hàm Khi thực chương trình máy thực lệnh chương trình chính(hàm main), để u cầu máy thực cơng việc chương trình ta phải viết lệnh gọi chương trình với cú pháp sau Cú pháp: ([Danh sách tham số]) Lời gọi câu lệnh độc lập đặt biểu thức, đặt biểu thức hàm phải có giá trị trả để thực tính tốn biểu thức Ví dụ: printf(“Tong hai so va la: %d”,tong(5,6)); Hoặc: float x ; 55 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái x = max(a,b) ; Hoăc: hien(); Chú ý: Thông thường lời gọi hàm viết chương trình chính, nhiên viết chương trình khác Các chương trình gọi lẫn Các tham số hàm 3.1 Phân biệt loại tham số Trong lập trình, tham số biến thu nhận chương trình Tại thời gian chạy, chương trình sử dụng giá trị gán cho tham số để thay đổi cách ứng xử Hầu hết ngơn ngữ lập trình định nghĩa chương trình khơng có tham số chấp nhận vài tham số Tham số hình thức: Là biến liệt kê danh sách tham số (thường nằm phần đầu định nghĩa chương trình con) Tham số thực : Là giá trị cụ thể biến thời gian chạy Để phân biệt rõ hai khái niệm trên, xét ví dụ đây: int sum(int gt1, int gt2) { return (gt1+gt2); } Hàm sum nhận hai tham số hình thức: gt1và gt2 Nó lấy tổng giá trị truyền vào tham số trả kết cho nơi gọi hàm (bằng cách sử dụng kỹ thuật cung cấp tự động trình biên dịch C) Mã gọi hàm sum trơng đây: int a=40; int b=2; int c = sum(a,b); Các biến a b khởi tạo với giá trị 40 Các biến khơng phải tham số hình thức hay tham số thực Tại thời gian chạy, giá trị gán cho biến truyền vào cho hàm sum Trong hàm sum, tham số hình thức gt1 gt2 tính giá trị cho kết hai tham số thực 56 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái 40 Giá trị tham số thực cộng lại, kết trả cho nơi gọi hàm - nơi gán cho biến c Tham số hình thức thường gọi tắt tham số Tham số thực gọi tham số thực, tham đối đối số 3.2 Cách truyền tham số Có hai cách để truyền tham số cho hàm: Truyền theo tham trị truyền theo tham chiếu Truyền tham trị Trong chế truyền tham số giá trị (gọi truyền tham trị), chương trình chạy, tham số thực gán cho tham số hình thức (sao chép giá trị) Nghĩa sửa đổi chương trình tham số hình thức khơng gây ảnh hưởng tới biến truyền vào chương trình theo kiểu truyền tham trị Các tham số truyền giá trị gọi tham trị Do có giá trị truyền vào chương trình con, tham số thực khơng thiết phải biến thơng thường mà giá trị, biến, biểu thức trả giá trị Truyền biến Trong chế truyền tham số biến (gọi truyền tham biến), chương trình chạy, tham số hình thức trở thành tham chiếu tham số thực Nghĩa sửa đổi chương trình tham số hình thức có tác dụng với tham số thực Đây gọi hiệu ứng phụ chương trình Các tham số truyền biến gọi tham biến Ngược lại với chế truyền giá trị, chế truyền biến đòi hỏi tham số thực phải biến Các đối số mặc định Một số ngơn ngữ lập trình cho phép đối số mặc định (default argument) cho trước cách tường hay ngầm định phần khai báo chương trình Điều cho phép nơi gọi bỏ qua đối số gọi chương trình Nếu đối số mặc định cho cách tường mình, giá trị sử dụng khơng cung cấp nơi gọi Nếu đối số mặc định ngầm định (mà đơi khai báo từ khóa "Optional" (khơng bắt buộc)) ngơn ngữ cung ứng giá trị "ban đầu" thông dụng (như null, tập rỗng, giá trị 0, xâu kí tự rỗng, ) giá trị (của tham số) không nơi gọi cung cấp Chiều dài biến đổi danh sách tham số 57 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái Một số ngôn ngữ cho phép chương trình định nghĩa với số đối số thay đổi Đối với ngơn ngữ vậy, chương trình phải duyệt qua danh mục đối số Các tham số danh định Một số ngơn ngữ lập trình cho phép chương trình có tham số danh định (named parameter) Điều cho phép mã nơi gọi chương trình có tính tự mơ tả (self-documenting) cao Nó cung cấp cho nơi gọi khả uyển chuyển cao hơn, thường cho phép thay đổi thứ tự đối số hay bỏ qua số đối số cần thiết 3.3 Biến toàn cục biến cục Biến toàn cục biến nhớ khai báo hàm(thường khai báo sau khai báo thư viện), có tác dụng đến tồn chương trình chương trình chương trình Biến cục biến nhớ khai báo bên chương trình con, có tác dụng chương trình Bên ngồi chương trình biến khơng sử dụng Ví du: #include #include int a,b; int sum() { int c = a + b; return c; } int tich() { int c ; c =a*b; return c; } void main() { clrscr(); 58 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái printf(“nhap vao so a = ”); scanf(“%d”,&a); printf(“nhap vao so b = ”);scanf(“%d”,&b); printf(“\n tong hai so: %d”,sum()); printf(“\n tich hai so la: %d”,tich()); getch(); } Trong ví dụ hai biến a b biến toàn cục sử dụng hàm sum, max main Trong hàm sum max có biến cục c biến c hàm sum độc lập riêng biệt so với c hàm max Hàm đệ quy 4.1 Khái niệm đệ quy Một hàm gọi đệ quy bên thân hàm có lệnh gọi đến Ví dụ: Người ta định nghĩa giai thừa số nguyên dương n sau: N!= 1*2*3*….*(n-1)*n=(n-1)! *n (với 0!=1) Như vậy, để tính n! ta thấy n=0 n!=1 ngược lại n!=n*(n-1)! Với định nghĩa hàm đệ quy tính n! viết: #include #include /*hàm tính n! đệ quy*/ long giaithua_ dequy(int n) { if(n==0) Return 1; else return n*giaithua_dequy(n-1); } 4.2 Các toán dùng đệ quy Phương pháp đệ quy thường dùng phổ biến ứng dụng mà cách giải thể việc áp dụng liên tiếp giải pháp cho tập hợp toán Phương pháp đệ quy giải pháp hữu hiệu Giải pháp vịng lặp có hiệu mặt thời gian vùng nhớ Còn với đệ quy lần 59 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái gọi đệ quy máy phải dành số vùng nhớ để trữ trị, thơng số biến cục Do đó, đệ quy tốn nhiều vùng nhớ, thời gian truyền đối mục, thiết lập vùng nhớ trung gian trả kết quả…Nhưng sử dụng phương pháp đệ quy trơng chương trình đẹp mắt vịng lặp tính thuyết phục Điều cốt lõi thiết đặt chương trình phải làm hàm đệ quy chấm dứt thơng qua điều kiện Chính vậy, lập trình người ta cố tránh sử dụng thủ tục đệ quy thấy không cần thiết 4.3 Cách xây dựng hàm đệ quy Hàm đệ quy phải có phần : + Phần dừng hay phải có trường hợp nguyên tố.Trong ví dụ trường hợp n=0 trường hợp nguyên tố + Phần đệ quy : Là phần có gọi lại hàm định nghĩa Trong ví dụ phần đệ quy n>0 n !=n*(n-1) ! Sử dụng hàm đề quy chương trình làm chương trình dễ đọc, dễ hiểu vấn đề nêu bật rõ ràng hơn.Tuy nhiên đa số trường hợp hàm đệ quy tốn nhớ nhiều tốc độ thực chương trình chậm không đệ quy Tùy cụ thể mà người lập trình định nên dùng đệ quy hay khơng(có trường hợp khơng dùng đệ quy khơng giải tốn) 4.4 Các ví dụ hàm đệ quy Ví dụ 1: Tính n! N!= 1*2*3*…*(n-2)*(n-1)*n với n>=1 0!=1 long giaithua(int n) { if(n==0) Return 1; else return n*giaithua(n-1); } Giải thích hoạt động hàm đệ quy giaithua Ví dụ giá trị truyền vào hàm giaithua qua biến n = Thứ tự gọi thực hàm giai thừa 60 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái giaithua(n) return(n * giaithua(n-1)) 5*giaithua(4) = *? 4*giaithua(3) = *? 3*giaithua(2) =3 *? 2*giaithua(1) = 2*? 1*giaithua(0) = *? Khi tham số n =0 return giá trị (giá trị kiểu long) Lúc giá trị? Bắt đầu định trị theo thứ tự ngược lại Giaithua(in) Return(in * giaithua(in-1)) 1*giaithua(0) = *1 = 2*giaithua(1) = *1=2 3*giaithua(2) =3 *2=6 4*giaithua(3) = 4*6=24 5*giaithua(4) = *24=120 Kết sau 5!= 120 Minh họa hình ảnh 61 Giáo trình: Lập trình Trường Cao đẳng nghề Yên Bái //tinh tb cong printf("\n Trung binh cong cua day la: %f",tong/(n*1.0)); // tim max int max= *a; for(i=0; i