Tài liệu Bài giảng Lập trình C++ - Chương 4 Hàm con: CHƯƠNG 4 
HÀM CON 
1 
4
/3
/2
0
1
5
1 
CẤU TRÚC CHƯƠNG TRÌNH 
2 
Khai báo 
Cài đặt hàm 
Hàm main() 
C
H
Ư
Ơ
N
G
 T
R
ÌN
H
 C
Khai báo thư viện hàm 
Khai báo hàm 
Khai báo hằng số  
Cài đặt tất cả những hàm con 
đã được khai báo 
Gọi thực hiện các hàm theo 
yêu cầu của bài toán 
KHÁI NIỆM 
 Hàm là một đoạn chương trình độc lập thực hiện 
trọn vẹn một công việc nhất định sau đó trả về 
giá trị cho chương trình gọi nó, hay nói cách khác 
hàm là sự chia nhỏ của chương trình. 
 Mục đích sử dụng hàm: 
 Khi có một công việc giống nhau cần thực hiện ở 
nhiều vị trí. 
 Khi cần chia một chương trình lớn phức tạp thành các 
đơn thể nhỏ (hàm con) để chương trình được trong 
sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán 
và giải quyết vấn đề. 
3 
3 
Mẫu tổng quát của hàm 
 TênHàm([ds các tham số]); 
