Bài giảng Giới thiệu lập trình - Hàm - cơ bản - Lê Nguyên Khôi

Tóm tắt Bài giảng Giới thiệu lập trình - Hàm - cơ bản - Lê Nguyên Khôi: ...rả 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; }...n() { 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 <...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á...

pdf38 trang | Chia sẻ: havih72 | Lượt xem: 287 | Lượt tải: 1download
Nội dung tài liệu Bài giảng Giới thiệu lập trình - Hàm - cơ bản - Lê Nguyên Khôi, để tải tài liệu về máy 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

File đính kèm:

  • pdfbai_giang_gioi_thieu_lap_trinh_ham_co_ban_le_nguyen_khoi.pdf