Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
718,5 KB
Nội dung
Chương Hàm (Function) Presenter: Nhập mơn lập trình (C6) Slide Learning outcomes L.O.4.1 – Xác định thành phần hàm L.O.4.2 – Hiện thực giải thuật dạng hàm L.O.4.3 – Giải thích kiểu truyền tham số C L.O.4.4 – Tổ chức chương trình lớn, gồm nhiều hàm L.O.3.5 – Hiện thực giải thuật đệ quy ngôn ngữ C hiểu nguyên tắc hoạt động Nhập mơn lập trình (C6) Slide Tổ chức chương trình C Cấu trúc module Tiền xử lý: Mô tả module # Khai báo / định nghĩa Hàm Hàm Hàm Nhập mơn lập trình (C6) • #include • #define Khai báo / định nghĩa: • • • • Hằng Biến Hàm/biến extern Mơ tả hàm Các hàm: • main chạy • Định nghĩa ngang cấp, khơng lồng • Được gọi chạy Slide Hàm gì ? Hàm phương tiện phân chia code module nhiều đơn vị nhỏ để dễ quản lý sửa chữa Một dự án/giải pháp/chương trình = tập hợp N module Một Module = tập hợp N hàm Nhập môn lập trình (C6) Slide Hàm gì ? Hàm (function) tách ứng dụng thành đơn vị độc lập Câu lệnh thân hàm • viết lần • dùng nhiều nơi ứng dụng • che giấu hàm khác Kinh nghiệm: • Một phương thức thực tác vụ • Tên phương thức cần thể tác vụ Nhập mơn lập trình (C6) Slide Hàm gì ? Phải chia thành toán nhỏ đơn giản • Kỹ thuật chia để trị (divide-and-conquer) Hoặc tái sử dụng phương thức sẵn có (đã viết) vào ứng dụng • Tái sử dụng phần mềm (reusability) Tránh việc viết đoạn mã hai lần Dễ sửa lỗi bổ sung tính sau Nhập mơn lập trình (C6) Slide Hàm gì ? Khối lệnh: tập hợp lệnh VD 1: if (delta > 0) { x1 = (-b + sqrt(delta))/(2*a); x2 = (-b - sqrt(delta))/(2*a); } VD 2: for (int i = 0; i < 10; i++) { temp = i*i; sum += temp; } Nhập mơn lập trình (C6) Slide Hàm gì ? Hàm tập hợp câu lệnh, • Có tên • Có tham số • Có giá trị trả VD float { } average(float a, float b) float val; val = (a + b) /2; return val; Nhập môn lập trình (C6) Slide Hàm gì ? void main() { float x1, x2, x3, x4; printf("Input x1, x2, x3, x4: "); scanf("%f %f %f %f", &x1, &x2, &x3, &x4); printf("Average of x1, x2: %f\n", (x1+x2)/2); printf("Average of x3, x4: %f\n", (x3+x4)/2); } Nhập mơn lập trình (C6) Slide Hàm gì ? float average(float a, float b){ float val; val = (a + b) /2; return val; } void main() { float x1, x2, x3, x4, ave1, ave2; printf("Input x1, x2, x3, x4: "); scanf("%f %f %f %f", &x1, &x2, &x3, &x4); ave1 = average(x1, x2); ave2 = average(x3, x4); printf("Average of x1, x2: %f\n", ave1); printf("Average of x3, x4: %f\n", ave2); } Nhập môn lập trình (C6) Slide 10 Trùn tham sớ void main() { giaiptbac2(); giaiptbac2(); } Nhập mơn lập trình (C6) Slide 31 Truyền tham số void giaiptbac2(float a, float b, float c){ float delta = b*b - 4*a*c, x1, x2; if(delta == 0) { x1 = -b/(2*a); x2 = -b/(2*a); printf("Phuong trinh co nghiem kep x = %f\n", x1); } else if(delta > 0){ x1 = (-b + sqrt(delta))/(2*a); x2 = (-b - sqrt(delta))/(2*a); printf("Phuong trinh co nghiem x1 = %f, x2 = %f\n", x1, x2); } else printf("Phuong trinh vo nghiem\n"); } Nhập mơn lập trình (C6) Slide 32 Truyền tham số void main() { giaiptbac2(2, 7, 4) ; } Nhập mơn lập trình (C6) Slide 33 Truyền tham sô void main() { giaiptbac2(2, 3*8-7, 4) ; } Nhập mơn lập trình (C6) Slide 34 Truyền tham sô void main() { float x = 1, y = 7, z =2; giaiptbac2(x, y, z) ; } Nhập mơn lập trình (C6) Slide 35 Trùn tham sô void main() { float x = 1, y = 7, z =2; giaiptbac2(2*x + 1, + y, z) ; } Nhập mơn lập trình (C6) Slide 36 Truyền tham sô void main() { float a, b, c; printf("Nhap a, b, c: "); scanf("%f %f %f", &a, &b, &c); giaiptbac2(a, b, c) ; } Nhập môn lập trình (C6) Slide 37 Trùn tham sơ void main(){ float a, b, c; printf("Nhap a, b, c: "); scanf("%f %f %f", &a, &b, &c); giaiptbac2(a*2 + 1, b + 5, c) ; giaiptbac2(1, 2, 1) ; } Nhập môn lập trình (C6) Slide 38 Hàm có sẳn C hổ trợ rất nhiều hàm thư viện hàm có sẳn: • • • • • stdio.lib conio.lib string.lib math.lib Tham khảo HELP của VC++ Nhập môn lập trình (C6) Slide 39 Hàm đệ qui Định nghĩa Hàm mà thân hàm có gọi lại gọi hàm đệ qui Một toán muốn xử lý theo dạng hàm đệ qui phải đưa dạng : Fn(x) = G(Fn-1(x)) Ví dụ : n! = n * (n-1)! S(n) = n + S(n-1) Fibo(n) = Fibo(n-1) + Fibo(n-2) Nếu có hàm A, B mà hàm A có gọi hàm B hàm B có gọi lại A gọi đệ qui tương hổ Nhập mơn lập trình (C6) Chương 5 : Lặp & đệ qui Slide 40 Hàm đệ qui Ví dụ tính ex Hàm ex tính theo triển khai Maclaurin: ex = + x1/1! + x2/2! + + xn-1/(n-1)! + xn/n! viết lại thành: ex(n) = ex(n-1) + xn/n! Ngoài ra, hàm xn n! tính đệ qui xn = xn-1 x n! = (n-1)! n Trong đó, n giảm dần lần gọi đệ qui ta cần kiểm soát trở hàm điều kiện ban đầu • ex(0) = : n=0 trả trị • x0 = : n=0 trả trị • 1! = : n=1 trả trị Nhập mơn lập trình (C6) Chương 5 : Lặp & đệ qui Slide 41 Hàm đệ qui Các hàm đệ qui Nhập mơn lập trình (C6) Slide 42 Bài toán tháp Hà nội Chuyển chồng đĩa từ cột A sang cột C, cột B trung gian • Mỗi lần chuyển đĩa • Đĩa nhỏ nằm đĩa lớn A Nhập mơn lập trình (C6) B C Slide 43 Phân tích giải thuật Hành động chuyển chồng n đĩa từ cột A sang cột C (cột B trung gian) phân tích thành hành động sau : • Chuyển chồng n-1 đĩa từ cột A sang cột B (cột C trung gian) • Chuyển đĩa từ cột A sang cột C • Chuyển chồng n-1 đĩa từ cột B sang cột C (cột A trung gian) Nhập mơn lập trình (C6) Slide 44 Hàm inline Hàm inline hàm không dùng cách gọi thơng thường mà chuơng trình dịch thay gọi hàm thân hàm vào chỗ gọi Ví dụ Nhập mơn lập trình (C6) Slide 45 ... Nhập mơn lập trình (C6) Slide 32 Trùn tham sớ void main() { giaiptbac2(2, 7, 4) ; } Nhập môn lập trình (C6) Slide 33 Trùn tham sơ void main() { giaiptbac2(2, 3*8-7, 4) ; } Nhập môn lập trình. .. } Nhập mơn lập trình (C6) Slide 11 Các vấn đề của hàm Khai báo hàm extern Mô tả trước Hàm Định nghĩa hàm Định nghĩa biến Lệnh thực thi Gọi hàm Truyền tham số hàm Trực... nghiem
"); } Nhập môn lập trình (C6) Slide 16 Gọi hàm void main() { giaiptbac2(5, -11, 6); float fltA = 7, fltB = -13, fltC = 6; giaiptbac2(fltA, fltB, fltC); } Nhập môn lập trình (C6) Slide 17