Slide HÀM (FUNCTION) TRONG C++ – Tài liệu text

Slide HÀM (FUNCTION) TRONG C++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (296.65 KB, 56 trang )

Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 1/56
CHƯƠNG 6: HÀM (FUNCTION)

Mục tiêu

Giới thiệu các kiến thức về hàm: khái niệm, cách khai
báo và định nghĩa hàm, cách truyền tham số; hàm đệ
quy,

Nội dung

Hàm

Hàm và mảng dữ liệu

Hàm và cấu trúc

Đệ quy
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 2/56

Khái niệm

Khai báo và định nghĩa

Lời gọi và sử dụng hàm

Biến và truyền tham số

Khai báo hàm trùng tên
6.1 Hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 3/56

– Hàm là một chương trình con, hàm có thể trả về hay
không trả về giá trị; truyền hay không truyền các tham số.

Một chương trình trong C++ có thể gồm nhiều hàm.
Nhưng có một hàm chính với tên gọi là hàm main().

Khi thực thi chương trình, nó luôn bắt đầu từ hàm main().

Hàm giúp cho việc phân đoạn chương trình một cách
riêng rẽ. Hàm có thể được sử dụng nhiều lần trong một
chương trình hoặc sử dụng ở nhiều chương trình khác
nhau.

Hàm có một số đặc điểm sau:
Khái niệm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 4/56

Nằm trong hoặc ngoài chương trình có lời gọi đến hàm.
Trong một chương trình có thể chứa nhiều hàm.

Một hàm có thể được gọi từ hàm main(), từ một hàm khác
hay được gọi bởi chính nó (trường hợp đệ quy).

Không có hàm lồng nhau.

Có 3 cách truyền tham số cho hàm:

Truyền theo tham biến.

Truyền theo tham trị.


Truyền theo tham trỏ.
Khái niệm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 5/56
Hàm được chia làm 2 loại:
+ Hàm định nghĩa sẵn
+ Hàm do người lập trình tự định nghĩa.
Khai báo và định nghĩa hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 6/56
Khai báo hàm:
Hàm định nghĩa sẵn: có trong tệp thư viện *.h. Để sử dụng
được các hàm này ta cần phải khai báo tệp tiêu đề theo cú
pháp #include<Tentaptinthuvien>
Ví dụ: #include<iostream>
#include<cmath>

Khai báo và định nghĩa hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 7/56
Hàm do người lập trình tự định nghĩa: có thể được khai báo ở
đầu chương trình theo cú pháp:
Kieu_du_lieu Ten_ham(Danh_sach_kieu_doi_so);
Trong đó:
Kieu_du_lieu: là kiểu trả về của hàm int, float, char, Trường
hợp hàm không trả về giá trị thì khai báo kiểu void. Trường hợp
không chỉ rõ kieu_tra_ve thì ngầm định là kiểu int.
Ten_ham: được đặt theo quy tắc đặt tên.
Danh_sach_kieu_doi_so: có thể có hoặc không. Trường hợp
không có thì gọi là hàm không có đối số.
Khai báo và định nghĩa hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 8/56

Định nghĩa hàm:
* Hàm trả về giá trị:
Cú pháp:
kieu_du_lieu Ten_ham(Ds_tham_so_hinh_thuc)
{
Khai báo các biến cục bộ;
Các câu lệnh;
return(biểu thức);
}
Khai báo và định nghĩa hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 9/56
Định nghĩa hàm:
Ví dụ: Định nghĩa hàm tính luỹ thừa n (với n nguyên) của một
số thực x>0 .
Hàm này có hai đầu vào (đối thực x và số mũ nguyên n) và đầu
ra (giá trị trả lại) là một số thực x
n
.
double luythua(double x, int n) //x,n là các tham số
hình thức
{ int i ; // i là biến cục bộ
double kq = 1 ; // kq để lưu kết quả
for (i=1; i<=n; i++)
kq *= x ;
return kq;
}
Khai báo và định nghĩa hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 10/56
* Hàm không trả về giá trị:
Nếu hàm không trả về giá trị (còn gọi là hàm kiểu void):

– kieudulieu: Sử dụng từ khóa void
– Trong thân hàm có thể có khoặc không câu lệnh return.
Nhưng nếu có thì sau return không có biểu thức.
Ví dụ: Viết hàm xóa màn hình 100 lần
void ClearSrceen()
{
int i;
for (i=1; i<=100; i++)
clrscr();
return ; //hoặc không có
}
Khai báo và định nghĩa hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 11/56
– Khái niệm:
Gọi hàm là việc chuyển quyền điều khiển từ hàm đang gọi đến
hàm được gọi.
Hàm có thể được gọi từ hàm khác hoặc từ chính bản thân nó.

