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 |
Chia sẻ: honghanh66 | Lượt xem: 1241 | 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