1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình kỹ thuật lập trình 2

124 1,1K 5
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 124
Dung lượng 4,52 MB

Nội dung

Giáo trình kỹ thuật lập trình 2

Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNMỤC LỤC MỤC LỤC . 1 2 Lời nói đầu 3 Chương 1 . 4 Một số kỹ thuật – phong cách lập trình tốt . 4 0.1 Cách đặt tên cho biến hàm 4 0.2 Phong cách viết mã nguồn 6 0.3 Tối ưu sự thực thi mã nguồn . 8 Kỹ thuật đệ quy . 16 1.1 Kỹ thuật đệ quy . 16 1.2 Xây dựng một chương trình đệ quy 20 1.3 Các ví dụ đệ quy 21 1.4 Khử đệ quy 27 1.4.1 Tìm hiểu cơ chế thực hiện hàm đệ quy . 27 1.4.2 Các trường hợp khử đệ quy đơn giản 29 1.4.3 Khử đệ quy dùng stack 31 Bài toán liên quan tổ hợp 37 2.1 Phương pháp sinh 37 2.1.1 Bài toán sinh dãy nhị phân độ dài n 37 2.1.2 Bài toán liệt kê tập con k phần tử 39 2.1.3 Bài toán liệt kê các hoán vị 42 2.2 Thuật toán quay lui (Back Tracking) 45 2.2.1 Thuật toán quay lui liệt kê dãy nhị phân n 47 2.2.2 Thuật toán quay lui liệt kê tập con k phần tử 48 2.2.3 Thuật toán quay lui liệt kê hoán vị n phần tử 50 2.2.4 Bài toán sắp xếp quân Hậu 51 2.2.5 Bài toán mã đi tuần 57 Tìm kiếm và Sắp xếp . 63 1.1 Tìm kiếm . 63 1.1.1 Mô tả bài toán tìm kiếm trong tin học . 63 1.1.2 Tìm kiếm tuyến tính . 64 1.1.3 Tìm kiếm nhị phân . 65 1.1.4 Kết luận 67 1.2 Bài toán sắp xếp 67 1.3 Một số phương pháp sắp xếp cơ bản 67 1.3.1 Phương pháp chọn . 67 1.3.2 Phương pháp sắp xếp nổi bọt 68 1.3.3 Phương pháp sắp xếp chèn 68 1.3.4 Phương pháp đổi chỗ trực tiếp 69 1.3.5 Phương pháp ShellSort 76 1.3.6 Phương pháp phân đoạn QuickSort 79 1.3.7 Phương pháp cơ số RadixSort 83 Stack - Queue 87 1 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN2.1 Giới thiệu Stack – ngăn xếp 87 2.1.1 Cài đặt Stack dùng CTDL mảng . 88 2.1.2 Các ứng dụng stack 90 2.1.3 Các ví dụ minh họa 91 2.2 Giới thiệu Queue – hàng đợi . 106 2.2.1 Cài đặt Queue dùng CTDL mảng 108 2.2.2 Các ứng dụng Queue 109 BÀI TẬP 117 TÀI LIỆU THAM KHẢO . 124 2 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNLời nói đầuHọ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ả3 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNChương 1Mộ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.0.1 Cách đặt tên cho biến hàmThô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à biến đó 4 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNlưu trữ. Giả sử có biến đếm số lần thì ta có thể đặt iCount, trong đó i là kiểu của dữ liệu, strContent là kiểu chuỗi…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 3 bên dưới.3. Theo một quy ước cụ thể : a. 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. Bảng 1.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 độ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 Minh họab boolean bool bStopc char char cLetterGenrestr/s C++ string string strFirstNamesi short integer short siTablesi/n integer int iCars int nCarsli long integer long liStarsf floating point float fPercentd Double precision floating point double dMilesld long double precision floating pointlong double ldPIsz Null terminated string char szName[NAME_LEN]if Input file stream ifstream ifNameFileis Input stream istream isInputof Output file stream ofstream ofNameFileos Output stream ostream osOutS Struct struct sPoint {…}C Class class CStudent {…}w Word word wCharu Unsigned m_ biến thành viên của hàm class CStudent {private:string m_strName;}g_ biến toàn cục string g_strBufflp long pointer LPCTSTR lpszClassName5 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNh handle trong windows HINSTANCE hInstanceBảng 1.1: Minh họa tiền tố của cú pháp Hungary.Đối với những hằng thì tất cả các tự đều viết hoa#define MAXSIZE 100const int MAXLENGTH 200Cách đặt tên cho hàm: hàm bắt đầu với tự đầu tiên là tự hoa và không có tiền tố. Tuy nhiên, điều này cũng không bắt buộc tuỳ theo ngôn ngữ lập trình. Nói chung là hàm có chức năng thực hiện một chức năng nào đó, cho nên chúng thường bắt đầu bằng động từ: get, set, do…CString GetName(); // Microsoft VC++ standardString setName(); // Sun Java standard0.2 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 để canh lề. Thói quen này giúp cho chương trình được rõ ràng và dễ quản lý.for (i = 0;i < N; i++) {if (Check(i)) {Action1();Action2();}elseAction3();ActionMain();}for (i = 0; i < N; i++) {if (Check(i)) {Action1();Action2();}elseAction3();ActionMain();}• Sử dụng khoảng trắng : chương trình sẽ dễ nhìn hơn.int count; for(count=0;count<10;count++) { printf(“%d”,count*count+count); }int count; for (count = 0; count < 10; count++) { printf(“%d”, count * count + count); }• Tránh viết nhiều lệnh trên cùng một dòng :if(a>5){b=a;a++;} if (a > 5){6 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN b=a; a++;}• Định nghĩa các hằng số : một thói quen là người lập trình không định nghĩa những hằng số thường xuyên sử dụng. Dẫn đến những con số khó hiểu xuất hiện trong chương trình, một số tài liệu lập trình gọi những con số này là “magic mumber”.…for(int i=0; i < 100; i ++)A[i] = Rand(100);…k = InputNum();j=0;while (A[j] != k && j < 100)j++;…#define MAX_LEN 100#define MAX_NUM 100…for(int i=0; i < MAX_LEN; i++)A[i] = Rand(MAX_NUM);…k = InputNum();j=0;while (A[j] != k && j < MAX_LEN)j++;…Trong đoạn chương trình bên trái rất khó phân biệt giá trị 100 ở ba vị trí có mối quan hệ gì với nhau. Tuy nhiên, trong đoạn bên phải ta dễ dàng thấy được ý nghĩa của từng giá trị khi thay bằng định danh. Ngoài ra khi cần thay đổi giá trị của MAX_LEN, MAX_NUM thì chỉ cần thay một lần trong phần định nghĩa. Do đó đoạn chương trình B dễ nhìn hơn và dễ thay đổi hơn!• Viết chú thích cho chương trình : biến, hàm khi định nghĩa nên viết chú thích ý nghĩa và chức năng rõ ràng. Đôi khi các lệnh thực thi cũng cần có giải thích nếu chúng quá phức tạp.int CheckFactor(int n){/*Ý nghĩa: kiểm tra xem 1 số có phải là nguyên tố hay khôngTham số vào: n số cần kiểm traTham số ra: giá trị trả về0: không phải số nguyên tố1: là số nguyên tố*/….// phần thực hiện của hàm}Ví dụ chú thích cho biếnbyte Image; // buffer ảnhint Rows, Cols; // số dòng, số cột7 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNint r, c; // dòng cột hiện hànhint PixelCount; // tổng số pixelTuy nhiên không phải bất cứ lệnh nào cũng chú thích, việc chú thích tràn lan ngay cả với câu lệnh đơn giản cũng không có ý nghĩa gì. Đôi khi còn làm cho chương trình khó nhìn hơn!• Nên viết biểu thức điều kiện mang tính tự nhiên : biểu thức nên viết dưới dạng khẳng định, việc viết biểu thức dạng phủ định sẽ làm khó hiểu!if ( !(iBlock < Block1 ) || !(iBlock >= Block2))…Mỗi biểu thức trong điều kiện được viết dưới dạng phủ định, ta nên viết lại dưới dạng khẳng định cho dễ hiểu hơn:if ( (iBlock >= Block1 ) || (iBlock < Block2))…• Dùng chính ngôn ngữ đó để tính kích thước của đối tượng : không nên dùng giá trị tường minh cho kích thước của dữ liệu. Khi cần lấy kích thước của biến int, ta có thể dùng sizeof(int) thay cho các giá trị 2 hay 4. Tương tự như vậy khi lấy kích thước của phần tử trong một mảng int ta dùng sizeof(array[0]) thay cho sizeof(int). Sau này khi mảng array có thay đổi kiểu dữ liệu thì cách viết sizeof(array[0]) cũng không ảnh hưởng.0.3 Tối ưu sự thực thi mã nguồnMã nguồn nếu được viết tốt sẽ làm cho tốc độ chương trình cải thiện đáng kể. Có thể ngày nay năng lực xử lý của máy tính khá mạnh, do đó người lập trình không quan tâm đến việc tối ưu mã nguồn. Nhưng cũng không vì thế mà bỏ qua kỹ thuật này. Vậy thế nào là tối ưu mã nguồn? ở đây không đề cập đến giải thuật, vì chắc chắn giải thuật tốt thì sẽ cho chương trình tối ưu. Tuy nhiên, việc cài đặt cũng cần phải có kỹ thuật, nếu không thì chính khả năng cài đặt của lập trình viên làm hạn chế sự thực thi của thuật giải hay chương trình. Mục đích của việc tối ưu mã nguồn là nâng cao tốc độ xử lý và hạn chế không gian bộ nhớ mà chương trình chiếm dụng. Thông thường có thể mâu thuẫn giữa tốc độ và không gian lưu trữ, do đó tuỳ theo điều kiện cụ thể mà người lập trình có thể lựa chọn thích hợp.8 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNTrong phần dưới xin trình bày một số thủ thuật chọn lọc có thể giúp ích để hình thành nên phong cách lập trình tốt cho người đọc. • Thu gọn những biểu thức dùng nhiều lần : nếu một biểu thức tính toán được dùng nhiều lần thì chúng ta nên tính kết quả một lần rồi lưu vào một biến và dùng lại.Ví dụ: F = sqrt(dx*dx+dy*dy) + (sqrt(dx*dx + dy*dy)*sqrt(dx*dx)-sqrt(dy*dy))…Trong dãy biểu thức trên có sqrt(dx*dx+dy*dy), dx*dx, dy*dy được dùng nhiều chỗ, ta có thể tính trước bên ngoài và lưu vào biến tạm để dùng lại sau này. Hạn chế việc tính toán với cùng một biểu thức nhiều lần!• Đưa những biểu thức không phụ thuộc vòng lặp ra ngoài : trong một số vòng lặp ta có sử dụng biểu thức tính toán nhưng giá trị của biểu thức không phụ thuộc vào sự thay đổi của vòng lặp thì có thể đưa biểu thức này ra ngoài.Ví dụ:for(i =0; i < strlen(str); i++)….chuyển thành: int n = strlen(str)for(i =0; i < n; i++)….• Thay thế một biểu thức bằng một biểu thức tương đương nhưng lợi về thực thi : một số chương trình xử lý ảnh đòi hỏi tốc độ cao, thì người lập trình có thể thay thế các phép nhân chia bằng phép dịch chuyển bit. Thay thế sử dụng chỉ mục trong mảng C/C++ bằng con trỏ…Ví dụ: khi so sánh khoảng cách của hai điểm ta thường làm như sauif (sqrt(dx1*dx1+dy1*dy1) < sqrt(dx2*dx2+dy2*dy2))…Thay bằngif ((dx1*dx1+dy1*dy1) < (dx2*dx2+dy2*dy2)) .• Dùng số nguyên thay cho số thực : do việc xử lý số thực chậm hơn xử lý số nguyên nên ta có thể dùng số nguyên thay cho số thực có phần lẻ nhỏ.9 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNVí dụ: điểm trung bình của sinh viên là số thực ta có thể thay bằng số nguyên: DTB là 8.72 thì lưu theo số nguyên 872, khi xuất ra thì chia cho 100.• Loại bỏ vòng lặp : nếu thân vòng lặp đơn giản và số lần lặp cũng không nhiều, ta có thể làm cho đoạn chương trình hiệu quả hơn bằng cách bỏ vòng lặp.Ví dụ: for(i =0; i < 3; i++)A[i] = B[i] + C[i];Thay bằngA[1] = B[1] + C[1];A[2] = B[2] + C[2];A[3] = B[3] + C[3];Đoạn chương trình thay thế loại bỏ vòng lặp, tức là lệnh rẽ nhánh, lệnh rẽ nhánh làm chậm chương trình do ngắt luồng thực thi.Nếu vòng lặp dài và cùng dạng biểu thức ta có thể cải tiến như ví dụ saufor(i=0; i < 3*n; i++)A[i] = B[i] + C[i];Thay bằngfor(i=0; i < 3*n; i+=3) {A[i] = B[i] + C[i];A[i+1] = B[i+1] + C[i+1];A[i+2] = B[i+2] + C[i+2];}Ví dụ trên chỉ áp dụng khi chiều dài vòng lặp là bội số của bước nhảy!• Loại bỏ câu lệnh rẽ nhánh trong vòng lặp : xem ví dụ sauChương trình A Chương trình Bfor i to 1000 do{ x[i] = x[i] + y[i]; if (w) then y[i] = 0;}if (w) then for i to 1000 do { x[i] = x[i] + y[i]; y[i] = 0; } else for i to 1000 do x[i] = x[i] + y[i]; 10 [...]... {B1.1, B1 .2, B1.3} và C 1 C 2 C 3 1, 2 qua cọc 3 1, 2 qua cọc 2 3 qua cọc 2 B1 B2 B3 C 1 C 2 C 3 C 1 C 2 C 3 C 1 C 2 C 3 C 1 C 2 C 3 C 1 C 2 C 3 C 1 C 2 C 3 C 1 C 2 C 3 C 1 C 2 C 3 B1.1 B1 .2 B1.3 B3.1 B3 .2 B3.3 23 C 1 C 2 C 3 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN } Ví dụ: thủ tục đệ quy biểu diễn số thập phân sang nhị phân có dạng: void Binary(int m) { if (m >0) { Binary( m / 2) ; printf("%d",... tập a’ = (a’ 1 , a’ 2 , , a’ k ) theo thứ tự từ điển và ký hiệu là a < a’ nếu tìm được j sao cho: a 1 = a’ 1 , a 2 = a’ 2 , a j-1 = a’ j-1 và a j < a’ j . Ví dụ với n = 5, k = 3, ta liệt kê 10 tập con của nó như sau: {{1 ,2, 3},{1 ,2, 4}{1 ,2, 5}{1,3,4}{1,3,5}{1,4,5} {2, 3,4} {2, 3,5} {2, 4,5}{3,4,5}} + Ta thấy cấu hình đầu tiên là {1, 2 , k} 39 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN lưu.. .Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN Giải thuật không đệ quy tương ứng như sau: Create_Stack(S) ; Push(S, (n, a, b, c, 1)); do { while (n > 0) { Push(S, (n, a, b, c, 2) ); n = n-1; Swap(b, c); } Pop(S, (n, a, b, c, k)); if ( k != 1) { Move(a, c); n = n-1; Swap(a, b); } } while (k>1);  36 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN Hình 3.3:... a[1] Hình 2. 6: Tổng các phần tử trong mảng. Hàm đệ quy mô tả bằng mã giả như sau: Sum(int a[], int n) - if ( n == 1) Sum = a[1]; - else  Sum = Sum(a, n-1) + a[n]; Trả về a 1 a 2 a 3 a n-1 a n Sum(n) = a n + Sum(n-1) n = n-1 a 1 a 2 a 3 a n Sum(n) = a n + Sum(n-1) n = 1 a n Sum(n) = a n = a 1 26 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN 2. 2 Thuật toán quay lui (Back Tracking) Thuật toán... quy hỗ tương: hai hàm đệ quy gọi nhau U n n, n <5 U n-1 + G n -2 , n>=5 G n n-3, n <8 U n-1 + G n -2 , n>=8 long G(int n); 19 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN Hình 2. 3: Minh họa trường hợp N = 3. Trong trường hợp N = 3 như hình 2. 3, thực hiện ba bước để đưa 3 đĩa về cọc 2: gồm B1, B2 và B3. Với B2 thì đơn giản do chuyển 1 đĩa, còn bước B1 và B3 phải di chuyển nhiều... là 2 n . 37 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN } • Tránh lãng phí bộ nhớ: bằng cách sử dụng kiểu dữ liệu nhỏ nhất có thể được để lưu trữ: khơng gian bộ nhớ hiện tại có thể khơng cịn eo hẹp như trước, nhưng khơng vì thế mà người lập trình có thể tự do phung phí cấp cho chương trình. Việc sử dụng quá nhiều tài ngun hơn mức địi hỏi của chương trình là thói quen xấu mà người lập trình. .. = (x 1 , x 2 , , x n ) bằng cách thử cho x 1 nhận lần lượt các giá trị có thể được. Với mỗi giá trị thử gán cho x 1 thì bài tốn trở thành liệt kê tiếp cấu hình n-1 phần tử x = (x 2 , x 3 , , x n ). Khả năng chọn x 2 với x 1 đã chọn Khả năng chọn x 3 với x 1 và x 2 đã chọn 45 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN o Shift trái 1 bit: nhân 2 o Shift phải 1 bit: chia 2 Ví dụ: a... tạm. Giải thuật thực hiện P(X) với việc sử dụng stack có dạ ng : P(X) { CreateStack(S) ; while ( ! C(X)) { A(X) ; Push(S, X) ; X = f(X) ; } D(X) ; while ( !Empty(S)) { Pop(S, X) ; B(X) ; } 32 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN DichChuyen(N, 1, 2, 3); return 0; } void DichChuyen(int N, int C1, int C2, int C3) { if (N == 1) printf(“%d - > %d”, C1, C2); else { DichChuyen(N-1, C1, C3, C2); DichChuyen(1,... printf("%d", m % 2) ; } } Trong đó: X là m P(X) là Binary(X) A(X) và D(X) khơng có B(X) là lệnh printf("%d", m % 2) ; C(X) là m ≤ 0 f(X) = f(m) = m / 2 ; Giải thuật không đệ quy như sau: void Binary( int m) { int temp; CreateStack(S); while (m > 0) { temp = m % 2; Push(S, temp); m = m / 2; } while (! Empty(S)) { Pop(S, temp); printf(“%d”, temp); } } 33 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT... pointer LPCTSTR lpszClassName 5 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCN + Cấu hình kết thúc là {n-k+1, n-k +2, , n}. Nhận xét: chúng ta sẽ in ra tập con với các phần tử của nó theo thứ tự tăng dần. Biểu diễn tập con là một dãy a{a 1 , a 2 , , a k } trong đó a 1 < a 2 < <a k . Ta nhận thấy giới hạn trên của a k là n, của a k-1 là n-1, của a k -2 là n -2. Tổng quát giới hạn trên ... ................................................................................................... 124  2 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNLời nói đầuHọ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ệ, ... ơn!Tác giả3 Giáo trình Kỹ thuật lập trình 2 Khoa CNTT – ĐH KTCNChương 1Mộ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 ... Giaithua (2) n = 2return 2* Giaithua(1)n = 1return 1* Giaithua(0)long l = Giaithua(5) 126 24 120 Giaithua(5)Giaithua(4)Giaithua(3)Giaithua (2) Giaithua(1)n = 0return 1Giaithua(0)118 Giáo trình Kỹ thuật lập trình

