Bài giảng Lập trình nâng cao - Chương 4: Hàm cung cấp cho người học các kiến thức: Mục đích sử dụng, cách sử dụng, cơ chế truyền tham số, biến địa phương và tổ chức bộ nhớ, hàm đệ quy. Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1Hàm Lập trình nâng cao
Trang 3– Chia bài toán lớn thành các bài toán nhỏ hơn – Tách khái niệm ra khỏi cài đặt
• Bạn có phải biết code của hàm sqrt()?
Ø Chương trình dễ hiểu hơn – Tránh code lặp đi lặp lại
Ø Lập trình có cấu trúc – structured programming
Trang 4thành các thư viện math, iostream, stdlib…
Trang 5Các tham số à hàm à giá trị trả về
Trang 6Hàm đặt sau main cần có funcpon prototype đặt trước
int absolute( int x); // function prototype
Trang 7Hàm đặt trước không cần prototype
int absolute( int x) { // function definition
Trang 9int absolute( int x);
<return type> <funcpon name>(<parameter list>);
Trang 13Cấu trúc bộ nhớ
Trang 14các thanh ghi
Trang 17phân một không gian bộ nhớ riêng
– Hệ điều hành ánh xạ một phần bộ nhớ logic với bộ nhớ vật lý
– Địa chỉ trong các không gian khác nhau là độc lập
Trang 18Biến và các lời gọi hàm
Trang 20khối lệnh đó
Trang 21Biến trong vùng bộ nhớ của lời gọi hàm – stack frame
Lower address
Stack frame của f()
p2
b
a Return address
p1
Đáy stack
Đỉnh stack
Trang 22Lower address
p2
b
a Return address
p1
Đáy stack
Đỉnh stack
Trang 23Lower address
p2
b
a Return address
p1
Đáy stack
Đỉnh stack
Trang 24Funcpon call stack (Stack frame cho lời gọi hàm)
Lower address
Stack memory Frame for main()
Trang 25Lower address
Stack memory Frame for main()
Trang 26int main() { a();
return 0;
} int a() { b();
c();
return 0;
} int b() {return 0;}
int c() {return 0;}
Higher address
Lower address
Stack memory
Frame for main()
main()
gọi a()
Frame for a()
Trang 27Lower address
Stack memory
Frame for main() Frame for a()
Trang 28int main() { a();
return 0;
} int a() { b();
c();
return 0;
} int b() {return 0;}
int c() {return 0;}
Higher address
Lower address
Stack memory
Frame for main()
a() gọi b()
Frame for a()
Frame for b()
Trang 29int main() { a();
return 0;
} int a() { b();
c();
return 0;
} int b() {return 0;}
int c() {return 0;}
Higher address
Lower address
Stack memory
Frame for main()
b() trả về
Frame for a()
Trang 30Lower address
Stack memory
Frame for main() Frame for a()
Trang 31int main() { a();
return 0;
} int a() { b();
c();
return 0;
} int b() {return 0;}
int c() {return 0;}
Higher address
Lower address
Stack memory
Frame for main()
a() gọi c()
Frame for a()
Frame for c()
Trang 32int main() { a();
return 0;
} int a() { b();
c();
return 0;
} int b() {return 0;}
int c() {return 0;}
Higher address
Lower address
Stack memory
Frame for main()
c() trả về
Frame for a()
Trang 33Lower address
Stack memory
Frame for main() Frame for a()
Trang 34int main() { a();
return 0;
} int a() { b();
c();
return 0;
} int b() {return 0;}
int c() {return 0;}
Higher address
Lower address
Stack memory
Frame for main()
a() trả về
Trang 35Cơ chế truyền tham số
Trang 36Đỉnh stack Frame for
main()
Trang 37Đỉnh stack
t : ??
Frame for main()
Frame for my_swap()
Trang 38Đỉnh stack
t : 2
Frame for main()
Frame for my_swap()
Trang 39Đỉnh stack
t : 2
Frame for main()
Frame for my_swap()
Trang 40Đỉnh stack
t : 2
Frame for main()
Frame for my_swap()
Trang 41Đỉnh stack
Frame for main()
Frame for my_swap() no longer exists
Trang 42Đỉnh stack
Frame for main()
Frame for my_swap() no longer exists
Trang 45Đối số / Tham số Tham trị / Tham biến
int main() { int a = 2;
int b = 3;
g(b);
}
Trang 46
f không được sửa x, g không được sửa y
Trang 47
Nên dùng const cho tất cả các tham số
không nên bị sửa giá trị
Lý do: đề phòng lỗi của lập trình viên
Trang 50Chỉ áp dụng được cho các tham số cuối
Trang 51Hàm đệ quy
Trang 52}
Trang 53}
Trang 54}
Trang 55Frame for swap()
Trang 56Đỉnh stack
Frame for swap()
Trang 57Đỉnh stack
Frame for swap()
x = 3
Trang 58Đỉnh stack
Frame for swap()
x = 3 factorial(2)
x = 2
Trang 59Đỉnh stack
Frame for swap()
x = 3 factorial(2)
x = 2 factorial(1)
x = 1
Trang 60factorial(4)
x = 4 factorial(3)
x = 3 factorial(2)
x = 2
Trang 61Đỉnh stack
Frame for swap()
x = 3
Return 2
Trang 62Đỉnh stack
Frame for swap()
Trang 63Frame for swap()
main() res = 24
Trang 64Tìm kiếm nhị phân đệ quy
Trang 65• Tìm từ 0 đến 8
Trang 69hŒp://www.drdobbs.com/security/anatomy-of-a-stack-smashing-aŒack-and-h/240001832
Trang 70• f(n): số bước chuyển n đĩa từ cọc này -> cọc khác
Trang 71• factorial(n) = factorial(n-1) * n
Trang 72• factorial(n) = factorial(n-1) * n
Trang 73• factorial(n) = factorial(n-1) * n
• Tháp Hà Nội f(n) = f(n-1) …
• move(n-1, 1, 2)
Trang 74• factorial(n) = factorial(n-1) * n
Trang 75• factorial(n) = factorial(n-1) * n
Trang 76}
Trang 80C(N) = C(N-1) + ([N] + s), với mọi s thuộc C(N-1) Combinapon(“abc”, 3) -> in ra 8 kết quả