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

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ố

pdf32 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 1707 | Lượt tải: 1download
Tóm tắt nội dung Bài giảng Lập trình C - Chương 2: Ngôn ngữ C - Bài 5: Hàm, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở 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

File đính kèm:

  • pdfBài giảng Lập trình C - Chương 2 Ngôn ngữ C - Bài 5 Hàm.pdf
Tài liệu liên quan