Ngôn ngữ lập trình C - Bài 05: Hàm

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ử

pdf32 trang | Chia sẻ: Mr Hưng | Lượt xem: 836 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Ngôn ngữ lập trình C - Bài 05: Hàm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 05: Hàm GV: Trần Phước Tuấn EMAIL: tranphuoctuan.khoatoan.dhsp@gmail.com CHƯƠNG 02: Ngôn Ngữ C 9/16/2008T.P.Tuấn-Lập Trình CPage 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ố 9/16/2008T.P.Tuấn-Lập Trình CPage 3 1. Tổng quan 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 Phân loại 9/16/2008T.P.Tuấn-Lập Trình CPage 4 1. Tổng quan 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. Phân loại 9/16/2008T.P.Tuấn-Lập Trình CPage 5 1. Tổng quan Phân loại 1. Hàm có sẵn 9/16/2008T.P.Tuấn-Lập Trình CPage 6 1. Tổng quan 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 Phân loại 9/16/2008T.P.Tuấn-Lập Trình CPage 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*/ int BinhPhuong(int x) { int kq=0; kq=x*x; return kq; } Ví dụ: 9/16/2008T.P.Tuấn-Lập Trình CPage 8 2. Cú pháp 9/16/2008T.P.Tuấn-Lập Trình CPage 9 3. Vài ví dụ 9/16/2008T.P.Tuấn-Lập Trình CPage 10 3. Vài ví dụ 9/16/2008T.P.Tuấn-Lập Trình CPage 11 3. Vài ví dụ 9/16/2008T.P.Tuấn-Lập Trình CPage 12 3. Vài ví dụ 9/16/2008T.P.Tuấn-Lập Trình CPage 13 3. Vài ví dụ 9/16/2008T.P.Tuấn-Lập Trình CPage 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 9/16/2008T.P.Tuấn-Lập Trình CPage 15 • 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à biến, hằng hoặc là biểu thức. 4. Hàm và vấn đề truyền tham số Truyền tham số trị 9/16/2008T.P.Tuấn-Lập Trình CPage 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 copy 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ông làm thay đổi giá trị của biến là tham số thực sự 9/16/2008T.P.Tuấn-Lập Trình CPage 17 4. Hàm và vấn đề truyền tham số Truyền tham trị 9/16/2008T.P.Tuấn-Lập Trình CPage 18 4. Hàm và vấn đề truyền tham số Truyền địa chỉ 9/16/2008T.P.Tuấn-Lập Trình CPage 19 4. Hàm và vấn đề truyền tham số Truyền địa chỉ 9/16/2008T.P.Tuấn-Lập Trình CPage 20 4. Hàm và vấn đề truyền tham số Truyền địa chỉ 9/16/2008T.P.Tuấn-Lập Trình CPage 21 4. Hàm và vấn đề truyền tham số #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; } Truyền địa chỉ 9/16/2008T.P.Tuấn-Lập Trình CPage 22 4. Hàm và vấn đề truyền tham số #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; } Truyền tham chiếu 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ớ. 9/16/2008T.P.Tuấn-Lập Trình CPage 23 5. Tham số mặc định #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; } Ví dụ 9/16/2008T.P.Tuấn-Lập Trình CPage 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). 9/16/2008T.P.Tuấn-Lập Trình CPage 25 6. Tham số là một hàm khác #include bool ngto(int n); bool chphuong(int n); int dem(int a[], int n, bool ham(int)); void main() { int a[]={2,3,4,5,9,11,16}; int n=7; int nt=dem(a,n,ngto); int cp=dem(a,n,chphuong); printf("Trong mang co %d so nt!\n",nt); printf("Trong mang co %d so cp!\n",cp); } int dem(int a[],int n, bool ham(int)) { int s=0; for(int i=0;i<n;i++) if(ham(a[i])) s++; return s; } bool ngto(int n) { if(n<2) return false; for(int i=2;i<=n/2;i++) if(n%i==0) return false; return true; } bool chphuong(int n) { if(n<=0) return false; int i=1; for(i=1;i*i<n;i++); if(i*i==n) return true; return false; } 9/16/2008T.P.Tuấn-Lập Trình CPage 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. 9/16/2008T.P.Tuấn-Lập Trình CPage 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ử. 9/16/2008T.P.Tuấn-Lập Trình CPage 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. 9/16/2008T.P.Tuấn-Lập Trình CPage 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. 9/16/2008T.P.Tuấn-Lập Trình CPage 30 9. Giới thiệu kỹ thuật đệ quy • S1=1; • Sn=n+Sn-1 • f0=f1=1; • fn=fn-1+fn-2 • T0=1 • Tn=n*Tn-1 • ucln(a,0)=a • ucln(a,b)=ucln(b,a%b) S=1+2+3++n fn=fn-1+fn-2 với f0=f1=1; T=1*2*3**n ucln(a,b) 9/16/2008T.P.Tuấn-Lập Trình CPage 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; } 9/16/2008 32

Các file đính kèm theo tài liệu này:

  • pdfc_ch_07_ham_3979.pdf
Tài liệu liên quan