Bài giảng Kỹ thuật lập trình C/C++ - Chương 8: Hàm cung cấp cho người học các kiến thức: Lý do sử dụng hàm, hàm main và hàm thư viện, sử dụng hàm tự tạo, prototype của hàm, chữ ký hàm, quá tải hàm, kiểu truyền tham số,... Mời các bạn cùng tham khảo.
Chương 06 HÀM Lê Thành Sách Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Nội dung n n n n Hàm gì? Lý sử dụng hàm Hàm main hàm thư viện Sử dụng hàm tự tạo n n n n n n n n n n Định nghĩa Gọi hàm Nguyên tắc thực thi cho lời gọi hàm Prototype hàm, chữ ký hàm, tải hàm Kiểu truyền tham số Hàm mảng, trỏ Hàm inline Con trỏ hàm Hàm đệ quy Tạo thư viện hàm n Liên kết tĩnh động Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Hàm gì? n Hàm n n n Một đơn vị xử lý Một chuỗi lệnh có liên quan, thực để hồn thành cơng việc Ví dụ: thư viện n Hàm sin(x) n Là chuỗi lệnh tính tốn để tính giá trị sin góc x truyền vào, góc x có đơn vị tính radian; hàm sin(x) trả số thực n Hàm sqrt(x) n Là chuỗi lệnh tính tốn để tính bậc đại lượng x truyền vào, đại lượng x có đơn vị tính số thực (float hay double); hàm sqrt trả số thực Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Hàm gì? n Hàm n n Một đơn vị tính tốn n Nhận giá trị đầu vào n Tính tốn n Trả giá trị Minh hoạ Các giá trị đầu vào Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Chuỗi lệnh hàm Các giá trị đầu Lập trình C/C++ https://fb.com/tailieudientucntt Hàm gì? n Minh hoạ Vào: x (radian) Tính sin(x) Ra: sin(x) Vào: x (số thực) Tính sqrt(x) Ra: sqrt(x) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Hàm gì? n Minh hoạ cho hàm cộng hai số n n n Vào: hai số a b kiểu số thực Tính tốn: phép cộng hai số Ra: tổng hai số Vào: • Số thực a • Số thực b Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Tính tổng Trả tổng Ra: (a + b) Lập trình C/C++ https://fb.com/tailieudientucntt Lý sử dụng hàm n Tránh lặp lại mã nguồn n n n è Tiết kiệm thời gian phát triển è Thay đổi đoạn mã nguồn hàm nhanh dễ dàng, nơi Sử dụng lại đơn vị tính tốn mà khơng phải viết lại n n n Tiết kiệm thời gian phát triển Có thể chia đơn vị tính tốn khơng cho dự án mà cho nhiều dự án Ví dụ: xem xét trường hợp mà dự án viết lại hàm toán học: sin(x), sqrt(x), v.v è tốn lãng phí n è sử dụng thư viện Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Lý sử dụng hàm n Giúp cho việc phát triển giải thuật, việc tổ chức chương trình dễ dàng n Giải thuật: n Một kỹ thuật giải vấn đề là: phân rã toán lớn thành toán n è Mỗi toán đơn vị tính tốn (là hàm) n Ví dụ: tốn cho nhập dãy số, tính tốn in giá trị trung bình độ lệch chuẩn Có thể phân rã thành toán n (1) Nhập dãy số n (2) Tính tốn giá trị trung bình độ lệch chuẩn n (3) In dãy số giá trị trung bình độ lệch chuẩn Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Lý sử dụng hàm n Giúp cho việc phát triển giải thuật, việc tổ chức chương trình dễ dàng n Giải thuật: n Ví dụ: tốn cho nhập dãy số, tính tốn in giá trị trung bình độ lệch chuẩn Có thể phân rã thành tốn n (1) Nhập dãy số n (2) Tính tốn giá trị trung bình độ lệch chuẩn n (3) In dãy số giá trị trung bình độ lệch chuẩn n è Mỗi toán viết thành hàm riêng Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Lý sử dụng hàm n Giúp cho việc phát triển giải thuật, việc tổ chức chương trình dễ dàng n Tổ chức chương trình: n Nếu chương trình (ngơn ngữ C) so sánh với sách (Ngôn ngữ Tiếng việt) n Có sách thực tế mà tác giả viết toàn sách thành câu nối tiếp nhau; không phân chương, phần, phần con, đoạn hay khơng? n Hàm có ý nghĩa tương tự chương, phần chương Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán CuuDuongThanCong.com © 2016 Lập trình C/C++ 10 https://fb.com/tailieudientucntt Con trỏ hàm Truyền trỏ tham số - dùng thông số void print_list1( Student *list, int size, PrintStudentPtr print_ptr){ for(int i=0; i< size; i++) print_ptr(list[i]); } void print_list2( Student *list, int size, void (*print_ptr)(Student)){ for(int i=0; i< size; i++) print_ptr(list[i]); } Đều gọi hàm theo trỏ hàm thông thường Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 93 https://fb.com/tailieudientucntt Con trỏ hàm Truyền trỏ tham số - dùng thông số #include #include typedef struct{ char code[5]; char name[20]; float gpa; } Student; typedef void (*PrintStudentPtr)(Student); void print_one_row(Student student); void print_list1(Student *list, int size, PrintStudentPtr print_ptr); void print_list2(Student *list, int size, void (*print_ptr)(Student)); Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 94 https://fb.com/tailieudientucntt Con trỏ hàm Truyền trỏ tham số - dùng thông số int main(){ Student aList[] = { {"001", "Nguyen Thanh An", 9.8f}, {"002", "Tran Van Binh", 7.5f}, {"003", "Le Tan Cong", 6.7f}, }; PrintStudentPtr func_ptr = print_one_row; print_list1(aList, 3, func_ptr); printf("\n"); print_list2(aList, 3, func_ptr); printf("\n\n"); system("pause"); return EXIT_SUCCESS; } Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 95 https://fb.com/tailieudientucntt Con trỏ hàm Truyền trỏ tham số - dùng thông số Kết xuất hình Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 96 https://fb.com/tailieudientucntt Con trỏ hàm Mảng trỏ hàm PrintStudentPtr func_arr_ptr[10]; void (*print_ptr[10])(Student); Khi sử dụng tên kiểu PrintStudentPtr Khi không sử dụng tên kiểu PrintStudentPtr func_arr_ptr print_ptr mảng 10 trỏ hàm Sử dụng mảng mảng kiểu liệu khác Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 97 https://fb.com/tailieudientucntt Hàm đệ quy n Hàm đệ quy hàm gọi lại n n Trực tiếp: n foo() gọi foo() trực tiếp thân hàm foo() Gán tiếp: n foo() gọi bar, bar gọi foo(); qua nhiều trung gian hàm khác Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 98 https://fb.com/tailieudientucntt Hàm đệ quy n Ví dụ n n Chương trình tính tổng 1+2+3+ + N Hàm tong(N) gọi lại tong(N-1) int tong(int N){ int ket_qua; if(N