Tải bản đầy đủ (.pdf) (60 trang)

Bài giảng lập trình c chương 6 GV nguyễn văn hùng

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 (525.46 KB, 60 trang )

LẬP TRÌNH C++
(3 Tín chỉ)
Gv: Nguyễn Văn Hùng
Khoa: Khoa học máy tính
Ngôn ngữ lập trình C++

1/56


Chương 6: HÀM (FUNCTION)
6.1. Hàm
6.2. Hàm và mảng dữ liệu
6.3. Hàm và cấu trúc
6.4. Đệ quy

Ngôn ngữ lập trình C++

2/56


Hàm
-

Ngôn ngữ lập trình C++

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


3/56


Khái niệm
- 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:

Ngôn ngữ lập trình C++

4/56


Khái niệm
- 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 giá trị cho hàm:
• Truyền theo tham biến.
• Truyền theo tham trị
• Truyền theo tham trỏ


Ngôn ngữ lập trình C++

5/56


Khai báo và định nghĩa hàm
Khai báo hàm:
- Hàm có thể trả về hoặc không trả về giá trị. Trường hợp hàm
trả về giá trị thì kiểu của giá trị trả lại được gọi là kiểu của
hàm.
- 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.

Ngôn ngữ lập trình C++

6/56


Khai báo và định nghĩa 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>

Ngôn ngữ lập trình C++

7/56



Khai báo và định nghĩa hàm
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ố.

Ngôn ngữ lập trình C++

8/56


Khai báo và định nghĩa hàm
Định nghĩa hàm:
* Hàm có 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);
}

Ngôn ngữ lập trình C++

9/56


Khai báo và định nghĩa hàm
Đị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 bất kỳ.
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) kiểu thực với độ chính xác gấp đôi là xn.
double luythua(float 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;
}
Ngôn ngữ lập trình C++

10/56



Khai báo và định nghĩa hàm
Định nghĩa hàm:
* Hàm không trả về giá trị:
Nếu hàm không trả lại 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.
Nếu có thì sau return không có biểu thức.
Ví dụ: Viết một hàm xoá màn hình 100 lần
void ClearSrceen()
{
int i;
for (i=1; i<=100; i++)
clrscr();
return ;
}
Ngôn ngữ lập trình C++

11/56


Lời gọi và sử dụng hàm
- 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
(,)

Ngôn ngữ lập trình C++

12/56


Lời gọi và sử dụng hàm
Ví dụ:
double luythua(float x, int n)
{
int i ;
double kq = 1 ;
for (i=1; i<=n; i++) kq *= x ;
return kq;
}

Ngôn ngữ lập trình C++

main() // tính giá trị 2x3-5x2-4x + 1
{
float x ;
double f ;
cout << “x =” ; cin >> x;
f = 2*luythua(x,3)-5*luythua(x,2)-4*x + 1;

}

13/56


Biến và truyền tham số
- 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 đó, 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

Tác dụng: tạo ra một biến tham chiếu mới và cho nó tham
chiếu đến biến được tham chiếu (cùng kiểu). Khi đó, biến
tham chiếu còn được gọi là bí danh của biến được tham
chiếu.
Ngôn ngữ lập trình C++

14/56


Biến và truyền tham số
Ví dụ:
int a, b;
int &a1=a, &b1=b;
a=2; b=3;
cout<<"a= "<

cout<<"a1= "<

17/56


Biến và truyền tham số
+ Truyền theo tham trị:
- Trong phương pháp nkày:
+ Các tham số hình thức (đối số) chỉ nhận giá trị vào cho
chương trình con mà không trả kết quả về.
+ Tham số hình thức đượ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 tham số thực tế 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ự)

Ngôn ngữ lập trình C++

18/56


Tham số hình thức
Tham trị: biến cục bộ
Tham trỏ: con trỏ
Tham biến: biến tham chiếu
Tham số thực tế
Tham trị: biểu thức (biến, hằng, hàm,..)
Tham trỏ: một biến. Chứa địa chỉ ô nhớ
Tham biến: biến tham chiếu
BT: 1->8 (trừ 4) cuối C6
sx nhanh, sp chọn

Ngôn ngữ lập trình C++


19/56


Biến và truyền tham số
- Các bước thực hiện:
+ Tại thời điểm gọi: giá trị của tham số thực tế được sao
chép vào trong ô nhớ của tham số hình thức
+ Trong quá trình thực hiện: mọi thao tác trên tham số hình
thức 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 tham số hình thức
không làm ảnh hưởng đến giá trị của tham số thực tế.

Ngôn ngữ lập trình C++

20/56


Biến và truyền tham số
Ví dụ: Cho hàm: luythua(float x, int n) tính xn. Giả sử trong
chương trình chính ta có các biến a, b đang chứa các giá trị
a=2, b=3 và biến f chưa có giá trị. Để tính ab 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.

Ngôn ngữ lập trình C++

21/56


Biến và truyền tham số
Ví dụ:
int Tong(int, int);
int main()
{ int a = 5, b = 5;
cout<<"Tong cua 2 so la S= “;
cout<cout<return 0;
}
int Tong(int x, int y)
{
return x+y;
}

Ngôn ngữ lập trình C++

22/56


Biến và truyền tham số
+ Truyền theo tham biến:
- Trong phương pháp này:

+ Tham số hình thức là tham số vào ra, do đó nó sẽ nhận giá
trị vào cho chương trình con và trả về kết quả cho chương
trình gọi.
+ Tham số hình thức là một biến tham chiếu và tham số thực
tế phải là một biến
+ Khi kết thúc: mọi thay đổi giá trị của tham số hình thức đều
làm giá trị của tham số thực tế thay đổi theo.

Ngôn ngữ lập trình C++

23/56


Biến và truyền tham số
+ 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;

Ngôn ngữ lập trình C++

24/56



Biến và truyền tham số
+ Truyền theo tham trỏ:
Trong phương pháp này:
- Tham số hình thức là tham số vào ra, do đó nó sẽ nhận giá
trị vào cho chương trình con và trả về kết quả cho chương
trình gọi.
- Tham số hình thức là một con trỏ và tham số thực tế 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 tham số hình thức đều
làm giá trị của tham số thực tế thay đổi theo.

Ngôn ngữ lập trình C++

25/56


×