Bài giảng Kỹ thuật lập trình - Chương 2: Ngôn ngữ C - Bài 5: Hàm

pdf 32 trang hapham 1400
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 2: Ngôn ngữ C - Bài 5: 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_2_ngon_ngu_c_bai_5_ham.pdf

Nội dung text: Bài giảng Kỹ thuật lập trình - Chương 2: Ngôn ngữ C - Bài 5: Hàm

  1. CHCHƯƠƯƠNGNG 02:02: Ngôn Ngôn Ng Ngữữ CC Bài 05: Hàm GV: Trần Phước Tuấn EMAIL: tranphuoctuan.khoatoan.dhsp@gmail.com
  2. Nội dung bài học 1. Tổng quan 2. Cú pháp 3. Vài ví dụ 4. Hàm và vấn đề truyền tham số 5. Tham số mặc định 6. Tham số là một hàm khác (con trỏ hàm) 7. Quá tải hàm (hàm trùng tên) 8. Toán tử, quá tải toán tử 9. Giới thiệu kỹ thuật đệ quy 10. Hàm main có tham số Page 2 T.P.Tuấn-Lập Trình C 9/16/2008
  3. 1. Tổng quan Phân loại 1. Hàm có sẵn – Ví dụ • Hàm sqrt: có khai báo double sqrt(double x), đầu vào là số thực x, đầu ra là số thực có giá trị là căn bậc 2 của x. Hàm này nằm trong thư viện • Hàm abs: có khai báo int abs(int x), đầu vào là số nguyên x, đầu ra là số nguyên dương có giá trị là |x|. Hàm này nằm trong thư viện Page 3 T.P.Tuấn-Lập Trình C 9/16/2008
  4. 1. Tổng quan Phân loại 1. Hàm có sẵn – Cách sử dụng • Trước khi sử dụng hàm phải khai báo thư viện chứa hàm (#include ) • Gọi hàm với các tham số và biến chứa dữ liệu trả về có kiểu dữ liệu phù hợp với cú pháp của hàm và biến. Ví dụ nếu có lời gọi a=sqrt(n) và hàm sqrt được mô tả như ở trên thì: – Tốt nhất là: a,n có kiểu double – Nếu a,n có kiểu float, int, thì ở đây sẽ có sự chuyển đổi kiểu dữ liệu ngầm ẩn – Nếu a,n có kiểu con trỏ (biến mảng, chuỗi), cấu trúc, thì sẽ gây ra lỗi. Page 4 T.P.Tuấn-Lập Trình C 9/16/2008
  5. 1. Tổng quan Phân loại 1. Hàm có sẵn Page 5 T.P.Tuấn-Lập Trình C 9/16/2008
  6. 1. Tổng quan Phân loại 2. Hàm do người dùng định nghĩa • Mục tiêu: Đối với các tác vụ cần sử dụng lại nhiều lần trong chương trình mà trong các thư viện lập trình không có sẵn, người sử dụng có thể tự thiết kế riêng cho mình một hàm để làm công việc đó bằng cách làm tương tự như các thư viện đã làm. • Cách làm: Dựa vào sơ đồ ở slide trước ta cần phải làm hai việc: khai báo và định nghĩa hàm ở các vị trí thích hợp. • Cách dùng: Sau khi thực hiện hai công việc trên (khai báo và định nghĩa) thì ta sử dụng hàm tự định nghĩa giống hệt sử dụng các hàm trong thư viện có sẵn Page 6 T.P.Tuấn-Lập Trình C 9/16/2008
  7. 2. Cú pháp ([ ]) { //Khai báo biến cục bộ //Các câu lệnh } /*kết thúc hàm*/ Ví dụ: int BinhPhuong(int x) { int kq=0; kq=x*x; return kq; } Page 7 T.P.Tuấn-Lập Trình C 9/16/2008
  8. 2. Cú pháp Page 8 T.P.Tuấn-Lập Trình C 9/16/2008
  9. 3. Vài ví dụ Page 9 T.P.Tuấn-Lập Trình C 9/16/2008
  10. 3. Vài ví dụ Page 10 T.P.Tuấn-Lập Trình C 9/16/2008
  11. 3. Vài ví dụ Page 11 T.P.Tuấn-Lập Trình C 9/16/2008
  12. 3. Vài ví dụ Page 12 T.P.Tuấn-Lập Trình C 9/16/2008
  13. 3. Vài ví dụ Page 13 T.P.Tuấn-Lập Trình C 9/16/2008
  14. 4. Hàm và vấn đề truyền tham số • Truyền tham số trị • Truyền tham số biến –Truyền địa chỉ –Truyền tham chiếu Page 14 T.P.Tuấn-Lập Trình C 9/16/2008
  15. 4. Hàm và vấn đề truyền tham số Truyền tham số trị • Trong phần khai báo tham số hình thức của hàm không có dấu tham chiếu (&) hoặc địa chỉ của một kiểu dữ liệu nào đó (con trỏ). • Tham số thực truyền vào khi gọi hàm có thể là bibiếếnn, hhằằngng hoặc là bibiểểuu ththứứcc. Page 15 T.P.Tuấn-Lập Trình C 9/16/2008
  16. 4. Hàm và vấn đề truyền tham số Truyền tham số trị • Tham số trị hình thức được cấp một vùng nhớ riêng khi hàm được gọi và bị xóa bỏ khi hàm chạy xong. • Giá trị của biến, hằng, biểu thức được copycopy cho tham số của hàm (tham số này có thể xem như là biến cục bộ trong chương trình con). KhôngKhông l lààmm thay thay đ đổổii gi giáá trtrịị ccủủaa bi biếếnn l làà thamtham ssốố ththựựcc ssựự Page 16 T.P.Tuấn-Lập Trình C 9/16/2008
  17. 4. Hàm và vấn đề truyền tham số Truyền tham trị Page 17 T.P.Tuấn-Lập Trình C 9/16/2008
  18. 4. Hàm và vấn đề truyền tham số Truyền địa chỉ Page 18 T.P.Tuấn-Lập Trình C 9/16/2008
  19. 4. Hàm và vấn đề truyền tham số Truyền địa chỉ Page 19 T.P.Tuấn-Lập Trình C 9/16/2008
  20. 4. Hàm và vấn đề truyền tham số Truyền địa chỉ Page 20 T.P.Tuấn-Lập Trình C 9/16/2008
  21. 4. Hàm và vấn đề truyền tham số Truyền địa chỉ #include void HoanVi(int *a,int *b); void main() { int x=7, y=8; HoanVi(&x,&y); printf(“x=%d, y=%d”,x,y); // x=8, y=7 } void HoanVi(int *a,int *b) { int tam=*a;*a=*b;*b=tam; } Page 21 T.P.Tuấn-Lập Trình C 9/16/2008
  22. 4. Hàm và vấn đề truyền tham số #include Truyền tham chiếu void HoanVi(int &a,int &b); void main() { int x=7, y=8; HoanVi(x,y); printf(“x=%d, y=%d”,x,y); // x=8, y=7 } void HoanVi(int &a,int &b) { int tam=a;a=b;b=tam; } Với cách truyền tham số như ví dụ trên thì khi gọi hàm hoán vị a là một bí danh của x, b là một bí danh khác của y. Tức là x và a sở hữu chung một vùng nhớ, y và b sở hữu chung một vùng nhớ. Page 22 T.P.Tuấn-Lập Trình C 9/16/2008
  23. 5. Tham số mặc định Ví dụ #include void add(int &a, int d=1); void main() { int x=4; add(x); // add(x,1); printf(“x=%d”,x); add(x,5); printf(“x=%d”,x); } void add(int &a, int d) { a+=d; } Page 23 T.P.Tuấn-Lập Trình C 9/16/2008
  24. 5. Tham số mặc định • Chỉ điền giá trị mặc định ở phần khai báo hàm, trong phần định nghĩa hàm thì không. • Tham số mặc định từ phải sang trái • Giải sử hàm có k tham số: a1, a2, , ak và nếu có tham số mặc định thì: – Các tham số mặc định: ai ak (1<=i<=k) – Các tham số không mặc định: a1 ai-1 (1<=i<=k) • Khi gọi hàm thì phải gọi ít nhất i-1 tham số (từ a1 ai-1+j, 0<=j<=k-i, không được bỏ trống một tham số nào ở giữa). Page 24 T.P.Tuấn-Lập Trình C 9/16/2008
  25. 6. Tham số là một hàm khác #include bool ngto(int n) bool ngto(int n); { bool chphuong(int n); if(n<2) return false; int dem(int a[], int n, bool ham(int)); for(int i=2;i<=n/2;i++) void main() { if(n%i==0) int a[]={2,3,4,5,9,11,16}; return false; int n=7; return true; int nt=dem(a,n,ngto); } int cp=dem(a,n,chphuong); bool chphuong(int n) printf("Trong mang co %d so nt!\n",nt); { printf("Trong mang co %d so cp!\n",cp); if(n<=0) return false; } int i=1; int dem(int a[],int n, bool ham(int)) for(i=1;i*i<n;i++); { int s=0; if(i*i==n) for(int i=0;i<n;i++) return true; if(ham(a[i])) return false; s++; } return s; } Page 25 T.P.Tuấn-Lập Trình C 9/16/2008
  26. 7. Quá tải hàm (hàm trùng tên) • Chữ ký của hàm: được xác định bằng cách ghép nối đúng thứ tự tên hàm và danh sách kiểu dữ liệu của tham số. • Ví du: + void hoanvi(int &a, int &b); hoanvi_int&_int& + void hoanvi(int *a, int *b); hoanvi_int*_int* • Nhận xét: trong ví dụ trên mặc dù hai hàm có cùng tên là hoanvi nhưng có chữ ký khác nhau. • Trong khi lập trình với ngôn ngữ C++, các lập trình viên được phép định nghĩa các hàm trùng tên nhau, miễn là chữ ký của nó khác nhau. Việc làm này giúp cho cho chương trình trở nên tự nhiên và đơn giản hơn. Page 26 T.P.Tuấn-Lập Trình C 9/16/2008
  27. 8. Toán tử, quá tải toán tử • Để thực hiện việc cộng hai phân số (cấu trúc do người dùng định nghĩa), ta phải viết hàm theo khai báo sau: PS Tong(PS a, PS b); Và gọi hàm: c=Tong(a,b); • Việc làm này thiếu tự nhiên. Ta có thể định nghĩa toán tử + làm nhiệm vụ tính tổng hai phân số một cách tự nhiên hơn theo khai báo sau: PS operator + (PS a, PS b); Và gọi toán tử này như sau: c=a+b; Như vậy việc thực hiện phép toán + cho phân số tương tự như cá kiểu dữ liệu cơ bản: int, float, Lưu ý: operator là từ khóa khi định nghĩa toán tử. Page 27 T.P.Tuấn-Lập Trình C 9/16/2008
  28. 9. Giới thiệu kỹ thuật đệ quy • Kỹ thuật này cho phép chúng ta giải quyết một lớp các bài toán có dạng được biểu diễn theo công thức truy hồi. • Một số bài toán có thể dùng kỹ thuật đệ quy 1. S=1+2+3+ +n; 2. fn=fn-1+fn-2 với f0=f1=1; 3. T=1*2* *n; 4. UCLN(a,b); //a,b là 2 số nguyên. Page 28 T.P.Tuấn-Lập Trình C 9/16/2008
  29. 9. Giới thiệu kỹ thuật đệ quy • Kỹ thuật đệ quy cho phép chúng ta giải quyết bài toán bằng cách mô tả nó. Do đó chương trình viết bằng kỹ thuật này rất tự nhiên và dễ hiểu. • Tuy nhiên kỹ thuật này chiếm khá nhiều bộ nhớ của máy tính. Nhưng với tốc độ phát triển phần cứng như hiện nay thì điều đó không còn là vấn đề lớn. Page 29 T.P.Tuấn-Lập Trình C 9/16/2008
  30. 9. Giới thiệu kỹ thuật đệ quy S=1+2+3+ +n T=1*2*3* *n • S1=1; • T0=1 • Sn=n+Sn-1 • Tn=n*Tn-1 fn=fn-1+fn-2 với f0=f1=1; ucln(a,b) • f0=f1=1; • ucln(a,0)=a • fn=fn-1+fn-2 • ucln(a,b)=ucln(b,a%b) Page 30 T.P.Tuấn-Lập Trình C 9/16/2008
  31. 10. Hàm main có tham số #include void main(int n, char *a[]) { cout<<"Ten cua chuong trinh: "<<a[0]<<endl; cout<<"So tham so truyen vao: "<<n-1<<endl; int Tong=0; for(int i=1;i<n;i++) Tong+=atoi(a[i]); cout<<"Tong cua cac tham so: "<<Tong; } Page 31 T.P.Tuấn-Lập Trình C 9/16/2008
  32. 9/16/2008 32