Ngày đăng: 21/08/2012, 15:05

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. Brian W. Kernighan, Rob Pike, The Practice of Programming, Addison Wesley, 1999 Sách, tạp chí
Tiêu đề: The Practice of Programming
2. Ellis Horowitz, Sartaj Sahni, Fundamentals of Data Structures, ebook, 1981 Sách, tạp chí
Tiêu đề: Fundamentals of Data Structures
3. R. Neapolitan, K. Naimipour , Foundations of Algorithms Using C++ Pseudocode, Jones and Bartlett Publishers , 2004 Sách, tạp chí
Tiêu đề: Foundations of Algorithms Using C++ Pseudocode
4. Lê Hoài Bắc, Nguyễn Thanh Nghị, Kỹ năng lập trình, NXB KHKT, 2005 Sách, tạp chí
Tiêu đề: Kỹ năng lập trình
Nhà XB: NXB KHKT
5. Trần Hoàng Thọ, Giáo trình Kỹ thuật Lập trình Nâng cao, ĐH Đà Lạt, 2002 Sách, tạp chí
Tiêu đề: Giáo trình Kỹ thuật Lập trình Nâng cao
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 Sách, tạp chí
Tiêu đề: Nhập môn Cấu trúc dữ liệu và thuật toán
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 Sách, tạp chí
Tiêu đề: Giáo trình kỹ thuật lập trình
Nhà XB: NXB Bưu Điện
8. Lê Minh Hoàng, Giải thuật và lập trình, NXB ĐH Sư Phạm HN, 1999- 2002 Sách, tạp chí
Tiêu đề: Giải thuật và lập trình
Nhà XB: NXB ĐH Sư Phạm HN

