Bài giảng Kỹ thuật lập trình - Chương 5: Xây dựng và sử dụng hàm

pdf 22 trang Gia Huy 17/05/2022 1760
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 5: Xây dựng và sử dụng hàm", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_5_xay_dung_va_su_dung_ha.pdf

Nội dung text: Bài giảng Kỹ thuật lập trình - Chương 5: Xây dựng và sử dụng hàm

  1. BÀI GIẢNG HỌC PHẦN KỸ THUẬT LẬP TRÌNH CHƯƠNG 5: XÂY DỰNG VÀ SỬ DỤNG HÀM
  2. Nội dung 5.1. Vai trò của hàm 5.2. Cấu trúc hàm 5.3. Lời gọi hàm và vấn đề truyền tham số 5.4. Hàm đệ quy 2
  3. 5.1. Vai trò của hàm (1) • Hàm: - Chương trình con cho phép thực hiện một nhiệm vụ cụ thể, chuyên biệt cho chương trình chính - Được định nghĩa với một tên gọi xác định, có thể có nhiều tham số đầu vào/đầu ra - Thường trả về một kết quả thông qua tên hàm (có thể không) • Vai trò của hàm: - Cho phép chia chương trình thành những phần nhỏ để có thể dễ dàng xây dựng, quản lý, hiệu chỉnh phương pháp lập trình có cấu trúc - Có thể được gọi thực hiện lặp đi lặp lại nhiều lần với các tham số khác nhau khả năng tái sử dụng 3
  4. 5.1. Vai trò của hàm (2) • Phân loại hàm: - Hàm chuẩn (các hàm do trình biên dịch đã xây dựng sẵn, muốn sử dụng chúng cần khai báo tệp tiêu đề tương ứng, ví dụ: muốn sử dụng hàm sqrt(x) cần khai báo tệp tiêu đề math.h) - Hàm do người dùng tự định nghĩa • Lưu ý: - Trong một chương trình viết bằng ngôn ngữ C, hàm main() là bắt buộc phải có và được thực thi đầu tiên - Các hàm xây dựng trong chương trình (trừ hàm main()) nên được khai báo nguyên mẫu ở phần đầu chương trình 4
  5. 5.2. Cấu trúc hàm (1) kiểu_dữ_liệu_trả_về tên_hàm(danh_sách_tham_số) { các_khai_báo; các_lệnh; [return biểu_thức;] } trong đó: - kiểu_dữ_liệu_trả_về: có thể là kiểu bất kỳ (char, int, float, ) ngoại trừ kiểu mảng. Nếu hàm không trả về giá trị thì dùng từ khóa void - tên_hàm: đặt theo quy định đặt tên, phản ánh nội dung hàm - danh_sách_tham_số: là các tham số hình thức, được khai báo giống như khai báo biến 5
  6. 5.2. Cấu trúc hàm (2) - các_khai_báo: khai báo các đối tượng cục bộ chỉ có phạm vi sử dụng trong nội bộ hàm Các lưu ý về phạm vi sử dụng của các biến cục bộ được khai báo trong hàm tương tự như các lưu ý đối với các biến được khai báo trong khối lệnh (bài giảng chương 1 - slide 43) - biểu_thức: cho giá trị là giá trị trả về qua tên hàm 6
  7. 5.2. Cấu trúc hàm (3) • Ví dụ: - Hàm tính tổng 2 số: Cách viết khác: int tong(int x,int y) int tong(int x,int y) { { int s; return (x+y); s=x+y; } return s; } 7
  8. 5.2. Cấu trúc hàm (4) • Ví dụ: (tiếp) - Hàm tính diện tích tam giác: float dttg(float x, float y, float z) { float p,s; p=(x+y+z)/2; s=sqrt(p*(p-x)*(p-y)*(p-z)); return s; } 8
  9. 5.3. Lời gọi hàm và vấn đề truyền tham số • Lời gọi hàm • Vấn đề truyền tham số 9
  10. Lời gọi hàm • Cú pháp: tên_hàm(danh_sách_tham_số) trong đó: danh_sách_tham_số gồm các tham số thực sự - Ví dụ: tong(4,5) dttg(3,4,5) 10
  11. Vấn đề truyền tham số • Tham số hình thức: khai báo trong cấu trúc hàm • Tham số thực sự: đặt trong lời gọi hàm • Các tham số hình thức và các tham số thực sự cần “tương thích” với nhau • Khi xây dựng hàm, ta không cần quan tâm đến giá trị của các tham số thực sự là bao nhiêu mà chỉ cần quan tâm đến việc cần thực hiện các thao tác tính toán và xử lý dữ liệu dựa trên các tham số hình thức như thế nào để thu được kết quả trả về qua tên hàm • Khi có lời gọi hàm, các tham số thực sự được “truyền” cho các tham số hình thức (truyền giá trị/địa chỉ) 11
  12. Ví dụ (1) • Chương trình tính tổng 2 số a, b: #include int tong(int x,int y) int tong(int x,int y); { int main(void) return (x+y); { int a,b; } printf("Nhap a = "); scanf("%d",&a); printf("Nhap b = "); scanf("%d",&b); printf("a+b = %d",tong(a,b)); return 0; } 12
  13. Ví dụ (2) • Chương trình tính diện tích tam giác: #include #include float dttg(float x,float y,float z); int main(void) { float a,b,c; lap: printf("Nhap do dai 3 canh: "); printf("\na = ");scanf("%f",&a); printf("b = ");scanf("%f",&b); printf("c = ");scanf("%f",&c); 13
  14. Ví dụ (3) • Chương trình tính diện tích tam giác: (tiếp) if (a<=0 || b<=0 || c<=0) { printf("Do dai cac canh phai la so duong. Hay nhap lai!\n"); goto lap; } if (a+b<=c || b+c<=a || c+a<=b) { printf("Tong do dai 2 canh phai lon hon do dai canh con lai. Hay nhap lai!\n"); goto lap; } 14
  15. Ví dụ (4) • Chương trình tính diện tích tam giác: (tiếp) printf("Dien tich tam giac la: %6.2f",dttg(a,b,c)); return 0; } float dttg(float x, float y, float z) { float p,s; p=(x+y+z)/2; s=sqrt(p*(p-x)*(p-y)*(p-z)); return s; } 15
  16. Lưu ý • Khi xây dựng hàm cần chú ý các nguyên tắc sau: - Mỗi hàm chỉ nên thực hiện 1 công việc duy nhất - Độc lập với các hàm khác - Khả năng tái sử dụng càng cao càng tốt - Các tham số của hàm cần được chỉ rõ - Trong thân hàm nên sử dụng các biến cục bộ, hạn chế tối đa việc sử dụng các biến toàn cục - Hàm nên che giấu thông tin • Bài toán: tính tổng S = a! + b! Chương trình? 16
  17. 5.4. Hàm đệ quy (1) • Trong thân hàm có lời gọi tới chính nó • Áp dụng với các bài toán có giải thuật mang tính đệ quy • Giá trị trả về của hàm đệ quy cần được xác định rõ trong 2 trường hợp: - Trường hợp suy biến: hàm trả về một giá trị cụ thể - Trường hợp đệ quy: giá trị trả về của hàm được xác định qua lời gọi tới chính nó Ví dụ: Tính n! (n không âm) Sử dụng hàm đệ quy: - Trường hợp suy biến: n=0, khi đó 0! = 1 - Trường hợp đệ quy: n>0, khi đó n! = n*(n-1)! 17
  18. 5.4. Hàm đệ quy (2) • Chương trình tính n! #include long gt(int k) long gt(int k); { int main(void) if (k>0) { return gt(k-1)*k; int n; else return 1; printf("Nhap so n = "); } scanf("%d",&n); printf("%d! = %ld",n,gt(n)); return 0; } 18
  19. 5.4. Hàm đệ quy (3) • Chương trình tìm (a,b) #include int ucln(int x, int y); int main(void) { int a,b; printf("Nhap 2 so nguyen duong: "); printf("\na = ");scanf("%d",&a); printf("b = ");scanf("%d",&b); printf("(%d,%d) = %d",a,b,ucln(a,b)); return 0; } 19
  20. 5.4. Hàm đệ quy (4) • Chương trình tìm (a,b) (tiếp) int ucln(int x, int y) { int temp; if (x<y) { temp=x; x=y; y=temp; } if (y==0) return x; else return ucln(y,x%y); } 20
  21. 5.4. Hàm đệ quy (5) • Lưu ý: - Sử dụng hàm đệ quy giúp chương trình dễ viết, dễ hiểu thường được áp dụng trong các bài toán “khó” - Nhược điểm của hàm đệ quy: gây tốn bộ nhớ, tốc độ thực hiện chậm • Bài toán tháp Hà Nội? 21
  22. Bài tập • Bài 1: Viết chương trình tính tổ hợp chập m của n m phần tử: C n (m,n do người dùng nhập từ bàn phím) Yêu cầu trong chương trình có sử dụng hàm • Bài 2. Viết chương trình tìm và in ra màn hình các số nguyên tố <=n (n nhập từ bàn phím) Yêu cầu trong chương trình có sử dụng hàm 22