chƣơng 4 hÀm - function - thayphet.net filebắt đầu và kết thúc bằng các dấu { }....
TRANSCRIPT
1
Chƣơng 4
HÀM - FUNCTION
Giảng Viên: ThS. Dƣơng Thành Phết
Email: [email protected]
Website: http://www.thayphet.net
Tel: 0918158670 – facebook.com/duongthanhphet
KỸ THUẬT LẬP TRÌNH C/C++
TRƢỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH
KHOA CÔNG NGHỆ THÔNG TIN
http://www.thayphet.net
NỘI DUNG
1. Khái niệm
2. Khai báo và sử dụng hàm
3. Tham số và truyền tham số cho hàm
4. Nguyên tắc xây dựng hàm
5. Hàm đệ quy
http://www.thayphet.net
3
CẤU TRÚC CHƢƠNG TRÌNH C/C++
3
Khai báo
Cài đặt hàm
Hàm main()
CH
ƯƠ
NG
TR
ÌNH
C
Khai báo thư viện
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
http://www.thayphet.net
4
1. KHÁI NIỆM
1.1. Hàm-Function là gì?
“Hàm là môt đoan chương trinh đôc lâp thưc hiên tron
ven môt công viêc nhât đinh sau đó trả vê gia tri cho
chương trinh goi nó, hay nói cach khac hàm là sư chia
nhỏ cua chương trinh”
4
http://www.thayphet.net
5
1. KHÁI NIỆM
1.2. Mục đich sử dụng hàm:
Khi co môt công việc giống nhau cần thực hiện ơ nhiều
vi tri.
Khi cần chia môt chương trinh lơn phức tap thành các
đơn thê nho (hàm con) đê chương trinh được trong
sáng, dê hiêu trong việc xư ly, quản ly việc tinh toán va
giải quyêt vấn đê.
5
http://www.thayphet.net
6
Cú pháp:
6
2. KHAI BÁO VÀ SỬ DỤNG HÀM
Type Tênhàm(các tham số){
Khai báo các biên cục bô;
Các câu lệnh;
[return [biêu thức];]
}
Type: Kiêu dữ liệu giá tri trả về của hàm
Kiêu dữ liệu trả về của hàm gồm 2 loai
void: Không trả về giá tri
float / int / long / char */ kiêu cấu trúc / … : Trả về
giá tri kêt quả có kiêu dữ liệu tương ứng
2.1. Khai báo
Thân hàm
http://www.thayphet.net
7
Vi dụ: Hàm tinh tổng giá tri 2 số nguyên
7
2. KHAI BÁO VÀ SỬ DỤNG HÀM
2.1. Khai báo
int Tong(int a, int b){
int s=0;
s=a+b;
return s;
}
Vi dụ: Hàm kiêm tra n co phải là số dương
bool KTDuong(int n){
if n>0
return true;
else
return false;
}
http://www.thayphet.net
8
Tên hàm: Đặt tên ngắn gọn phản ánh đúng chức năng
thực hiện của hàm
8
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
cua hàm nếu kết quả đầu ra có nhiêu giá tri - Tham số
này goi là tham chiếu)
Thân hàm:
Bắt đầu và kêt thúc bằng các dấu { }.
Trong thân hàm chứa các câu lệnh cần thiêt đê thực
hiện yêu cầu đề ra cho hàm.
Thân hàm có thê có câu lệnh return, giá tri của biêu
thức lệnh return sẽ được gán cho lời gọi hàm.
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
9
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;
} 9
Truyền đối số
Tham số
Gọi hàm
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
10
10
2.2 Nguyên tác hoạt động của hàm
Lời gọi hàm có dang:
Tên hàm([Danh sách các tham số thực])
Khi gặp lời gọi chương trình sẽ dời chỗ đên hàm
tương ứngTheo trình tự:
Cấp phát bô nhơ cho các biên cục bô.
Gán giá tri của các tham số thực cho các tham số
hình thức tương ứng.
Thực hiện các câu lệnh trong thân hàm.
Khi gặp câu lệnh return hoặc dấu } cuối cùng của
thân hàm thì chương trình sẽ xoá các tham số,
biên cục bô và ra khỏi hàm.
Câu lệnh return có chứa biêu thức thì giá tri của
biêu thức được gán cho hàm. Giá tri của hàm sẽ
được sử dụng trong các biêu thức chứa nó.
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
11
2.3. HÀM KHÔNG CÓ GIÁ TRỊ TRẢ VỀ (KIỂU VOID)
Cài đặt
void TênHàm([danh sach cac tham sô]){
Khai bao cac biến cuc bô
Cac câu lênh / khối lênh hay lời goi đến hàm khac.
}
11
Gọi hàm
TênHàm(danh sách tên các đối số);
Những phương thức loai này thường rơi vào những nhom chức
năng: Nhâp / xuất dữ liệu , thống kê, sắp xêp, liệt kê.
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
12
Ví dụ 1: Viêt chương trinh nhâp số nguyên dương n và in
ra màn hinh các ươc số của n
Phân tich bài toán:
Input:
n (tham số)
Kiêu dữ liệu: số nguyên dương (int).
Output:
In ra các ươc số của n (dữ liệu trả về của hàm)
Xuất ra màn hinh Không trả về giá tri (Kiêu void)
Xác đinh tên hàm: Hàm này dung in ra các ươc số của
n nên co thê đặt là LietKeUocS Khai báo hàm:
void LietKeUocSo(int n); 12
2.3. HÀM KHÔNG CÓ GIÁ TRỊ TRẢ VỀ (KIỂU VOID)
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
13
File khaibao.h
#include “iostream”
using namespace std;
void LietKeUocSo(int n);
13
File caidat.cpp
#include “khaibao.h”
void LietKeUocSo(int n){
for (int i = 1; i <= n; i++)
if (n % i == 0)
cout<<i<<“\t”;
}
File Chuongtrinh.cpp
#include “khaibao.h”
void main(){
int n;
cout<<"Nhap so nguyen duong n: ";
cin>>n;
cout<<"Cac uoc so cua “<<n<<“: “;
LietKeUocSo(n);
}
http://www.thayphet.net
14
2.4. HÀM TRẢ VỀ 1 GIÁ TRỊ
Cài đặt
<Kiểu dư liêu> TênHàm([danh sach cac tham số]){
<Kiểu dư liêu trả vê> kq;
Khai bao cac biến cuc bô
Cac câu lênh / khối lênh hay lời goi đến hàm khac.
return kq;
}
14
Gọi hàm
<Kiểu dư liêu > Tên biến = TênHàm (Cac tham 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
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
15
Ví dụ 2: Viêt chương trinh nhâp số nguyên dương n và tinh
tổng: Sn=1+2+3+ . . .+n ; vơi n>0
Phân tich bài toán:
Input:
n (tham sô)
Kiêu dư liệu: sô nguyên dương (int).
Output:
Tra vê gia tri của S. S là tổng các sô nguyên dương nên S cung là sô nguyên dương Kiêu tra vê của hàm là int (hoặc long).
Xác đinh TênHàm:
Dung tinh tổng S nên co thê đặt là TongS
int Tong(int n);
15
2.4. HÀM TRẢ VỀ 1 GIÁ TRỊ
2. KHAI BÁO VÀ SỬ DỤNG HÀM
http://www.thayphet.net
16
File khaibao.h #pragma once #include <iostream.h> int TongS(int n);
16
File caidat.cpp #include “khaibao.h” int TongS(int n){ int kq = 0; for (int i = 1; i <= n; i++) kq + = i; return kq; }
File main.cpp #include “khaibao.h” void main(){ int n, S; cout<<"Nhap vao so nguyen n: "; cin>>n; S = TongS(n); cout<<"Tong tu 1 den n: " <<S; }
http://www.thayphet.net
17
3. THAM SỐ VÀ TRUYỀN THAM SỐ
17
3.1. Tham số hình thức và tham số truyền
int Tong(int a, int b)
{
int s=a+b;
return s;
}
void main()
{
int x=12, y=3;
int kq = Tong (x, y);
cout<<“Tong cua 12 va 3: “<<kq;
}
Truyền tham số
Tham số hình thức
Tham số hình thức là biên được
liệt kê trong danh sách tham số
(phần đầu của đinh nghĩa hàm).
Tham số thực (Tham số truyền)
là giá tri cụ thê của biên đo tai thời
điêm chay.
http://www.thayphet.net
18
3. THAM SỐ VÀ TRUYỀN THAM SỐ
18
Tham số chứa dữ liệu đầu vào
3.2. Tham số là tham tri
void HoanVi(int a, int b){
int tam = a;
a = b;
b = tam;
printf("Trong HoanVi: a = %d; b=%d“,a,b);
}
void main(){
int a = 5, b = 21;
printf("Truoc khi HoanVi: a =%d, b=%d “,a,b);
HoanVi(a, b);
printf("Sau khi goi HoanVi: a =%d, b=%d»,a,b);
}
http://www.thayphet.net
19
3. THAM SỐ VÀ TRUYỀN THAM SỐ
19
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
3.3. Tham số là tham chiếu (tham biến)
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;
}
http://www.thayphet.net
20
3. THAM SỐ VÀ TRUYỀN THAM SỐ
20
3.4. Tham số mặc đinh Tham số mặc đinh là tham số của được gán giá tri mặc
đinh khi khai báo.
Khi gọi hàm, nêu không cung cấp giá tri cho đối số thì
giá tri mặc đinh của tham số sẽ được sử dụng.
Còn nêu cung cấp giá tri khác cho đối số thì giá tri đo
sẽ được sử dụng.
http://www.thayphet.net
21
3. THAM SỐ VÀ TRUYỀN THAM SỐ
21
3.4. Tham số mặc đinh
void PrintValues(int nValue1, int nValue2=10)
{
cout << "1st value: " << nValue1 << endl;
cout << "2nd value: " << nValue2 << endl;
}
void main()
{
PrintValues(1); // nValue2 se su dung mac dinh la 10
PrintValues(3, 4); // nValue2 se su dung la 4 khong phai 10
}
Chương trinh xuất ra:
1st value: 1
2nd value: 10
1st value: 3
2nd value: 4
http://www.thayphet.net
22
4. NGUYÊN TẮC KHI 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 đinh kiêu dữ liệu trả về của hàm
Hàm làm gì? Xác đinh tên hàm
Cần thông tin gì đê hàm xử lý? Xác đinh tham số
Ứng vơi mỗi thông tin đã xác đinh, xác đinh xem đã có
giá tri trươc khi vào hàm chưa,
- Nêu chưa có Tham chiêu
- Nêu có mà sau khi thực hiện xong hàm vẫn không
thay đổi Tham tri (không là tham chiêu)
- Nêu có mà sau khi thực hiện xong hàm thì giá tri cung
bi thay đổi theo Tham chiêu 22
http://www.thayphet.net
23
5. HÀM ĐỆ QUY
23
1. KHÁI NIỆM
Kỹ thuât lâp trình đệ qui là:
Phương pháp (GiảI thuât) lâp trình dươi dang hàm
con mà môt hàm được gọi co tinh đê qui nghĩa là:
”Trong thân cua hàm đó có lênh goi lai chinh nó môt
cach tường minh hay tiêm ân”
Phân loại đê qui:
Đệ qui tuyên tinh.
Đê qui nhi phân.
Đê qui phi tuyên.
Đê qui hô tương.
http://www.thayphet.net
24
5. HÀM ĐỆ QUY
24
5.2. ĐỆ QUI TUYÊN TINH
Trong thân hàm có duy nhât môt lời goi hàm goi lai chinh
nó môt cach tường minh.
<Kiêu dữ liệu> TenHam (<danh sách tham số>)
{
if (điều kiện dừng)
//Trả về giá tri hay kêt thúc công việc
//Thực hiện môt số công việc (nêu co)
…TenHam (<danh sách tham số>);
//Thực hiện môt số công việc (nêu co)
}
http://www.thayphet.net
25
5. HÀM ĐỆ QUY
25
5.2. ĐỆ QUI TUYÊN TINH
long Giaithua (int n)
{
if(n==1)
return 1;
return n*Giaithua(n-1);
}
Vi dụ 1: Tinh vơi n>0
- Điêu kiên dưng: S(0) = S(1)= 1.
- Qui tăc (công thưc) tinh: S(n) = n*S(n-1)
nnnS *....*2*1!)(
http://www.thayphet.net
26
5. HÀM ĐỆ QUY
26
5.2. ĐỆ QUI TUYÊN TINH nnnS *....*2*1!)(
5n 5n 4n 3n 2n
GiaiThua(5)main()
5 4 23 1
12624120
GiaiThua(2)GiaiThua(4) GiaiThua(3)
1n
GiaiThua(1)
Cách thức hoạt động của đệ qui
Khi co lệnh gọi hàm S= gt(5); thì
Sẽ ghi nhơ là: gt(5)= 5 * gt(4); và đi tinh gt(4)
Kê tiêp máy lai ghi nhơ: gt(4):= 4 * gt(3); và đi tinh gt(3)
Kê tiêp máy lai ghi nhơ: gt(3):= 3 * gt(2); và đi tinh gt(2)
Kê tiêp máy lai ghi nhơ: gt(2):= 2 * gt(1); và đi tinh gt(1)
Theo đinh nghĩa của hàm thi: gt(1):= 1;
Máy sẽ quay ngược lai:
gt(2)= 2 * 1 = 2
Tiêp tục: gt(3)= 3 * 2 = 6;
gt(4)= 4 * 6 = 24
gt(5)= 5 *24=120
Kêt quả cuối cung trả về là 120
http://www.thayphet.net
27
5. HÀM ĐỆ QUY
27
5.2. ĐỆ QUI TUYÊN TINH nnnS *....*2*1!)(
5n 5n 4n 3n 2n
GiaiThua(5)main()
5 4 23 1
12624120
GiaiThua(2)GiaiThua(4) GiaiThua(3)
1n
GiaiThua(1)
Cách thức hoạt động của đệ qui
Khi co lệnh gọi hàm S= gt(5); thì
Sẽ ghi nhơ là: gt(5)= 5 * gt(4); và đi tinh gt(4)
Kê tiêp máy lai ghi nhơ: gt(4):= 4 * gt(3); và đi tinh gt(3)
Kê tiêp máy lai ghi nhơ: gt(3):= 3 * gt(2); và đi tinh gt(2)
Kê tiêp máy lai ghi nhơ: gt(2):= 2 * gt(1); và đi tinh gt(1)
Theo đinh nghĩa của hàm thi: gt(1):= 1;
Máy sẽ quay ngược lai:
gt(2)= 2 * 1 = 2
Tiêp tục: gt(3)= 3 * 2 = 6;
gt(4)= 4 * 6 = 24
gt(5)= 5 *24=120
Kêt quả cuối cung trả về là 120
http://www.thayphet.net
28
5. HÀM ĐỆ QUY
28
5.3. ĐỆ QUI NHỊ PHÂN
<Kiêu dữ liệu hàm> TenHam (<danh sách tham số>)
{
if (điều kiện dừng)
//Trả về giá tri hay kêt thúc công việc
//Thực hiện môt số công việc (nêu co)
….TenHam (<danh sách tham số>);
//Thực hiện môt số công việc (nêu co)
. . . TenHam (<danh sách tham số>);
//Giải quyêt vấn đề con lai
//Thực hiện môt số công việc (nêu co)
}
Trong thân cua hàm có hai lời goi hàm goi lai chinh nó môt
cach tường minh.
http://www.thayphet.net
29
5. HÀM ĐỆ QUY
29
5.3. ĐỆ QUI NHỊ PHÂN
Vi dụ: Tinh số hang thứ n của dãy Fibonaci được đinh
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);
}
http://www.thayphet.net
30
5. HÀM ĐỆ QUY
30
5.4. ĐỆ QUI PHI TUYÊN
<Kiêu dữ liệu> TenHam (<danh sách tham số>) { for (int i = 1; i<=n; i++) { //Thực hiện môt số công việc (nêu co) if (điều kiện dừng) //Trả về giá tri hay kêt thúc công việc else { //Thực hiện môt số công việc (nêu co) TenHam (<danh sách tham số>); } } }
Trong thân cua hàm có lời goi hàm goi lai chinh nó được
đăt bên trong vong lăp.
http://www.thayphet.net
31
5. HÀM ĐỆ QUY
31
5.4. ĐỆ QUI PHI TUYÊN
Vi dụ: Tinh số hang thứ n của dãy {Xn} đinh nghĩa như sau:
X0 =1 ;
Xn = n2X0 + (n-1)2X1 + … + 12Xn-1 ; (n≥1)
Điêu kiên dưng:X(0) = 1.
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;
}
http://www.thayphet.net
32
5. HÀM ĐỆ QUY
32
Trong thân của hàm này co lời gọi hàm đên hàm kia và
trong thân của hàm kia co lời gọi hàm tơi hàm này.
5.5. ĐỆ QUI TƢƠNG HỖ
<Kiêu dữ liệu> TenHam2 (<danh sách tham số>);
<Kiêu dữ liệu> TenHam1 (<danh sách tham số>)
{
//Thực hiện môt số công việc (nêu co)
…TenHam2 (<danh sách tham số>);
//Thực hiện môt số công việc (nêu co)
}
<Kiêu dữ liệu> TenHam2 (<danh sách tham số>)
{
//Thực hiện môt số công việc (nêu co)
…TenHam1 (<danh sách tham số>);
//Thực hiện môt số công việc (nêu co)
}
http://www.thayphet.net
33
5. HÀM ĐỆ QUY
33
5.5. ĐỆ QUI TƢƠNG HỖ Vi dụ: Tinh số hang thứ n của hai dãy {Xn}, {Yn} được đinh nghĩa
như sau:
X0 =Y0 =1 ;
Xn = Xn-1 + Yn-1; (n>0)
Yn = n2Xn-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);
}
http://www.thayphet.net
34
BÀI TẬP
Viêt chương trinh dung hàm cho các bài toán sau:
1. Viêt chương trinh tinh diện tich và chu vi của hinh
chữ nhât vơi chiều dài và chiều rông được nhâp từ
bàn phim.
2. Viêt chương trinh tinh diện tich và chu vi hinh tron vơi
bán kinh được nhâp từ bàn phim.
3. Nhâp vào 3 số thực a, b, c và kiêm tra xem chúng co
thành lâp thành 3 canh của môt tam giác hay không?
Nêu co hãy tinh diện tich, chiều dài mỗi đường cao
của tam giác và in kêt quả ra màn hinh.
4. Viêt chương trinh nhâp 2 số nguyên dương a, b. Tim
USCLN và BSCNN của hai số nguyên đo 34
http://www.thayphet.net
35
5. Viêt chương trinh nhâp số nguyên dương n, tinh tổng
các ươc số dương của n.
Vi dụ: Nhâp n=6
Tổng cac ước số tư 1 đến n: 1+2+3+6=12.
6. Nhâp vào giờ, phút, giây. Kiêm tra xem giờ, phút,
giây đo co hợp lệ hay không? In kêt quả ra màn hinh.
7. Viêt chương trinh tinh tiền thuê máy dich vụ Internet và in ra màn hinh 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.
35
BÀI TẬP
http://www.thayphet.net
36
8. Viêt chương trinh tinh 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 tra cho mỗi giơ trươc 12 giơ là 6000đ va sau 12 giơ là 7500đ.
Giơ vào ca sơm nhất là 6 giơ sáng va giơ ra ca trê nhất là 18 giơ (Gia sư giơ nhâp vào nguyên).
9. Viêt chương trinh nhâp sô nguyên dương n gồm k chư sô, đêm xem n co bao nhiêu chư sô là sô nguyên tô.
36
BÀI TẬP
http://www.thayphet.net
37
37
1. Tim USCLN của 2 số nguyên dương a,b
2. Tính S=1+2+3+….+n vơi n>0
3. Tính S=1+1.2+1.2.3+…..+1.2.3…n vơi n>0
4. Tính P(x,y) = xy
5. Tính
BÀI TẬP
Viêt chương trinh dung hàm đệ quy cho các bài toán sau: