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á...
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:
- bai_giang_gioi_thieu_lap_trinh_ham_co_ban_le_nguyen_khoi.pdf