Trong đó: 
 Kiểu dữ liệu trả về của hàm (kết quả của ...
                
              
                                            
                                
            
 
            
                 42 trang
42 trang | 
Chia sẻ: honghanh66 | Lượt xem: 1397 | Lượt tải: 2 
              
            Bạn đang xem trước 20 trang mẫu tài liệu Bài giảng Lập trình C++ - Chương 4 Hàm con, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 4 
HÀM CON 
1 
4
/3
/2
0
1
5
1 
CẤU TRÚC CHƯƠNG TRÌNH 
2 
Khai báo 
Cài đặt hàm 
Hàm main() 
C
H
Ư
Ơ
N
G
 T
R
ÌN
H
 C
Khai báo thư viện hàm 
Khai báo hàm 
Khai báo hằng số  
Cài đặt tất cả những hàm con 
đã được khai báo 
Gọi thực hiện các hàm theo 
yêu cầu của bài toán 
KHÁI NIỆM 
 Hàm là một đoạn chương trình độc lập thực hiện 
trọn vẹn một công việc nhất định sau đó trả về 
giá trị cho chương trình gọi nó, hay nói cách khác 
hàm là sự chia nhỏ của chương trình. 
 Mục đích sử dụng hàm: 
 Khi có một công việc giống nhau cần thực hiện ở 
nhiều vị trí. 
 Khi cần chia một chương trình lớn phức tạp thành các 
đơn thể nhỏ (hàm con) để chương trình được trong 
sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán 
và giải quyết vấn đề. 
3 
3 
Mẫu tổng quát của hàm 
 TênHàm([ds các tham số]); 
Trong đó: 
 Kiểu dữ liệu trả về của hàm (kết quả của hàm/ đầu 
ra), gồm 2 loại 
– void: Không trả về giá trị 
– float / int / long / char */ kiểu cấu trúc /  
: Trả về giá trị kết quả có kiểu dữ liệu tương 
ứng với bài toán (chỉ trả về được 1 giá trị theo 
kiểu dữ liệu) 
4 
 int Tong(int a, int b) 
{ 
 int s=a+b; 
 return s; 
} 
void main() 
{ 
 int kq = Tong (12, 3); 
 cout<<“Tong cua 12 va 3: “<<kq; 
} 
5 
Truyền đối số 
Tham số 
Gọi hàm 
Ví dụ 
TênHàm: Đặt tên theo qui ước sao cho 
phản ánh đúng chức năng thực hiện của 
hàm 
Danh sách các tham số (nếu có): đầu vào 
của hàm (trong một số trường hợp có thể 
là đầu vào và đầu ra của hàm nếu kết quả 
đầu ra có nhiều giá trị - Tham số này gọi là 
tham chiếu) 
6 
HÀM KHÔNG TRẢ VỀ GIÁ TRỊ 
Cài đặt 
void TênHàm([danh sách các tham số]) 
{ 
 Khai báo các biến cục bộ 
 Các câu lệnh / khối lệnh hay lời gọi đến hàm khác. 
} 
Gọi hàm 
 TênHàm(danh sách tên các đối số); 
Những phương thức loại này thường rơi vào những 
nhóm chức năng: Nhập / xuất dữ liệu , thống 
kê, sắp xếp, liệt kê 
7 
VÍ DỤ 1 
Viết chương trình nhập số nguyên dương n và in ra 
màn hình các ước số của n 
Phân tích bài toán: 
Input: n (Để xác định tham số) 
 Kiểu dữ liệu: số nguyên dương (int). 
Output: In ra các ước số của n (Để xác định kiểu dữ 
liệu trả về của hàm) 
Xuất ra màn hình  Không trả về giá trị  
Kiểu dữ liệu của hàm là void . 
Xác định tên hàm: Hàm này dùng in ra các ước số 
của n nên có thể đặt là LietKeUocSo 
void LietKeUocSo(int n); 8 
 #include 
void LietKeUocSo(int n); 
void LietKeUocSo(int n) 
{ 
 for (int i = 1; i <= n; i++) 
 if (n % i == 0) 
 cout<<i<<“\t”; 
} 
void main() 
{ 
 int n; 
 cout<<"Nhap so nguyen duong n: "; 
 cin>>n; 
 cout<<"Cac uoc so cua “<<n<<“: “; 
 LietKeUocSo(n); //gọi hàm 
} 
9 
Có dấu chấm phẩy 
Không dấu chấm phẩy 
Kết quả chương trình 
10 
HÀM TRẢ VỀ GIÁ TRỊ 
Cài đặt 
 TênHàm([danh sách các tham số]) 
{ 
 kq; 
 Khai báo các biến cục bộ 
 Các câu lệnh / khối lệnh hay lời gọi đến hàm khác. 
 return kq; 
} 
Gọi hàm 
 Tên biến = TênHàm (danh 
sách tên các đối số); 
Những phương thức này thường rơi vào các nhóm: Tính 
tổng, tích, trung bình, đếm, kiểm tra, tìm kiếm 
11 
VÍ DỤ 2 
Viết chương trình nhập số nguyên dương n và tính tổng 
 Phân tích bài toán: 
 Input: n (Để xác định tham số) 
 Kiểu dữ liệu: số nguyên dương (int). 
 Output: Tổng S (Để xác định kiểu dữ liệu phương thức) 
 Trả về giá trị của S. 
 S là tổng các số nguyên dương nên S cũng là số nguyên 
dương  Kiểu tra ̉ về của hàm là int (hoặc long). 
 Xác định TênHàm: Dùng tính tổng S nên có thể đặt là 
TongS 
int TongS(int n); 
12 
0;321  nnSn 
#include 
int TongS(int n); 
int TongS(int n) 
{ 
 int kq = 0; 
 for (int i = 1; i <= n; i++) 
 kq + = i; 
 return kq; 
} 
void main() 
{ 
 int n, S; 
 cout<<"Nhap vao so nguyen n: "; 
 cin>>n; 
 S = TongS(n); //gọi hàm và gán kết quả 
 cout<<"Tong tu 1 den n: " <<S; 
} 
13 
TẦM VỰC CỦA BIẾN 
Phạm vi khối 
Phạm vi hàm 
Phạm vi chương trình 
Phạm vi tập tin 
14 
PHẠM VI KHỐI 
Một khối được giới hạn bởi ngoặc {}. 
Biến khai báo trong khối đó có phạm vi 
khối, nghĩa là nó chỉ hoạt động trong 
khối đó mà thôi. Phạm vi này còn gọi là 
cục bộ, và biến đưọc gọi là biến cục 
bộ. 
15 
PHẠM VI KHỐI (tt) 
16 
void main() 
{ 
int i=20; 
{ 
int i=10; 
cout<<"Gia tri i ben trong khoi: "<<i<<endl; 
} 
cout<<"Gia tri i ben ngoai khoi: "<<i; 
} 
Kết quả 
Gia tri i ben trong khoi: 10 
Gia tri i ben ngoai khoi: 20 
PHẠM VI HÀM 
Biến hoạt động từ đầu đến cuối một hàm, 
chỉ có tác dụng trong hàm 
17 
void main() 
{ 
int k; 
float m; 
double x; 
//Các lệnh khác 
// 
} 
PHẠM VI CHƯƠNG TRÌNH 
 Biến được khai báo bên ngoài 
các hàm – còn được gọi là 
biến toàn cục, có tác dụng cho 
toàn bộ chương trình 
 Biến toàn cục mặc dù được 
nhìn thấy ở mọi hàm trong 
toàn chương trình, nhưng 
không nên khai báo sử dụng 
nhiều nếu không cần thiết, vì 
nó sẽ gây trở ngại cho quá 
trình dò tìm lỗi khi debug 
chương trình 
18 
int a, b; 
void Nhap() 
{ 
cout<<"Nhap a: "; 
cin>>a; 
cout<<"Nhap b: "; 
cin>>b; 
} 
void main() 
{ 
int c; 
Nhap(); 
c=a+b; 
cout<<"Tong = "<<c; 
} 
PHẠM VI TẬP TIN 
 Biến được khai báo toàn cục và có kèm từ khóa 
static 
19 
int x = 0; 
static int y = 0; 
static float z = 0.0; 
void main() 
{ 
 int i; 
 //Các lệnh 
 . 
 . 
} 
THAM SỐ LÀ THAM CHIẾU 
Tham số làm kết quả đầu ra 
Tham số vừa làm đầu vào và đầu ra 
Dùng dấu & phía trước tên tham số 
khi cài đặt hàm 
20 
VÍ DỤ 
Xét chương trình hoán vị 2 số nguyên a, b cho trước 
Viết chương trình với 2 trường hợp 
 Trường hợp không dùng tham chiếu 
 Trường hợp dùng tham chiếu 
21 
void HoanVi(int a, int b) 
{ 
 int tam = a; 
 a = b; 
 b = tam; 
 cout<<"Trong HoanVi: a = “<<a<<“ ;b = “<<b; 
} 
void main() 
{ 
 int a = 5, b = 21; 
 cout<<"Truoc khi HoanVi: a = “<<a<<“ ; b = “<<b; 
 HoanVi(a, b); 
 cout<<"Sau khi goi HoanVi: a = “<<a<<“ ;b = “<<b; 
} 
22 
TRƯỜNG HỢP 1 
Kết quả 
23 
void HoanVi(int &a, int &b) 
{ 
 int tam = a; 
 a = b; 
 b = tam; 
 cout<<"Trong HoanVi: a = “<<a<<“ ;b = “<<b; 
} 
void main() 
{ 
 int a = 5, b = 21; 
 cout<<"Truoc khi HoanVi: a = “<<a<<“ ; b = “<<b; 
 HoanVi(a, b); 
 cout<<"Sau khi goi HoanVi: a = “<<a<<“ ;b = “<<b; 
} 
24 
TRƯỜNG HỢP 2 
Kết quả 
25 
NGUYÊN TẮC XÂY DỰNG HÀM 
Trước khi xây dựng hàm phải trả lời những câu hỏi sau: 
 Hàm trả về gì?  Xác định kiểu dữ liệu trả về của hàm 
 Hàm làm gì?  Xác định tên hàm 
 Cần những thông tin gì để hàm xử lý?  Xác định tham số 
 Ứng với mỗi thông tin đã xác định, xác định xem đã có giá trị 
trước khi vào hàm chưa, 
 - Nếu chưa có  Biến ở dạng tham chiếu (dùng để nhập giá 
trị trong hàm) 
 - Nếu có mà sau khi thực hiện xong hàm vẫn không thay 
đổi  Biến ở dạng tham trị (không là tham chiếu) 
 - Nếu có mà sau khi thực hiện xong hàm thì giá trị cũng bị 
thay đổi theo  Biến ở dạng tham chiếu 
26 
GIỚI THIỆU HÀM ĐỆ QUI 
Một hàm được gọi có tính đệ qui nếu trong 
thân của hàm đó có lệnh gọi lại chính nó 
một cách tường minh hay tiềm ẩn. 
Phân loại đệ qui 
–Đệ qui tuyến tính. 
–Đệ qui nhị phân. 
–Đệ qui phi tuyến. 
–Đệ qui hỗ tương. 
27 
ĐỆ QUI TUYẾN TÍNH 
• Trong thân hàm có duy nhất một lời gọi hàm gọi lại chính nó 
một cách tường minh. 
 TenHam () 
{ 
 if (điều kiện dừng) 
 { 
 . . . 
 //Trả về giá trị hay kết thúc công việc 
 } 
 //Thực hiện một số công việc (nếu có) 
 . . . TenHam (); 
 //Thực hiện một số công việc (nếu có) 
} 
28 
Ví dụ: Tính 
- Điều kiện dừng: S(0) = 0. 
- Qui tắc (công thức) tính: S(n) = S(n-1) + n. 
long TongS (int n) 
{ 
 if(n==0) 
 return 0; 
 return ( TongS(n-1) + n ); 
} 
29 
nnS  321)(
ĐỆ QUI NHỊ PHÂN 
Trong thân của hàm có hai lời gọi hàm gọi lại chính nó một cách 
tường minh. 
 TenHam () 
{ 
 if (điều kiện dừng) 
 { 
 . . . 
 //Trả về giá trị hay kết thúc công việc 
 } 
 //Thực hiện một số công việc (nếu có) 
 . . .TenHam (); //Giải quyết vấn đề nhỏ hơn 
 //Thực hiện một số công việc (nếu có) 
 . . . TenHam (); //Giải quyết vấn đề còn lại 
 //Thực hiện một số công việc (nếu có) 
} 
30 
Ví dụ: Tính số hạng thứ n của dãy Fibonaci 
được định nghĩa như sau: 
f1 = f0 =1 ; 
fn = fn-1 + fn-2 ; (n>1) 
Điều kiện dừng: f(0) = f(1) = 1. 
long Fibonaci (int n) 
{ 
 if(n==0 || n==1) 
 return 1; 
 return Fibonaci(n-1) + Fibonaci(n-2); 
} 
31 
ĐỆ QUI PHI TUYẾN 
Trong thân của hàm có lời gọi hàm gọi lại chính nó được đặt bên trong 
vòng lặp. 
 TenHam () 
{ 
 for (int i = 1; i<=n; i++) 
 { //Thực hiện một số công việc (nếu có) 
if (điều kiện dừng) 
{ . . . 
 //Trả về gia ́ trị hay kết thúc công việc 
} 
else 
{ //Thực hiện một số công việc (nếu có) 
 TenHam (); 
} 
 } 
} 
32 
Ví dụ: Tính số hạng thứ n của dãy {Xn} được định nghĩa như sau: 
X0 =1 ; 
Xn = n
2X0 + (n-1)
2X1 +  + (n-i)
2Xi +  + 1
2Xn-1 ; (n≥1) 
Điều kiện dừng:X(0) = 1. 
Phân tích : 
Với n = 3, biểu thức có dạng: 
X3 = 3
2X0 + 2
2X1 + 1
2X2; 
X2 = 2
2X0 + 1
2X1; 
X1 = 1
2X0; 
X0 = 1; 
Kết quả : X3 = 18 
33 
 long TinhXn (int n) 
{ 
 if(n==0) 
 return 1; 
 long s = 0; 
 for (int i=1; i<=n; i++) 
 s = s + i * i * TinhXn(n-i); 
 return s; 
} 
34 
ĐỆ QUI HỖ TƯƠNG 
Trong thân của hàm này có lời gọi hàm đến hàm 
kia va ̀ trong thân của hàm kia có lời gọi hàm tới 
hàm này. 
35 
g()
f()
h()
f()
f() g()
 TenHam2 (); 
 TenHam1 () 
{ 
//Thực hiện một số công việc (nếu có) 
TenHam2 (); 
//Thực hiện một số công việc (nếu có) 
} 
 TenHam2 () 
{ 
//Thực hiện một số công việc (nếu có) 
TenHam1 (); 
//Thực hiện một số công việc (nếu có) 
} 
 36 
Ví dụ: Tính số hạng thứ n của hai dãy {Xn}, {Yn} được định nghĩa như sau: 
X0 =Y0 =1 ; 
Xn = Xn-1 + Yn-1; (n>0) 
Yn = n
2Xn-1 + Yn-1; (n>0) 
- Điều kiện dừng:X(0) = Y(0) = 1. 
long TinhYn(int n); 
long TinhXn (int n) 
{ 
 if(n==0) 
 return 1; 
 return TinhXn(n-1) + TinhYn(n-1); 
} 
long TinhYn (int n) 
{ 
 if(n==0) 
 return 1; 
 return n*n*TinhXn(n-1) + TinhYn(n-1); 
} 
37 
CÁCH HOẠT ĐỘNG HÀM ĐỆ QUI 
Ví dụ tính n! với n=5 
38 
5n 5n 4n 3n 2n
GiaiThua(5)main()
5 4 23 1
12624120
GiaiThua(2)GiaiThua(4) GiaiThua(3)
1n
GiaiThua(1)
int giaithua(int n) 
{ 
 `if(n<=1) 
 return 1; 
 return giaithua(n-1)*n; 
} 
BÀI TẬP 1 
Xác định các khai báo hàm của các bài toán sau: 
1.Viết chương trình tính diện tích và chu vi của hình 
chữ nhật với chiều dài và chiều rộng được nhập từ 
bàn phím. 
2.Viết chương trình tính diện tích và chu vi hình tròn 
với bán kính được nhập từ bàn phím. 
3.Nhập vào 3 số thực a, b, c và kiểm tra xem chúng có 
thành lập thành 3 cạnh của một tam giác hay 
không? Nếu có hãy tính diện tích, chiều dài mỗi 
đường cao của tam giác và in kết quả ra màn hình. 
4.Viết chương trình nhập 2 số nguyên dương a, b. Tìm 
USCLN và BSCNN của hai số nguyên đó 
39 
BÀI TẬP 1 (tt) 
–Công thức tính diện tích 
 s = sqrt(p*(p-a)*(p-b)*(p-c) ) 
 với p là nửa chu vi của tam giác 
–Công thức tính các đường cao: 
 ha = 2s/a, hb=2s/b, hc=2s/c. 
40 
BÀI TẬP 2 
1. Viết chương trình tất cả các bài tập 1 
2. Viết chương trình nhập số nguyên dương n, tính 
tổng các ước số dương của n. 
 Ví dụ: Nhập n=6 
 Tổng các ước số từ 1 đến n: 1+2+3+6=12. 
3. Nhập vào giờ, phút, giây. Kiểm tra xem giờ, phút, 
giây đó có hợp lệ hay không? In kết quả ra màn 
hình. 
4. Viết chương trình nhập số nguyên dương n gồm k 
chữ số, đếm xem n có bao nhiêu chữ số là số 
nguyên tố. 
 41 
5. Viết chương trình tính tiền thuê máy dịch vụ Internet và in ra 
màn hình kết quả. Với dữ liệu nhập vào là giờ bắt đầu thuê 
(GBD), giờ kết thúc thuê (GKT), số máy thuê (SoMay). 
 Điều kiện cho dữ liệu nhập: 6<=GBD<GKT<=21. Giờ là số 
nguyên. 
 Đơn giá: 2500đ cho mỗi giờ máy trước 17:30 và 3000đ cho 
mỗi giờ máy sau 17:30. 
6. Viết chương trình tính tiền lương ngày cho công nhân, cho biết 
trước giờ vào ca, giờ ra ca của mỗi người. 
 Gia ̉ sử rằng: 
 Tiền trả cho mỗi giờ trước 12 giờ là 6000đ và sau 12 giờ là 
7500đ. 
 Giờ vào ca sớm nhất là 6 giờ sáng và giờ ra ca trễ nhất là 18 
giờ (Giả sử giờ nhập vào nguyên). 
42 
            Các file đính kèm theo tài liệu này:
 chuong04_hamcon_5169.pdf chuong04_hamcon_5169.pdf