HÌNH ẢNH LIÊN QUAN

Hình 2.1: Gọi đệ quy của hàm giai thừa. -  Giáo trình kỹ thuật lập trình 2
Hình 2.1 Gọi đệ quy của hàm giai thừa (Trang 18)
Hình 2.1: Gọi đệ quy của hàm giai thừa. -  Giáo trình kỹ thuật lập trình 2
Hình 2.1 Gọi đệ quy của hàm giai thừa (Trang 18)
Hình 2.2: Minh họa tháp Hanoi với n =2. -  Giáo trình kỹ thuật lập trình 2
Hình 2.2 Minh họa tháp Hanoi với n =2 (Trang 22)
Hình 2.3: Minh họa trường hợp N= 3. -  Giáo trình kỹ thuật lập trình 2
Hình 2.3 Minh họa trường hợp N= 3 (Trang 23)
Hình 2.3: Minh họa trường hợp N = 3. -  Giáo trình kỹ thuật lập trình 2
Hình 2.3 Minh họa trường hợp N = 3 (Trang 23)
Hình 2.4: Tháp Hanoi với n= 4. -  Giáo trình kỹ thuật lập trình 2
Hình 2.4 Tháp Hanoi với n= 4 (Trang 24)
Hình 2.4: Tháp Hanoi với n = 4. -  Giáo trình kỹ thuật lập trình 2
Hình 2.4 Tháp Hanoi với n = 4 (Trang 24)
a1 a2 a3 an-1 an -  Giáo trình kỹ thuật lập trình 2
a1 a2 a3 an-1 an (Trang 25)
Hình 2. 5: Tìm phần tử lớn trong mảng dùng đệ quy -  Giáo trình kỹ thuật lập trình 2
Hình 2. 5: Tìm phần tử lớn trong mảng dùng đệ quy (Trang 25)
Hình 2.6: Tổng các phần tử trong mảng. Hàm đệ quy mơ tả bằng mã giả như sau: -  Giáo trình kỹ thuật lập trình 2
Hình 2.6 Tổng các phần tử trong mảng. Hàm đệ quy mơ tả bằng mã giả như sau: (Trang 26)
Hình 2.7: Gọi đệ quy hàm GT. -  Giáo trình kỹ thuật lập trình 2
Hình 2.7 Gọi đệ quy hàm GT (Trang 27)
Hình 2.7: Gọi đệ quy hàm GT. -  Giáo trình kỹ thuật lập trình 2
Hình 2.7 Gọi đệ quy hàm GT (Trang 27)
Hình 2.8: Hàm đệ quy tính dãy Fibonacci. -  Giáo trình kỹ thuật lập trình 2
Hình 2.8 Hàm đệ quy tính dãy Fibonacci (Trang 28)
Hình 2.8: Hàm đệ quy tính dãy Fibonacci. -  Giáo trình kỹ thuật lập trình 2
Hình 2.8 Hàm đệ quy tính dãy Fibonacci (Trang 28)
Stop =1; // kết thúc phát sinh cấu hình -  Giáo trình kỹ thuật lập trình 2
top =1; // kết thúc phát sinh cấu hình (Trang 41)
Hình 3.1: Liệt kê các lời giải theo thuật tốn quay lui. -  Giáo trình kỹ thuật lập trình 2
Hình 3.1 Liệt kê các lời giải theo thuật tốn quay lui (Trang 46)
Hình 3.1: Liệt kê các lời giải theo thuật toán quay lui. -  Giáo trình kỹ thuật lập trình 2
Hình 3.1 Liệt kê các lời giải theo thuật toán quay lui (Trang 46)
Hình 3.2: Cây tìm kiếm quay lui trong bài tốn liệt kê dãy nhị phân. -  Giáo trình kỹ thuật lập trình 2
Hình 3.2 Cây tìm kiếm quay lui trong bài tốn liệt kê dãy nhị phân (Trang 48)
Hình 3.2: Cây tìm kiếm quay lui trong bài toán liệt kê dãy nhị phân. -  Giáo trình kỹ thuật lập trình 2
Hình 3.2 Cây tìm kiếm quay lui trong bài toán liệt kê dãy nhị phân (Trang 48)
Hình 3.3: Cây liệt kê tập co n3 phần tử với n= 5. Chương trình quay lui liệt kê tập k phần tử: -  Giáo trình kỹ thuật lập trình 2
Hình 3.3 Cây liệt kê tập co n3 phần tử với n= 5. Chương trình quay lui liệt kê tập k phần tử: (Trang 49)
Hình 3.3: Cây liệt kê tập con 3 phần tử với n = 5. -  Giáo trình kỹ thuật lập trình 2
Hình 3.3 Cây liệt kê tập con 3 phần tử với n = 5 (Trang 49)
Hình 3.4: Cây liệt kê hốn vị 3 phần tử Chương trình quay lui liệt kê hốn vị m phần tử: -  Giáo trình kỹ thuật lập trình 2
Hình 3.4 Cây liệt kê hốn vị 3 phần tử Chương trình quay lui liệt kê hốn vị m phần tử: (Trang 50)
Hình 3.4: Cây liệt kê hoán vị 3 phần tử Chương trình quay lui liệt kê hoán vị m phần tử: -  Giáo trình kỹ thuật lập trình 2
Hình 3.4 Cây liệt kê hoán vị 3 phần tử Chương trình quay lui liệt kê hoán vị m phần tử: (Trang 50)
Hình 3.5: Các nước đi của quân hậu có thể có. -  Giáo trình kỹ thuật lập trình 2
Hình 3.5 Các nước đi của quân hậu có thể có (Trang 52)
Hình 3.6: Một cách sắp xếp 8 hậu trên bàn cờ 8x8 -  Giáo trình kỹ thuật lập trình 2
Hình 3.6 Một cách sắp xếp 8 hậu trên bàn cờ 8x8 (Trang 52)
Hình 3.8: Các đường chéo Trên Phả i- Dưới Trái. -  Giáo trình kỹ thuật lập trình 2
Hình 3.8 Các đường chéo Trên Phả i- Dưới Trái (Trang 53)
Hình 3.7: Các đường chéo Trên Trá i- Dưới Phải -  Giáo trình kỹ thuật lập trình 2
Hình 3.7 Các đường chéo Trên Trá i- Dưới Phải (Trang 53)
Hình 3.7: Các đường chéo Trên Trái - Dưới Phải -  Giáo trình kỹ thuật lập trình 2
Hình 3.7 Các đường chéo Trên Trái - Dưới Phải (Trang 53)
Hình 3.8: Các đường chéo Trên Phải - Dưới Trái. -  Giáo trình kỹ thuật lập trình 2
Hình 3.8 Các đường chéo Trên Phải - Dưới Trái (Trang 53)
Hình 3.9: Vị trí của quân hậu ảnh hưởng đế n2 đường chéo. Cài đặt: -  Giáo trình kỹ thuật lập trình 2
Hình 3.9 Vị trí của quân hậu ảnh hưởng đế n2 đường chéo. Cài đặt: (Trang 54)
Hình 3.9: Vị trí của quân hậu ảnh hưởng đến 2 đường chéo. -  Giáo trình kỹ thuật lập trình 2
Hình 3.9 Vị trí của quân hậu ảnh hưởng đến 2 đường chéo (Trang 54)
Hình 3.10: Minh họa tám nước đi tiếp của quân mã. -  Giáo trình kỹ thuật lập trình 2
Hình 3.10 Minh họa tám nước đi tiếp của quân mã (Trang 57)
Hình 3.11: Đường đi của quân mã trong bàn cờ 5x5 Cài đặt: -  Giáo trình kỹ thuật lập trình 2
Hình 3.11 Đường đi của quân mã trong bàn cờ 5x5 Cài đặt: (Trang 58)
Hình 3.13: Thứ tự tám nước đi theo chiều kim đồng hồ. Mảng  dr[] = { -2, -1, 1, 2, 2, 1, -1, -2} -  Giáo trình kỹ thuật lập trình 2
Hình 3.13 Thứ tự tám nước đi theo chiều kim đồng hồ. Mảng dr[] = { -2, -1, 1, 2, 2, 1, -1, -2} (Trang 59)
Hình 3.1 2: Mảng board cho bàn cờ 8x8 ⇒ 12x12. -  Giáo trình kỹ thuật lập trình 2
Hình 3.1 2: Mảng board cho bàn cờ 8x8 ⇒ 12x12 (Trang 59)
Hình 3.12 : Mảng board cho bàn cờ 8x8 ⇒ 12x12. -  Giáo trình kỹ thuật lập trình 2
Hình 3.12 Mảng board cho bàn cờ 8x8 ⇒ 12x12 (Trang 59)
Hình 4.1: Phân loại phương pháp tìm kiếm -  Giáo trình kỹ thuật lập trình 2
Hình 4.1 Phân loại phương pháp tìm kiếm (Trang 64)
Hình 4.1:  Phân loại phương pháp tìm kiếm -  Giáo trình kỹ thuật lập trình 2
Hình 4.1 Phân loại phương pháp tìm kiếm (Trang 64)
Hình 4.2: Tìm kiếm nhị phân. Hàm C minh họa cài đặt thuật tốn tìm kiếm nhị phân -  Giáo trình kỹ thuật lập trình 2
Hình 4.2 Tìm kiếm nhị phân. Hàm C minh họa cài đặt thuật tốn tìm kiếm nhị phân (Trang 66)
Hình 4.2: Tìm kiếm nhị phân. -  Giáo trình kỹ thuật lập trình 2
Hình 4.2 Tìm kiếm nhị phân (Trang 66)
Hình 4.3: Minh họa đổi chỗ trực tiếp. -  Giáo trình kỹ thuật lập trình 2
Hình 4.3 Minh họa đổi chỗ trực tiếp (Trang 76)
Hình 4.3: Minh họa đổi chỗ trực tiếp. -  Giáo trình kỹ thuật lập trình 2
Hình 4.3 Minh họa đổi chỗ trực tiếp (Trang 76)
Hình 4.4: Minh hoạ ShellSort. -  Giáo trình kỹ thuật lập trình 2
Hình 4.4 Minh hoạ ShellSort (Trang 78)
Hình 4.4: Minh hoạ ShellSort. -  Giáo trình kỹ thuật lập trình 2
Hình 4.4 Minh hoạ ShellSort (Trang 78)
Bảng 4.1: Sắp theo hàng đơn vị -  Giáo trình kỹ thuật lập trình 2
Bảng 4.1 Sắp theo hàng đơn vị (Trang 83)
385. Ta được bảng kết quả minh họa như sau: -  Giáo trình kỹ thuật lập trình 2
385. Ta được bảng kết quả minh họa như sau: (Trang 83)
Bảng 4.1: Sắp theo hàng đơn vị -  Giáo trình kỹ thuật lập trình 2
Bảng 4.1 Sắp theo hàng đơn vị (Trang 83)
Bảng 4.3: Sắp theo hàng trăm -  Giáo trình kỹ thuật lập trình 2
Bảng 4.3 Sắp theo hàng trăm (Trang 84)
Bảng 4.2: Sắp theo hàng chục Lúc này chúng ta thu được danh sách như sau: -  Giáo trình kỹ thuật lập trình 2
Bảng 4.2 Sắp theo hàng chục Lúc này chúng ta thu được danh sách như sau: (Trang 84)
Hình 5.1: Minh họa Stack. -  Giáo trình kỹ thuật lập trình 2
Hình 5.1 Minh họa Stack (Trang 87)
Hình 5.1: Minh họa Stack. -  Giáo trình kỹ thuật lập trình 2
Hình 5.1 Minh họa Stack (Trang 87)
5. Thêm phần tử vào Stack S: Push(S, C) kết quả Stac kS như hình 5.2.5. -  Giáo trình kỹ thuật lập trình 2
5. Thêm phần tử vào Stack S: Push(S, C) kết quả Stac kS như hình 5.2.5 (Trang 88)
Hình 1 Hình 2 Hình 3 Hình 4 Hình 5 -  Giáo trình kỹ thuật lập trình 2
Hình 1 Hình 2 Hình 3 Hình 4 Hình 5 (Trang 88)
Hình 5.3: Minh họa Stack dùng mảng một chiều. -  Giáo trình kỹ thuật lập trình 2
Hình 5.3 Minh họa Stack dùng mảng một chiều (Trang 89)
Hình 5.4: Minh họa xử lý gọi hàm trong trình biên dịch -  Giáo trình kỹ thuật lập trình 2
Hình 5.4 Minh họa xử lý gọi hàm trong trình biên dịch (Trang 91)
Hình 5.5: Minh họa hàng đợi Queue. -  Giáo trình kỹ thuật lập trình 2
Hình 5.5 Minh họa hàng đợi Queue (Trang 106)
Hình 5.6: Hàng đợi có hai phần tử A và B. -  Giáo trình kỹ thuật lập trình 2
Hình 5.6 Hàng đợi có hai phần tử A và B (Trang 107)
Hình 5.11: Minh họa thứ tự duyệt theo chiều rộng. -  Giáo trình kỹ thuật lập trình 2
Hình 5.11 Minh họa thứ tự duyệt theo chiều rộng (Trang 113)
Hình: Một cách bố trí các quân Hậu. -  Giáo trình kỹ thuật lập trình 2
nh Một cách bố trí các quân Hậu (Trang 121)
Hình: Các nước đi cĩ thể cĩ của quân mã -  Giáo trình kỹ thuật lập trình 2
nh Các nước đi cĩ thể cĩ của quân mã (Trang 121)

TỪ KHÓA LIÊN QUAN

w