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