Gọi hàm: Để thực hiện việc gọi hàm, sử dụng tên của hàm được
gọi và theo sau là các tham số thực tế được đặt trong cặp dấu
ngoặc đơn ( ).
Cú pháp: Ten_ham(Ds_tham_so_thuc_te);
Trong đó: Ds_tham_so_thuc_te phân tách nhau bởi dấu phẩy (,)
Lời gọi và sử dụng hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 12/56
Ví dụ: Tính biểu thức 2x
3
– 5x
2
– 4x +1

double luythua(float x, int n)
{ int i ;
double kq = 1 ;
for (i=1; i<=n; i++) kq *= x ;
return kq;
}
void main()
{ float x ;
double f ;
cout << “x =” ; cin >> x;
f = 2*luythua(x,3)-5*luythua(x,2)-4*x + 1;
}
Lời gọi và sử dụng hàm
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 13/56
– Phân loại biến:
+ Biến thường
+ Biến con trỏ (với dấu * trước tên biến)
+ Biến tham chiếu: Thực chất là một bí danh được
gán cho một biến nào đó. Lúc này, chỗ nào xuất hiện biến
thì cũng tương đương dùng bí danh và ngược lại.

Cú pháp khai báo biến tham chiếu:
Kieudulieu &ten_bien_tham_chieu=ten_bien_duoc_tham_chieu;
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 14/56
Ví dụ:
int a, b;
int &a1=a, &b1=b;
a=2; b=3;
cout<<“a= “<<a<<” b= “<<b<<endl;

cout<<“a1= “<<a1<<” b1= “<<b1<<endl;
cout<<a1 + b1<<endl;
cout<<a1++<<endl;
cout<<++a1<<endl;
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 15/56
Lưu ý:

Biến tham chiếu phải được khởi tạo khi khai báo.
– Mặc dù giống con trỏ nhưng không dùng được các phép
toán trên con trỏ cho biến tham chiếu. Nói chung, chỉ nên
dùng trong truyền tham số cho hàm.
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 16/56
– Truyền tham số: Có 3 cách truyền
+ Truyền theo tham trị
+ Truyền theo tham biến
+ Truyền theo tham trỏ
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 17/56
+ Truyền theo tham trị:
– Trong phương pháp này:
+ Các TSHT (đối số) chỉ nhận giá trị vào cho chương
trình con từ TSTT mà không trả kết quả về cho TSTT.
+ TSHT được xem như là một biến cục bộ của chương
trình con và được cấp phát ô nhớ riêng.
+ Các TSTT là một biểu thức (một biến, một hằng, một
hàm, một biểu thức thực sự)
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 18/56

– Các bước thực hiện:
+ Tại thời điểm gọi: Giá trị của TSTT được sao chép
vào trong ô nhớ của TSHT.
+ Trong quá trình thực hiện: Mọi thao tác trên TSHT là
sự thao tác trên ô nhớ riêng của nó
+ Khi kết thúc: Sự thay đổi giá trị của TSHT không làm
ảnh hưởng đến giá trị của TSTT.
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 19/56
Ví dụ: Cho hàm: luythua(float x, int n) tính x
n
. Giả sử trong
chương trình chính ta có các biến a, b có giá trị a=2, b=3 và
biến f chưa có giá trị. Để tính a
b
và gán giá trị tính được cho f,
ta có thể gọi f = luythua(a,b). Khi gặp lời gọi này, chương trình
sẽ tổ chức như sau:
– Tạo 2 biến mới có tên x và n. Gán nội dung các ô nhớ
này bằng các giá trị trong lời gọi, tức gán 2 cho x và 3 cho n.
– Tới phần khai báo của hàm, chương trình tạo thêm các
biến kq và i.
– Tiến hành tính toán (gán lại kết quả cho kq).
– Cuối cùng lấy kết quả trong kq gán cho ô nhớ f
– Kết thúc hàm quay về chương trình gọi.
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 20/56
Ví dụ:
int Tong(int, int);
int main()

{ int a = 5, b = 5;
cout<<“Tong cua 2 so la S= “;
cout<<Tong(a,b)<<endl;
cout<<a<<” “<<b<<endl;
return 0;
}
int Tong(int x, int y)
{ return x+y; }
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 21/56
+ Truyền theo tham biến:

Trong phương pháp này:
+ TSHT là tham số vào ra, do đó nó sẽ nhận giá trị vào từ
TSTT và trả về kết quả lại cho TSTT.
+ TSHT là một biến tham chiếu và TSTT phải là một biến
+ Khi kết thúc: Mọi thay đổi giá trị của TSHT đều làm giá
trị của TSTT thay đổi theo.
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 22/56
+ Truyền theo tham biến:
Ví dụ: Đổi giá trị 2 biến
void Hoanvi(int &x, int &y)
{
int t = x; x = y; y = t;
}
Và lời gọi hàm cũng đơn giản như trong truyền đối theo tham
trị. Chẳng hạn:
int a = 5, b = 3;
Hoanvi(a, b);

cout << a << b;
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 23/56
+ Truyền theo tham trỏ:
Trong phương pháp này:

TSHT là tham số vào ra, do đó nó sẽ nhận giá trị vào từ TSTT
và trả kết quả lại cho TSTT.

TSHT là một con trỏ và TSTT phải là một biến.
Phương pháp thực hiện:

Tại thời điểm gọi: Nó truyền một đường dẫn truy cập, thông
thường chỉ là một địa chỉ, đến chương trình con được gọi.

Khi kết thúc: Mọi thay đổi giá trị của TSHT đều làm giá trị
của TSTT thay đổi theo.
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 24/56
+ Truyền theo tham trỏ:
Ví dụ: Viết hàm đổi giá trị 2 biến
void Hoanvi(int *p, int *q)
{
int t; // khai báo biến tạm t
t = *p ; // đặt giá trị của t bằng nội dung nơi p trỏ tới
*p = *q ; // thay nội dung nơi p trỏ bằng nội dung nơi q trỏ
*q = t ; // thay nội dung nơi q trỏ tới bằng nội dung của t
}
– Như vậy, nếu ta cho p trỏ tới biến x và q trỏ tới biến y thì hàm
Hoanvi sẽ thực sự làm thay đổi nội dung của x, y chứ không phải của

p, q. Lúc này, lời gọi hàm sẽ là Hoanvi(&x, &y) (tức truyền địa chỉ
của x cho p, p trỏ tới x và tương tự q trỏ tới y).
Biến và truyền tham số
Ngôn ngữ lập trình C++ Chương 6: Hàm (function) 25/56
– Hàm trùng tên hay còn gọi là hàm chồng (overload). Đây là
một kỹ thuật cho phép sử dụng cùng tên gọi cho các hàm “giống
nhau” nhưng xử lý trên các kiểu dữ liệu khác nhau hoặc trên số
lượng dữ liệu khác nhau.
Ví dụ: để tìm max 2 số ta có các hàm:
int max(int a, int b) { return (a > b) ? a: b ; }
float max(float a, float b) { return (a > b) ? a: b ; } char
max(char a, char b) { return (a > b) ? a: b ; }
Khi đó, tùy thuộc vào giá trị của đối số trong lời gọi hàm để chạy
hàm thích hợp. Chẳng hạn, max(3, 5), max(3.0, 5.0),
max(‘O’,‘K’), …
Khai báo hàm trùng tên

