TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THỰC PHẨM TP.HCM KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ PHẦN MỀM Giáo trình KỸ THUẬT LẬP TRÌNH NÂNG CAO (Dành cho hệ Đại học) TP.HCM, tháng 9 năm 2013 1 MỤC LỤC CHƯƠNG 1. TỔNG QUAN KỸ THUẬT LẬP TRÌNH.1 Tổng quan về kỹ thuật lập trình .1 Phong cách lập trình .2 Một số kỹ thuật và phong cách lập trình căn bản.2 Phân tích đánh giá giải thuật .1 Sự cần thiết phân tích thuật giải .2 Thời gian thực hiện của chương trình .3 Tỷ suất tăng và độ phức tạp của thuật toán .4 Cách tính độ phức tạp . KỸ THUẬT XỬ LÝ MẢNG .1 Kỹ thuật xử lý mảng một chiều .1 Thuật toán lặp tổng quát.2 Thuật toán tính tổng và tích.3 Thuật toán đếm .4 Thuật toán tìm phần tử đầu tiên .5 Thuật toán tìm tất cả các phần tử.6 Thuật toán tìm min, max .7 Thuật toán sắp xếp .2 Kỹ thuât xử lý mảng hai chiều .1 Mảng hai chiều (ma trận) .2 Thuật toán cơ bản trên mảng hai chiều .3 Ma trận vuông.4 Một số bài toán đặc biệt . KỸ THUẬT ĐỆ QUY .1 Đệ quy tuyến tính (Linear Recursion) .2 Đệ quy nhị phân (Binary Recursion) .3 Đệ quy phi tuyến (NonLinear Recursion).5 Đệ quy tương hỗ (Mutual Recursion) .6 Những ưu nhược điểm của kỹ thuật đệ quy .3 Các bước tìm giải thuật đệ quy cho một bài toán .1 Thông số hóa bài toán .2 Tìm các trường hợp cơ bản (phần cơ sở) cùng giải thuật tương ứng cho các trường hợp này.3 Phân rã bài toán tổng quát theo phương thức đệ quy .4 Một số bài toán đệ quy thông dụng .1 Bài toán tìm tất cả hoán vị của một dãy phần tử.2 Bài toán sắp xếp mảng bằng phương pháp trộn (Merge Sort) .3 Bài toán chia thưởng .4 Bài toán tháp Hà Nội.1 Khử đệ quy đơn giản bằng vòng lặp.2 Khử đệ quy dùng stack. KỸ THUẬT XỬ LÝ CHUỖI .1 Một số khái niệm .2 Nhập/ xuất chuỗi kí tự.2 Các thuật toán tìm kiếm chuỗi .1 Thuật toán Brute Force .2 Thuật tóan Knuth – Morris – Pratt.3 Thuật tóan Boyer Moore . THIẾT KẾ THUẬT TOÁN .1 Kỹ thuật chia để trị - Divide to Conquer .2 Một số bài toán minh họa.2 Kỹ thuật tham ăn – Greedy Technique .1 Giới thiệu bài toán tối ưu tổ hợp .2 Nội dung kỹ thuật tham ăn.3 Một số bài toán minh họa.3 Kỹ thuật nhánh cận - Branch and Bound .2 Bài toán tìm đường đi của người giao hàng .4 Kỹ thuật quy hoạch động - Dynamic programming .2 Một số bài toán minh họa.3 Bài toán ba lô. 107 TÀI LIỆU THAM KHẢO. 118 3 LỜI NÓI ĐẦU “Algorithm + Data structure = Program” (“Giải thuật + Cấu trúc dữ liệu = Chương trình”) Câu nói nổi tiếng của Niklaus Wirth, một nhà khoa học máy tính nổi tiếng, tác giả của ngôn ngữ lập trình Pascal, đã đặt tên cho một cuốn sách của ông. Đây là một trong những quyển sách nổi tiếng, được làm giáo trình giảng dạy ở các trường đại học lớn. Qua đó chúng ta thấy vai trò quan trọng của giải thuật và kỹ thuật lập trình để xây dựng các giải thuật nhằm tìm đáp án tối ưu nhất cho các bài toán lập trình. Môn học Kỹ thuật lập trình nâng cao được bố trí sau 2 môn học Kỹ thuật lập trình và Cấu trúc dữ liệu trong chương trình đào tạo cho sinh viên chuyên ngành Công nghệ thông tin. Môn học nhằm giới thiệu cho sinh viên những kiến thức cơ bản, những kỹ thuật chủ yếu của việc phân tích và xây dựng các giải thuật, để tìm ra các cách giải tối ưu nhất có thể cho bài toán. Các kỹ thuật được trình bày ở đây là những kỹ thuật cơ bản, phổ biến và được các nhà khoa học tin học tổng kết và vận dụng trong cài đặt các chương trình. Việc nắm vững các kỹ thuật đó sẽ rất bổ ích cho sinh viên khi phải giải quyết một vấn đề thực tế. Nội dung giáo trình gồm các phần như sau: - Chương 1: Tổng quan kỹ thuật lập trình - Chương 2: Xử lý cấu trúc mảng - Chương 3: Kỹ thuật đệ qui - Chương 4: Xử lý chuỗi - Chương 5: Thiết kế thuật toán Các vấn đề được trình bày chi tiết với những ví dụ rõ ràng. Cuối mỗi chương có phần bài tập được sắp xếp từ cơ bản đến nâng cao giúp sinh viên nắm vững và kiểm tra kiến thức bằng việc giải các bài tập. Chúng tôi mong rằng các sinh viên tự tìm hiểu trước mỗi vấn đề, kết hợp với bài giảng trên lớp của giảng viên và làm bài tập để việc học môn này đạt hiệu quả. Trong quá trình giảng dạy và biên soạn giáo trình này, chúng tôi đã nhận được nhiều đóng góp quý báu của các đồng nghiệp ở Bộ môn Công nghệ Phần mềm cũng như các đồng nghiệp trong và ngoài Khoa Công nghệ Thông tin. Chúng tôi xin cảm ơn và hy vọng rằng giáo trình này sẽ giúp cho việc giảng dạy và học môn “Kỹ thuật lập trình nâng cao” đạt hiệu quả tốt hơn. Chúng tôi hy vọng nhận được nhiều ý kiến đóng góp để giáo trình ngày càng hoàn thiện. Nhóm tác giả 4 CHƯƠNG 1. TỔNG QUAN KỸ THUẬT LẬP TRÌNH 1.1 Tổng quan về kỹ thuật lập trình 1.1 Phong cách lập trình 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 dù 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 không chỉ cho những người khác muốn đọc hiểu nó, mà còn cho chính người lập trình khi muốn chỉnh sửa hoặc cải tiến. Đô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.2 Một số kỹ thuật và phong cách lập trình căn bản. Cách đặt tên biến 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: – 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 chạy trong vòng lặp; x, y dùng làm biến lưu tọa độ, hoặc dùng làm biến đại diện cho các số bất kỳ… Còn những biến lưu trữ dữ liệu khác thì nên đặt gợi nhớ, nhưng tránh dài dòng: biến đếm số lần dùng "count, dem, so_luong…", biến lưu trọng lượng “weight, trong_luong”, 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 ý nghĩa của chúng. Ngược lại đặt tên quá dài như "the_first_number, the_second_number,…" để chỉ các số bất kỳ, sẽ làm dư thừa, rườm rà trong chương trình. – 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 và tên đối tượng mà biến đó lưu trữ. Cho nên tên biến thường là danh từ (tên đối tượng) kèm theo tiền tố mang ý nghĩa kiểu dữ liệu. Giả sử có biến đếm số lần thì ta có thể đặt iNumber, trong đó i là kiểu của dữ liệu, strContent là kiểu chuỗi, CPoint là lớp Point…Có nhiều cú pháp quy ước đặt tên biến, người lập trình có thể chọn cho mình một quy ước thích hợp. Có thể tham khảo một số quy ước trong phần bên dưới. – Theo một quy ước cụ thể: + Cú pháp Hungary: hình thức chung của cú pháp này là thêm tiền tố chứa kiểu dữ liệu vào tên biến.1 bên dưới là một số tiền tố quy ước được nhiều lập trình viên sử dụng. Các công ty phần mềm thường có các quy ước về cách đặt tên biến cho 5 đội ngũ lập trình viên. Tuy nhiên đa số các quy ước này đều dựa trên cú pháp Hungary. Tiền tố Kiểu dữ liệu Ví dụ minh họa b bool bool bEmpty, bChecked ; c char char cInChar, cOutChar ; str/s String string strFirstName, strIn, strOut ; i/n integer int iCount, nNumElement ; li long integer long liPerson, liStars ; f float float fPercent ; d double double dMiles, dFraction ; if Input file stream ifstream ifInFile ; of Output file stream ofstream ofOutFile ; S Struct struct sPoint{…} ; C Class class CStudent,CPerson + Đối với những hằng thì tất cả các ký tự đều viết HOA.1: #define MAXSIZE 100 const float PI = 3.14 ; + Cách đặt tên cho hàm : hàm bắt đầu với ký tự đầu tiên là ký tự viết thường và các ký tự đầu từ phía sau viết hoa, hoặc các từ cách nhau bằng dấu _ (underscore) và không có tiền tố. Tuy nhiên điều này cũng không bắt buộc tùy theo ngôn ngữ lập trình. Ngoài ra hàm có chức năng thực hiện một nhiệm vụ nào đó, cho nên tên chúng là động từ hoặc cụm động từ, thường bắt đầu bằng các động từ chính: get, set, do, is, make… Ví dụ 1. Phong cách viết mã nguồn – Sử dụng tab để canh lề chương trình : khi soạn thảo mã nguồn nên dùng tab với kích thước là 4 hay 8 khoảng cách để canh lề. Thói quen này giúp cho chương trình được rõ ràng và dễ đọc, dễ quản lý. 6 Không nên Nên void docFile (SV a[], int &n) void docFile (SV a[], int &n) { { ifstream in; ifstream in; char* filename="filein.txt"; char* filename = in.txt"; in>>n; in.diem; } } } – Sử dụng khoảng trắng : chương trình sẽ dễ nhìn hơn Không nên Nên int iCount =0 ; int iCount = 0 ; for(int i=0;i<n;i++) for (int i = 0 ; i < n ; i++) { { iCount++; iCount ++; } } cout<<"Ket qua la:"<<iCount; cout << "Ket qua la:" << iCount; – Tránh viết nhiều lệnh trên một dòng. Không nên Nên if(a>5){b=a; a++} if ( a > 5) { b = a; a ++; } – Định nghĩa các hằng số. 7 Một số lập trình có thói quen không định nghĩa những hằng số thường xuyên sử dụng.
Giáo Trình Kỹ Thuật Lập Trình Nâng Cao Tại Trường Đại Học Công Nghiệp Thực Phẩm TP.HCM
Giáo trình kỹ thuật lập trình nâng cao tại trường ĐH Công nghiệp Thực phẩm TP HCM cung cấp kiến thức chuyên sâu và ứng dụng thực tiễn.
Trường đại học
Trường Đại Học Công Nghiệp Thực Phẩm TP.HCMChuyên ngành
Công Nghệ Thông TinNgười đăng
Ẩn danhThể loại
Giáo TrìnhPhí lưu trữ
35 PointMục lục chi tiết
THÔNG TIN CHI TIẾT
Trường học: Trường Đại Học Công Nghiệp Thực Phẩm TP.HCM
Chuyên ngành: Công Nghệ Thông Tin
Đề tài: Giáo Trình Kỹ Thuật Lập Trình Nâng Cao
Loại tài liệu: Giáo Trình
Năm xuất bản: 2013
Địa điểm: TP.HCM
Tài liệu "Giáo Trình Kỹ Thuật Lập Trình Nâng Cao Tại Trường ĐH Công Nghiệp Thực Phẩm TP.HCM" cung cấp một cái nhìn sâu sắc về các kỹ thuật lập trình nâng cao, giúp sinh viên và những người đam mê công nghệ thông tin nâng cao kỹ năng lập trình của mình. Nội dung giáo trình không chỉ bao gồm lý thuyết mà còn có các bài tập thực hành, giúp người đọc áp dụng kiến thức vào thực tế.
Đặc biệt, tài liệu này còn mở ra cơ hội cho người học tìm hiểu thêm về các thuật toán và ứng dụng của chúng trong lập trình. Để mở rộng kiến thức của bạn, bạn có thể tham khảo tài liệu Thuật toán giải một số lớp bài toán cân bằng và điểm bất động, nơi bạn sẽ tìm thấy các phương pháp giải quyết bài toán phức tạp. Ngoài ra, tài liệu Lý thuyết đồ thị và ứng dụng trong bài toán tìm đường đi ngắn nhất full 10 điểm sẽ giúp bạn hiểu rõ hơn về cách tối ưu hóa trong lập trình. Cuối cùng, tài liệu Algorithms design techniques and analysis sẽ cung cấp cho bạn những kỹ thuật thiết kế và phân tích thuật toán hiệu quả.
Những tài liệu này không chỉ bổ sung cho kiến thức lập trình của bạn mà còn mở ra nhiều hướng đi mới trong nghiên cứu và ứng dụng công nghệ thông tin.
Trích đoạn nội dung tài liệu
Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