Giới Thiệu Lập Trình Hàm – Cơ Bản
TS. Lê Nguyên Khôi Trường Đại học Công nghệ, ĐHQGHN
Nội Dung
(cid:1) Khái niệm chung (cid:1) Định nghĩa hàm (cid:1) Sử dụng hàm (cid:1) Truyền tham số (cid:1) Phạm vi biến
1
Giới Thiệu Lập Trình
Khái Niệm Chung
(cid:1) Giải quyết một bài toán phức tạp
(cid:1) Chia nhỏ bài toán ban đầu thành bài toán nhỏ hơn,
đơn lẻ, dễ giải quyết
(cid:1) Xử lý từng bài toán nhỏ lần lượt (cid:1) Kết hợp lại để giải bài toán ban đầu
(cid:1) Ngôn ngữ lập trình bậc cao
(cid:1) Cung cấp công cụ để phân tách và xử lý bài toán nhỏ (khối lắp ghép - mô-đun hóa chương trình)
(cid:1) Lợi ích
(cid:1) Tái sử dụng mã, dễ quản lý (cid:1) Tránh các đoạn mã giống nhau lặp đi lặp lại (cid:1) Tìm lỗi, gỡ lỗi dễ dàng, nhanh chóng
2
Giới Thiệu Lập Trình
Khái Niệm Chung
(cid:1) Chia nhỏ bài toán, ví du:
(cid:1) Cho độ dài 3 đoạn thẳng, 3 đoạn thẳng này tạo
thành tam giác gì?
(cid:1) 3 đoạn thẳng có tạo thành tam giác? (cid:1) 3 đoạn thẳng này có tạo thành tam giác đều? (cid:1) 3 đoạn thẳng này có tạo thành tam giác cân? (cid:1) 3 đoạn thẳng này có tạo thành tam vuông? (cid:1) … (cid:1) 3 đoạn thẳng này có tạo thành tam giác vuông cân?
3
Giới Thiệu Lập Trình
Khái Niệm Chung
(cid:1) Tái sử dụng mã, ví du:
(cid:1) Tính ước chung lớn nhất của 2 số nguyên dương (cid:1) Kiểm tra 2 số nguyên tố cùng nhau (cid:1) Tối giản phân số (cid:1) Kiểm tra 2 số có chia hết cho nhau
4
Giới Thiệu Lập Trình
Hàm (Phương Thức)
(cid:1) Hàm (phương thức) là một khối các câu lênh (phải) được đặt tên, để thực hiện thao tác đã được xác định trước
(cid:1) Hàm là một cách hữu hiệu để cấu trúc chương
trình và xử lý: (cid:1) Đoạn mã được dùng lại nhiều lần
(cid:1) Hàm đã sử dụng
(cid:1) Hàm tính căn bậc 2 (sqrt(x)) (cid:1) Hàm tính số mũ (pow(x,y)) (cid:1) Hàm tạo số ngẫu nhiên (rand())
5
Giới Thiệu Lập Trình
Hàm – Đặc Điểm
(cid:1) Thực hiện một số thao tác và cung cấp kết quả (cid:1) Ví dụ: căn bậc 2 (sqrt(x))
(cid:1) Dữ liệu đầu vào: một số (cid:1) Thao tác: tính căn bậc hai (cid:1) Dữ liệu trả về: căn bậc hai của số đố
(cid:1) Dạng chung
(cid:1) Có thể cần dữ liệu đầu vào (cid:1) Thực hiện một số thao tác (cid:1) Có thể trả về dữ liệu sau xử lý (cid:1) Để thuận tiện, các thao tác được đặt tên, tên hàm
6
Giới Thiệu Lập Trình
Hàm – Tính (cid:1)(cid:2)
(cid:1) Dữ liệu đầu vào
(cid:1) 2 số (int, double, …) đặt tên x, y
(cid:1) Dữ liệu trả về
(cid:1) 1 số (int, double, …) đặt tên ketQua
(cid:1) Thao tác
(cid:1) Thực hiện phép nhân lặp đi lặp lại (cid:1) Ví dụ: 2(cid:4) = 16 = 2 ∗ 2 ∗ 2 ∗ 2
(cid:1) Tên hàm (cid:1) power
7
Giới Thiệu Lập Trình
Định Nghĩa Hàm Trong C++
(cid:1) Cú pháp:
KiểuDLTrảVề TênHàm (DanhSáchDLĐầuVào) {
// danh sách các mệnh lệnh // thân hàm
(cid:1) Kiểu của dữ liệu trả về (KiểuDLTrảVề)
(cid:1) int, double, char, … (cid:1) Nếu hàm không trả về gì, kiểu dữ liệu trả về void
(cid:1) Tên hàm (TênHàm): phải có (cid:1) Danh sách dữ liệu đầu vào (DanhSáchDLĐầuVào)
(cid:1) Danh sách tham số (tham số cũng có kiểu)
8
Giới Thiệu Lập Trình
}
Định Nghĩa Hàm Trong C++
int main() {
return 0;
(cid:1) Sử dụng câu lệnh return để trả về kết quả của hàm (cid:1) Thực hiện câu lệnh return trả về kết quả của hàm,
kết thúc các thao tác của hàm (cid:1) Thông thường return là câu lệnh cuối cùng trong
thân hàm (định nghĩa của hàm)
(cid:1) Kiểu dữ liệu trả về khi sử dụng câu lệnh return phải giống với kiểu dữ liệu trả về của hàm (KiểuDLTrảVề)
9
Giới Thiệu Lập Trình
}
Hàm – Tính (cid:1)(cid:2)
int power(int x, int y) {
int ketQua = 1; if (y == 0) return 1; while (y > 0) {
ketQua = ketQua * x; y = y – 1;
} return ketQua;
(cid:1) Ví dụ: power(2,4) trả về kết quả 16
10
Giới Thiệu Lập Trình
}
Vị Trí Đặt Định Nghĩa Hàm
(cid:1) Hàm phải được định nghĩa trước khi sử dụng (cid:1) Thông thường định nghĩa hàm đặt trước (ở trên và ở ngoài) int main() để có thể sử dụng trong int main()
int power(… …) { … … }
int main() {
… … = power(… …); return 0;
11
Giới Thiệu Lập Trình
}
Sử Dụng Hàm
int power(int x, int y) { … … }
int main() {
int a, b; cin >> a >> b; int kq = power(a, b); cout << kq; cout << power(a, b); return 0;
(cid:1) Hàm sau khi đã được định nghĩa có thể được sử dụng bất kỳ đâu miễn sao dữ liệu trả về của hàm phù hợp (về cú pháp và kiểu dữ liệu) với mục đích sử dụng (cid:1) Không thể cin >> power(a, b);
12
Giới Thiệu Lập Trình
}
Sử Dụng Hàm
int A() { … … B(); … … } int B() { … … A(); … … }
int main() {
… … return 0;
(cid:1) Đặt định nghĩa hàm nào trước A hay B
(cid:1) Lưu ý: định nghĩa hàm A có sử dụng (gọi) hàm B,
ngược lại, định nghĩa hàm B có sử dụng (gọi) A hàm
13
Giới Thiệu Lập Trình
}
Khai Báo – Định Nghĩa Hàm
// khai báo hàm trước int main() int A(); int B();
int main() { … … return 0; }
(cid:1) C++ cho phép khai báo hàm trước khi sử dụng (cid:1) Sau khi khai báo hàm, định nghĩa hàm có thể đặt bất
kỳ ở đâu, trước/sau int main()
(cid:1) Nên sử dụng cách này
14
Giới Thiệu Lập Trình
// định nghĩa hàm sau int main() int A() { … … B(); … … } int B() { … … A(); … … }
Chữ Ký Hàm
// khai báo hàm trước int main() int A(); int B();
int main() { … … return 0; }
(cid:1) Bỏ đi phần { … } của định nghĩa hàm (cid:1) Bỏ đi ; của khai báo hàm (cid:1) Phần còn lại (kiểu trả về, tên, danh sách tham số) của
hàm giống hệt nhau ở cả định nghĩa và khai báo
15
Giới Thiệu Lập Trình
// định nghĩa hàm sau int main() int A() { … … B(); … … } int B() { … … A(); … … }
Hàm – Tính Nhân (Trả Về int) chỉ sử dụng phép cộng
int multiply(int x, int y) {
int ketQua = 0; for (int i = x; i > 0; i--) ketQua = ketQua + y;
return ketQua;
}
int main() {
int a, b; cin >> a >> b; cout << "tich 2 so la: " << multiply(a,b); return 0;
16
Giới Thiệu Lập Trình
}
Hàm – Tính Nhân (Trả Về void) chỉ sử dụng phép cộng
void multiply(int x, int y) {
int ketQua = 0; for (int i = x; i > 0; i--) ketQua = ketQua + y;
cout << "tich 2 so la: " << ketQua;
}
int main() {
int a, b; cin >> a >> b; multiply(a,b); return 0;
17
Giới Thiệu Lập Trình
}
Hàm – Không Có Tham Số
void square() {
for (int i = 3; i > 0; i--) {
for (int j = 3; j > 0; j--)
cout << "*";
cout << endl;
} cout << endl;
}
int main() {
int soLuong; cin >> soLuong; for (int i = soLuong; i > 0; i--) square(); return 0;
18
Giới Thiệu Lập Trình
}
Hàm – Có Tham Số
void square(char c) {
for (int i = 3; i > 0; i--) {
for (int j = 3; j > 0; j--)
cout << c;
cout << endl;
} cout << endl;
} int main() {
int soLuong; cin >> soLuong; char c; cin >> c; for (int i = soLuong; i > 0; i--) square(c); return 0;
19
Giới Thiệu Lập Trình
}
Hàm – Nhiều Tham Số
void square(char c, int n) {
for (int i = n; i > 0; i--) {
for (int j = 3; j > 0; j--)
cout << c;
cout << "";
} cout << endl;
} int main() {
const int hang = 3; int cot; cin >> cot; char c; cin >> c; for (int i = hang; i > 0; i--) square(c,cot); return 0;
20
Giới Thiệu Lập Trình
}
Xác Định Loại Tam Giác
(cid:1) Cho độ dài 3 đoạn thẳng, 3 đoạn thẳng này tạo
thành tam giác gì? (cid:1) 3 đoạn thẳng có tạo thành tam giác? (cid:1) 3 đoạn thẳng này có tạo thành tam giác đều? (cid:1) 3 đoạn thẳng này có tạo thành tam giác cân? (cid:1) 3 đoạn thẳng này có tạo thành tam vuông? (cid:1) … (cid:1) 3 đoạn thẳng này có tạo thành tam giác vuông cân?
21
Giới Thiệu Lập Trình
Xác Định Loại Tam Giác tạo thành tam giác
bool laTamGiac(double a, double b, double c) {
return (a < b + c && b < c + a && c < a + b);
}
int main() {
… … … return 0;
22
Giới Thiệu Lập Trình
}
Xác Định Loại Tam Giác tạo thành tam giác đều
bool laTamGiacD(double a, double b, double c) {
return (a == b && b == c);
}
int main() {
… … … return 0;
23
Giới Thiệu Lập Trình
}
Xác Định Loại Tam Giác tạo thành tam giác cân
bool laTamGiacC(double a, double b, double c) {
return (a == b || b == c || c == a);
}
int main() {
… … … return 0;
24
Giới Thiệu Lập Trình
}
Xác Định Loại Tam Giác tạo thành tam giác vuông
bool laTamGiacV(double a, double b, double c) {
double sqrCanhA = a * a; double sqrCanhB = b * b; double sqrCanhC = c * c; return (sqrCanhA == sqrCanhB + sqrCanhC || sqrCanhB == sqrCanhC + sqrCanhA || sqrCanhC == sqrCanhA + sqrCanhB);
}
int main() {
… … … return 0;
25
Giới Thiệu Lập Trình
}
Xác Định Loại Tam Giác tạo thành tam giác vuông cân
bool laTamGiacVC(double a, double b, double c) {
return (laTamGiacV(a, b, c)
&& laTamGiacC(a, b, c));
}
int main() {
… … … return 0;
26
Giới Thiệu Lập Trình
}
Xác Định Loại Tam Giác
(cid:1) Cho độ dài 3 đoạn thẳng, 3 đoạn thẳng này tạo
thành tam giác gì? (cid:1) 3 đoạn thẳng có tạo thành tam giác? (cid:1) 3 đoạn thẳng này có tạo thành tam giác đều? (cid:1) 3 đoạn thẳng này có tạo thành tam giác cân? (cid:1) 3 đoạn thẳng này có tạo thành tam vuông? (cid:1) 3 đoạn thẳng này có tạo thành tam giác vuông cân?
(cid:1) Suy luận lô-gic:
(cid:1) Có cần kiểm tra là tam giác trước khi xác định loại
của tam giác không?
27
Giới Thiệu Lập Trình
Nhập 2 Số Nguyên Dương
int main() {
int a, b; do { cin >> a; } while (a <= 0); do { cin >> b; } while (b <= 0); return 0;
28
Giới Thiệu Lập Trình
}
Nhập 2 Số Nguyên Dương
void nhapSoND(int soND) {
do { cin >> soND; } while (soND <= 0);
} int main() {
int a, b; nhapSoND(a); nhapSoND(b); return 0;
(cid:1) Chương trình chạy không đúng, giá trị nhập vào không được gán cho biến, các biến chưa được nhập dữ liệu (cid:1) Do cách truyền tham số chưa đúng
29
Giới Thiệu Lập Trình
}
Truyền Tham Số Cho Hàm
(cid:1) Truyền giá trị:
(cid:1) Bản sao giá trị của biến được truyền vào hàm (cid:1) Hàm xử lý dữ liệu trên bản sao này (cid:1) Không làm thay đổi giá trị của biến truyền vào hàm (cid:1) Dùng trong trường hợp tính toán
(cid:1) Truyền tham chiếu
(cid:1) Hàm xử lý dữ liệu của chính biến truyền vào hàm (cid:1) Có thể thay đổi giá trị của biến (cid:1) Dùng trong trường hợp cẩn chuyển dữ liệu sau khi đã xử lý ra ngoài hàm, cho các hàm khác sử dụng
30
Giới Thiệu Lập Trình
Truyền Tham Số Cho Hàm truyền giá trị
void nhapSoND(int soND) {
do { cin >> soND; } while (soND <= 0);
} int main() {
int a; nhapSoND(a); return 0;
(cid:1) Bản sao giá trị của biến a được tạo ra và truyền (cid:1) Vào trong hàm nhapSoND, giá trị này được gán cho
biến soND
(cid:1) Thay đổi giá trị biến soND trong hàm nhapSoND, (cid:1) Kết thúc hàm nhapSoND, giá trị của biến soND thay đổi (cid:1) Nhưng giá trị biến a không thay đổi
31
Giới Thiệu Lập Trình
}
Truyền Tham Số Cho Hàm truyền tham chiếu
void nhapSoND(int & soND) {
do { cin >> soND; } while (soND <= 0);
} int main() {
int a; nhapSoND(a); return 0;
(cid:1) Chính biến a được truyền vào trong hàm nhapSoND (cid:1) Nhưng được lưu dưới một tên khác (soND) trong hàm
}
nhapSoND
(cid:1) Thay đổi giá trị biến soND trong hàm nhapSoND (cid:1) Sẽ làm thay đổi giá trị biến a ở trong hàm main (cid:1) Do thực chất là một biến, với tên khác nhau, trong hàm
main là a, trong hàm nhapSoND là soND
32
Giới Thiệu Lập Trình
Hàm – Tính Nhân (Trả Về void) sử dụng truyền tham chiếu tich
void multiply(int x, int y, int & ketQua) {
ketQua = 0; for (int i = x; i > 0; i--) ketQua = ketQua + y;
}
int main() {
int a, b, tich; cin >> a >> b; multiply(a, b, tich); cout << "tich 2 so la: " << tich; return 0;
33
Giới Thiệu Lập Trình
}
Một Số Nguyên Tắc
(cid:1) Tất cả các hàm trong C++ đều ngang cấp
(cid:1) Hàm không được khai báo lồng với nhau (cid:1) Thứ tự khai báo không quan trọng
(cid:1) Hàm có thể nhận và xử lý nhiều tham số hoặc
không có tham số nào
(cid:1) Hàm có thể trả về một (hoặc không ) giá trị (cid:1) Phải truyền đầy đủ số lượng tham số và đúng
kiểu khi gọi hàm, nếu không sẽ lỗi dịch
34
(cid:1) Biến khai báo trong hàm nào chỉ có phạm vi trong hàm đó, không sử dụng được những biến này trong các hàm khác Giới Thiệu Lập Trình
Quy Tắc Phạm Vi
(cid:1) Phạm vi được xác định bắt đầu từ { đến }
(cid:1) Được áp dụng ở hàm (định nghĩa hàm), các cấu trúc
điều khiển (thân cấu trúc) và các khối lệnh { } (cid:1) Biến được khai báo trong phạm vi nào chỉ có
thể được sử dụng trong phạm vi đó
(cid:1) Kết thúc một phạm vi (}), tất cả các biến vừa được khai báo trong phạm vi đó sẽ bị xóa (cid:1) Có thể khai báo các biến cùng tên trong các
phạm vi khác nhau
(cid:1) Các biến này là biến cục bộ
(cid:1) Duy trì điều khiển trong nội bộ phạm vi
35
Giới Thiệu Lập Trình
Quy Tắc Phạm Vi
(cid:1) Phạm vi toàn cục
(cid:1) Biến được khai báo ở bên ngoài main, và ngoài tất
cả các hàm
(cid:1) Biến này sẽ được hiểu và có thể dùng ở mọi nơi
trong chương trình
(cid:1) Hạn chế dùng, dễ gây lỗi không đáng có khi thay đổi
giá trị biến không cẩn thẩn
(cid:1) Thường khai báo hằng số có phạm vi toàn cục để
mọi hàm đều hiểu
36
Giới Thiệu Lập Trình
Tham Khảo
(cid:1) Đọc sách:
(cid:1) Chương 4, Lập Trình Cơ Bản C++
37
Giới Thiệu Lập Trình