– Hàm là một chương trình con, hàm có thể trả về haykhông trả về giá trị; truyền hay không truyền các tham số.Một chương trình trong C++ có thể gồm nhiều hàm.Nhưng có một hàm chính với tên gọi là hàm main().Khi thực thi chương trình, nó luôn bắt đầu từ hàm main().Hàm giúp cho việc phân đoạn chương trình một cáchriêng rẽ. Hàm có thể được sử dụng nhiều lần trong mộtchương trình hoặc sử dụng ở nhiều chương trình khácnhau.Hàm có một số đặc điểm sau:Khái niệmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 4/56Nằm trong hoặc ngoài chương trình có lời gọi đến hàm.Trong một chương trình có thể chứa nhiều hàm.Một hàm có thể được gọi từ hàm main(), từ một hàm kháchay được gọi bởi chính nó (trường hợp đệ quy).Không có hàm lồng nhau.Có 3 cách truyền tham số cho hàm:Truyền theo tham biến.Truyền theo tham trị.Truyền theo tham trỏ.Khái niệmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 5/56Hàm được chia làm 2 loại:+ Hàm định nghĩa sẵn+ Hàm do người lập trình tự định nghĩa.Khai báo và định nghĩa hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 6/56Khai báo hàm:Hàm định nghĩa sẵn: có trong tệp thư viện *.h. Để sử dụngđược các hàm này ta cần phải khai báo tệp tiêu đề theo cúpháp #includeVí dụ: #include#includeKhai báo và định nghĩa hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 7/56Hàm do người lập trình tự định nghĩa: có thể được khai báo ởđầu chương trình theo cú pháp:Kieu_du_lieu Ten_ham(Danh_sach_kieu_doi_so);Trong đó:Kieu_du_lieu: là kiểu trả về của hàm int, float, char, Trườnghợp hàm không trả về giá trị thì khai báo kiểu void. Trường hợpkhông chỉ rõ kieu_tra_ve thì ngầm định là kiểu int.Ten_ham: được đặt theo quy tắc đặt tên.Danh_sach_kieu_doi_so: có thể có hoặc không. Trường hợpkhông có thì gọi là hàm không có đối số.Khai báo và định nghĩa hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 8/56Định nghĩa hàm:* Hàm trả về giá trị:Cú pháp:kieu_du_lieu Ten_ham(Ds_tham_so_hinh_thuc)Khai báo các biến cục bộ;Các câu lệnh;return(biểu thức);Khai báo và định nghĩa hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 9/56Định nghĩa hàm:Ví dụ: Định nghĩa hàm tính luỹ thừa n (với n nguyên) của mộtsố thực x>0 .Hàm này có hai đầu vào (đối thực x và số mũ nguyên n) và đầura (giá trị trả lại) là một số thực xdouble luythua(double x, int n) //x,n là các tham sốhình thức{ int i ; // i là biến cục bộdouble kq = 1 ; // kq để lưu kết quảfor (i=1; i<=n; i++)kq *= x ;return kq;Khai báo và định nghĩa hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 10/56* Hàm không trả về giá trị:Nếu hàm không trả về giá trị (còn gọi là hàm kiểu void):- kieudulieu: Sử dụng từ khóa void- Trong thân hàm có thể có khoặc không câu lệnh return.Nhưng nếu có thì sau return không có biểu thức.Ví dụ: Viết hàm xóa màn hình 100 lầnvoid ClearSrceen()int i;for (i=1; i<=100; i++)clrscr();return ; //hoặc không cóKhai báo và định nghĩa hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 11/56- Khái niệm:Gọi hàm là việc chuyển quyền điều khiển từ hàm đang gọi đếnhàm được gọi.Hàm có thể được gọi từ hàm khác hoặc từ chính bản thân nó.Gọi hàm: Để thực hiện việc gọi hàm, sử dụng tên của hàm đượcgọi và theo sau là các tham số thực tế được đặt trong cặp dấungoặc đơn ( ).Cú pháp: Ten_ham(Ds_tham_so_thuc_te);Trong đó: Ds_tham_so_thuc_te phân tách nhau bởi dấu phẩy (,)Lời gọi và sử dụng hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 12/56Ví dụ: Tính biểu thức 2x– 5x- 4x +1double luythua(float x, int n){ int i ;double kq = 1 ;for (i=1; i<=n; i++) kq *= x ;return kq;void main(){ float x ;double f ;cout << “x =” ; cin >> x;f = 2*luythua(x,3)-5*luythua(x,2)-4*x + 1;Lời gọi và sử dụng hàmNgôn ngữ lập trình C++ Chương 6: Hàm (function) 13/56- Phân loại biến:+ Biến thường+ Biến con trỏ (với dấu * trước tên biến)+ Biến tham chiếu: Thực chất là một bí danh đượcgán cho một biến nào đó. Lúc này, chỗ nào xuất hiện biếnthì cũng tương đương dùng bí danh và ngược lại.Cú pháp khai báo biến tham chiếu:Kieudulieu &ten_bien_tham_chieu=ten_bien_duoc_tham_chieu;Biến và truyền tham sốNgôn ngữ lập trình C++ Chương 6: Hàm (function) 14/56Ví dụ:int a, b;int &a1=a, &b1=b;a=2; b=3;cout<<“a= “< b) ? a: b ; }float max(float a, float b) { return (a > b) ? a: b ; } charmax(char a, char b) { return (a > b) ? a: b ; }Khi đó, tùy thuộc vào giá trị của đối số trong lời gọi hàm để chạyhàm thích hợp. Chẳng hạn, max(3, 5), max(3.0, 5.0),max(‘O’,‘K’), …Khai báo hàm trùng tên