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

pdf38 trang | Chia sẻ: thucuc2301 | Lượt xem: 730 | Lượt tải: 0download
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:

  • pdfts_le_nguyen_khoibaigiang05_hamcoban_8964_2032116.pdf