Ellis Horowitz, Sartaj Sahni, Fundamentals of Data Structures , ebook, 1981.. Naimipour , Foundations of Algorithms Using C++.[r]
Trang 1Giáo trình
Kỹ thuật lập trình 2
Trang 2MỤC LỤC
Mục lục 1
Lời nói đầu 3
Chương 1 Một số kỹ thuật – phong cách lập trình tốt 4
1.1 Cách đặt tên cho biến hàm 4
1.2 Phong cách viết mã nguồn 6
1.3 Tối ưu sự thực thi mã nguồn 8
Chương 2 Kỹ thuật đệ quy 16
2.1 Kỹ thuật đệ quy 16
2.2 Xây dựng một chương trình đệ quy 20
2.3 Các ví dụ đệ quy 21
2.4 Khử đệ quy 27
2.4.1 Tìm hiểu cơ chế thực hiện hàm đệ quy 27
2.4.2 Các trường hợp khử đệ quy đơn giản 29
2.4.3 Khử đệ quy dùng stack 31
Chương 3 Bài toán liên quan tổ hợp 37
3.1 Phương pháp sinh (kế tiếp) 37
3.1.1 Bài toán sinh dãy nhị phân độ dài n 37
3.1.2 Bài toán liệt kê tập con k phần tử 39
3.1.3 Bài toán liệt kê các hoán vị 42
3.2 Thuật toán quay lui (Back Tracking) 45
3.2.1 Thuật toán quay lui liệt kê dãy nhị phân n 47
3.2.2 Thuật toán quay lui liệt kê tập con k phần tử 48
3.2.3 Thuật toán quay lui liệt kê hoán vị n phần tử 50
3.2.4 Bài toán sắp xếp quân Hậu 51
3.2.5 Bài toán mã đi tuần 57
Chương 4 Tìm kiếm và Sắp xếp 63
4.1 Tìm kiếm 63
4.1.1 Mô tả bài toán tìm kiếm trong tin học 63
4.1.2 Tìm kiếm tuyến tính 64
4.1.3 Tìm kiếm nhị phân 65
4.1.4 Kết luận 67
4.2 Bài toán sắp xếp 67
4.3 Một số phương pháp sắp xếp cơ bản 67
4.3.1 Phương pháp chọn 67
4.3.2 Phương pháp sắp xếp nổi bọt 68
4.3.3 Phương pháp sắp xếp chèn 68
4.3.4 Phương pháp đổi chỗ trực tiếp 69
4.3.5 Phương pháp ShellSort 73
4.3.6 Phương pháp phân đoạn QuickSort 76
4.3.7 Phương pháp cơ số RadixSort 80
Chương 5 Stack - Queue 84
5.1 Giới thiệu Stack – ngăn xếp 84
Trang 35.1.3 Các ví dụ minh họa 88
5.2 Giới thiệu Queue – hàng đợi 103
5.2.1 Cài đặt Queue dùng CTDL mảng 105
5.2.2 Các ứng dụng Queue 106
BÀI TẬP 114
TÀI LIỆU THAM KHẢO 121
\[
Trang 4Lời nói đầu
Học phần kỹ thuật lập trình 2 được thiết kế dành cho sinh viên khoa công nghệ thông tin ĐH Kỹ Thuật Công Nghệ, là phần tiếp nối với môn kỹ thuật lập trình 1 Mục đích của môn học là bổ sung những kỹ thuật lập trình đệ quy, khử đệ quy, các bài toán trên tập hợp, phương pháp sinh, kỹ thuật quay lui, tìm kiếm và sắp xếp trên mảng, ngăn xếp và hàng đợi…Song song với phần lý thuyết là các ví
dụ minh họa cụ thể, cho phép sinh viên hiểu rõ vấn đề hơn
Ngoài những kỹ thuật lập trình, giáo trình còn đề cập tới phương diện phong cách lập trình trong chương 1 Việc sớm làm quen với phong cách lập trình
sẽ hỗ trợ sinh viên hoàn thiện kỹ năng viết chương trình
Bài giảng được viết lần đầu tiên nên sẽ không tránh khỏi những sai sót Kính mong sự đóng góp của các giảng viên và sinh viên nhằm hoàn thiện phần bài giảng này trong lần tái bản sau
Tất cả những ý kiến đóng góp điều được trân trọng
Xin chân thành cảm ơn!
Tác giả
Trang 5Chương 1 Một số kỹ thuật – phong cách lập trình tốt
\[
Một chương trình nguồn được xem là tốt không chỉ được đánh giá thông qua thuật giải đúng và cấu trúc dữ liệu thích hợp Mà còn phụ thuộc vào phong cách và kỹ thuật mã hoá (coding) của người viết chương trình
Nếu một người lập trình viết một chương trình tuy thực hiện đúng yêu cầu đặt ra nhưng mã nguồn quá lộn xộn và phong cách lập trình cẩu thả, thì mã nguồn này sẽ gây khó khăn cho chính người lập trình!
Đôi khi người mới lập trình không quan tâm đến vấn đề này do ban đầu chỉ làm việc với chương trình nhỏ Tuy nhiên, vấn đề phát sinh khi họ phải làm việc với dự án lớn
và chương trình lúc này không còn đơn giản vài chục dòng lệnh nữa Nếu không rèn luyện một phong cách và trang bị một số kỹ thuật lập trình tốt thì người lập trình đối mặt với nhiều khó khăn…
Trong chương đầu tiên xin giới thiệu một số kỹ thuật và phong cách lập trình cơ bản, ít nhiều giúp cho người học viết chương trình được tốt hơn
1.1 Cách đặt tên cho biến hàm
Thông thường tùy theo ngôn ngữ và môi trường lập trình, người viết chương trình thường chọn cho mình một phong cách nhất quán trong việc đặt tên các định danh Một
số quy tắc cần quan tâm khi đặt tên như sau:
1 Tên của định danh phải thể hiện được ý nghĩa: thông thường các biến nguyên như i, j, k dùng làm biến lặp; x, y dùng làm biến lưu tọa độ…Còn những biến
lưu trữ dữ liệu khác thì nên đặt gợi nhớ: biến đếm số lần dùng “count” hay So_Luong, biến lưu trọng lượng “weight”, chiều cao “height”…Nếu đặt quá
ngắn gọn như c cho biến đếm, hay w cho khối lượng thì sau này khi nhìn vào chương trình sẽ rất khó hiểu!
2 Tên phải xác định được kiểu dữ liệu lưu trữ: phong cách lập trình tốt là khi người đọc nhìn vào một biến nào đó thì xác định ngay được kiểu dữ liệu mà
Trang 638 Viết chương trình mô phỏng hàng đợi mua vé xe lửa
39 Viết chương trình sắp xếp theo cơ số (RadixSort), trong đó sử dụng cấu trúc dữ liệu queue để lưu tạm trong quá trình sắp xếp Hướng dẫn sử dụng 10 hàng đợi để lưu tạm các con số Gồm hàng đợi 0 đến 9, khi đó hàng đợi 0 sẽ chỉ lưu những
con số có số 0 ở các bước phân hàng đơn vị, hàng chục, hàng trăm tương ứng
\[
Trang 7TÀI LIỆU THAM KHẢO
1 Brian W Kernighan, Rob Pike, The Practice of Programming, Addison
Wesley, 1999
2 Ellis Horowitz, Sartaj Sahni, Fundamentals of Data Structures, ebook, 1981
3 R Neapolitan, K Naimipour , Foundations of Algorithms Using C++ Pseudocode, Jones and Bartlett Publishers , 2004.
4 Lê Hoài Bắc, Nguyễn Thanh Nghị, Kỹ năng lập trình, NXB KHKT, 2005
5 Trần Hoàng Thọ, Giáo trình Kỹ thuật Lập trình Nâng cao, ĐH Đà Lạt, 2002
6 Dương Anh Đức, Trần Hạnh Nhi, Nhập môn Cấu trúc dữ liệu và thuật toán,
ĐH KHTN, 2000
7 Lê Hữu Lập, Nguyễn Duy Phương, Giáo trình kỹ thuật lập trình, NXB Bưu
Điện, 2002
8 Lê Minh Hoàng, Giải thuật và lập trình, NXB ĐH Sư Phạm HN, 1999- 2002
\[