Đề tài Ứng dụng phương pháp luận - Phương pháp sáng tạo trong lập trình phần mềm quản lí thư viện

* Nguyên tắc thực hiện sơ bộ :

- Thực hiện trước sự thay đổi cần có, hoàn toàn hoặc từng phần, đối với đối tượng

- Cần sắp xếp đối tượng trước, sao cho chúng có thể hoạt động từ vị trí thuận lợi nhất, không mất thời gian dịch chuyển.

- Thông thường ta thường đặt ra các câu hỏi trước khi thực hiện nguyên tắc này: hệ thống cho trước có những nhược điểm gì? Nó bao gồm những phần việc gì được thực hiện theo tuần tự thời gian như thế nào? Việc thực hiện trước một hoặc tất cả các phần việc có giúp khắc phục các nhược điểm nêu trên không? Nếu có thì tìm cách giải quyết?.

- Ta sẽ xây dựng cơ sở dữ liệu cho chương trình này như sau : cơ sở dữ liệu gồm 13 bảng bao gồm : sách, độc giả, bản sách, ưu tiên, kho sách, nhà xuất bản, nhân viên, chi tiết mượn trả, được mượn, phục vụ, mã quyển truy nhập, thông tin người dùng, thông tin truy nhập. Từ các bảng cơ sở dữ liệu ta xây dựng các biểu mẫu mô phỏng các giao diện cho chương trình.

 

doc11 trang | Chia sẻ: maiphuongdc | Lượt xem: 1694 | Lượt tải: 3download
Bạn đang xem nội dung tài liệu Đề tài Ứng dụng phương pháp luận - Phương pháp sáng tạo trong lập trình phần mềm quản lí thư viện, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN ------0o0------ KHOA MẠNG MÁY TÍNH VÀ TRUYỀN THÔNG ĐỀ TÀI CUỐI KỲ MÔN : PHƯƠNG PHÁP LUẬN SÁNG TẠO – KHOA HỌC Đề tài : Ứng Dụng Phương Pháp Luận-Phương Pháp Sáng Tạo Trong Lập Trình Phần Mềm Quản Lí Thư Viện Giảng viên : GS.TSKH. HOÀNG KIẾM Sinh viên : HUỲNH TẤN MẪN MSSV : 06520281 I . Giới thiệu : Trong thời đại công nghệ phát triển nhanh chóng như ngày nay, thì việc ứng dụng công nghệ thông tin vào trong mọi lĩnh vực là một trong những nhu cầu cấp thiết và tất yếu. Đặc biệt là trong lĩnh vực quản lí,càng ngày lượng thông tin và dữ liệu bạn quản lí sẽ tăng lên gấp bội và công việc quản lí của bạn trở nên phức tạp khó khăn hơn, thì việc ứng dụng công nghệ thông tin lại càng cấp thiết hơn, cùng với sự hổ trợ của các phần mềm quản lí, nó giúp bạn quản lí mọi việc dễ dàng nhanh chóng, đáp ứng mọi yêu cầu lưu trữ và truy xuất dữ liệu,tiết kiệm được thời gian và chi phí cho công việc. Điển hình như trong công việc quản lí thư viện,bạn không thể giải quyết và quản lí các hoạt động của thư viện trong thời gian nhanh nhất với hàng đống xổ sách, nhưng với chiếc máy tính và phần mềm quản lí thư viện, bạn có thể quản lí hàng trăm công việc như : quản lí việc cho mượn sách, báo chí...., quản lí việc lưu trữ sắp xếp, hổ trợ độc giả việc tra cứu thông tin, tìm kiếm sách nhanh chóng và hiệu quả nhất. II.Ứng dụng các phương pháp, nguyên lý để giải quyết bài toán : Những nguyên tắc được dùng để xử lý bài toán : Việc giải quyết vấn đề trên máy tính chỉ là thao tác lập trình hay là sự chuyển đổi lời giải từ ngôn ngữ bên ngoài sang các ngôn ngữ được sử dụng trong máy tính. Nên để giải quyết bài toán này trước tiên ta cần xây dựng các đối tượng, phân tích bài toán và thiết kế mô hình, đồng thời tìm ra cách giải tối ưu nhất. Để xây dựng mô hình và các thuật toán tối ưu nhất cho bài toán ta sẽ sử dụng các nguyên tắc sau thực hiện : Nguyên tắc chia nhỏ : Để thực hiện nguyên tắc này ta sẽ thực hiện các bước sau : Chia đối tượng thành các phần độc lập . Làm đối tượng trở nên tháo lắp được . Tăng mức độ chia nhỏ đối tượng . Áp dụng các bước trên ta sẽ chia nhỏ chia bài toán thành nhiều phần để dễ thực hiện và quản lí : Quá trình phân tích : Khảo sát hiện trạng hệ thống và phân tích yêu cầu. Thiết lập các sơ đồ(sơ đồ chức năng, sơ đồ dòng dữ liệu). Thiết lập mô hình dữ liệu. Thiết lập mô hình quan hệ và mô tả tiến trình. Quá trình thiết kế : Thiết kế cơ sở dữ liệu. Thiết kế giao diện người dùng. Đồng thời khi chia nhỏ các đối tượng sẽ giúp cho việc quản lí dễ dàng và đi sâu vào từng đối tượng hơn. - Ví dụ : trong chương trình quản lí thư viện chúng ta sẽ chia nhỏ quá trình quản lí thành các phần như sau : quản lí lưu trữ và cập nhật sách, quản lí việc trả mượn sách, hổ trợ tìm kiếm sách theo các thể loại. - Khi lập trình thay vì chỉ viết một lớp, chúng ta chia nhỏ bài toán chính thành nhiều lớp nhỏ thuận tiện cho việc quản lí và sữa lỗi. - Trong phần thiết kế cơ sở dữ liệu ta cũng chia thành nhiều bảng : sách, độc giả, ưu tiên, kho sách... từ đó việc quản lí thông tin về sách, độc giả...dễ dàng hơn và việc cập nhật thông tin thuận tiện hơn . Và phần lưu trữ cơ sỡ dữ liệu ta sẽ kết nối với các server quản lí cơ sở dữ liệu như : SQL Server, My SQL... để quản lí dữ liệu với khối lượng lớn và truy xuất nhanh thay vì lưu vào trong file. Chẳng hạn như trong khi lập trình phần mềm quản lí này, để tiện cho việc kết nối và quản lí truy xuất cơ sở dữ liệu ta tạo một lớp “GetConnection.java”. Lớp này có nhiệm vụ kết nối với server quản lí cơ sở dữ liệu và khi các lớp khi muốn truy xuất cơ sở dữ liệu chỉ cần gọi lại đối tượng của lớp này mà không cần tạo lại kết nối. - Ngoài ra trong phần thiết kế các form ta cũng chia nhỏ các form theo từng mục đích như : form mượn sách, form tìm kiếm sách, form thông tin đọc giả... Nguyên tắc đổi màu : - Thay đổi màu sắc giữa các form để đọc giả dễ phân biệt, trong các form nhập liệu khi đang ở tình trạng “thêm” hay “sửa” dữ liệu thì các đối tượng nào được nhập dữ liệu sẽ có màu khác với các đối tượng không được nhập dữ liệu, điều này giúp người dùng dễ thao tác hơn. - Ví dụ sau đây, chúng ta thấy form “Các qui định” hiển thị như sau : Form quản lí có dạng như sau : - Khi người quản lí đang xem chuyên mục nào thì chuyên mục đó sẽ sáng lên và có màu khác với màu của các chuyên mục khác. Đồng thời khi ở chuyên mục đó nếu bạn chọn: Add, Delete, Modify hay Refesh thì button đó có màu khác so với các button còn lại. - Khi người quản lí cập nhật hay thêm mới thông tin về sách hay đọc giả, trong trường hợp thành công hay thất bại chương trình sẽ hiện ra các form thông báo có biểu tượng khác nhau để người sử dụng phân biệt . Nguyên tắc thực hiện sơ bộ : - Thực hiện trước sự thay đổi cần có, hoàn toàn hoặc từng phần, đối với đối tượng - Cần sắp xếp đối tượng trước, sao cho chúng có thể hoạt động từ vị trí thuận lợi nhất, không mất thời gian dịch chuyển. - Thông thường ta thường đặt ra các câu hỏi trước khi thực hiện nguyên tắc này: hệ thống cho trước có những nhược điểm gì? Nó bao gồm những phần việc gì được thực hiện theo tuần tự thời gian như thế nào? Việc thực hiện trước một hoặc tất cả các phần việc có giúp khắc phục các nhược điểm nêu trên không? Nếu có thì tìm cách giải quyết?. - Ta sẽ xây dựng cơ sở dữ liệu cho chương trình này như sau : cơ sở dữ liệu gồm 13 bảng bao gồm : sách, độc giả, bản sách, ưu tiên, kho sách, nhà xuất bản, nhân viên, chi tiết mượn trả, được mượn, phục vụ, mã quyển truy nhập, thông tin người dùng, thông tin truy nhập. Từ các bảng cơ sở dữ liệu ta xây dựng các biểu mẫu mô phỏng các giao diện cho chương trình. - Ví dụ : Từ bảng sách, độc giả ta xây dựng được các biểu mẫu như sau: Bảng Độc giả : Tên trường Kiểu dữ liệu Ràng buộc Ma_so_the char(10) NOT NULL, primary key Ma_uu_tien char(10) NOT NULL, foreign key Ten_doc_gia varchar(30) NOT NULL Ngay_sinh datetime NULL Nghe_nghiep varchar(40) NULL Dia_chi varchar(40) NULL Ngay_cap_the datetime NOT NULL Ngay_het_han datetime NOT NULL Từ bảng Độc giả ta có biểu mẫu như sau : BM2: Thẻ Độc Giả Mã số thẻ Mã ưu tiên Tên độc giả Ngày sinh ……………….. ……………….. ……………………. ……………………… Nghề nghiệp Địa chỉ Ngày lập thẻ Ngày hết hạn ……………….. ……………….. …………………. ………………….. Từ các khóa chính, khóa ngoại của các bảng dữ liệu ta xây dựng một ma trận : BẢN SÁCH =>BẢN SÁCH (Mã lưu trữ, Mã tài liệu, Mã vị trí, Số đăng ký) SÁCH => SÁCH (Mã sách, Mã NXB) NHÀ XUẤT BẢN => NHÀ XUẤT BẢN (Mã NXB) KHO SÁCH => KHO SÁCH (Mã vị trí) ĐỘC GIẢ => ĐỘC GIẢ (Mã số thẻ, Mã ưu tiên) ƯU TIÊN => ƯU TIÊN (Mã ưu tiên) NHÂN VIÊN => NHÂN VIÊN (Mã nhân viên) MƯỢN => MƯỢN TRẢ (Mã số thẻ, Mã lưu trữ, Ngày mượn, Hạn trả) ĐƯỢC MƯỢN => ĐƯỢC MƯỢN (Mã lưu trữ, Mã ưu tiên) PHỤC VỤ => PHỤC VỤ (Mã nhân viên, Mã số thẻ) Ta có ma trận như sau : Thuộc tính khoá 1 2 3 4 5 6 7 8 9 10 11 12 13 Liên kết Mã lưu trữ K C C (1, 11), (1, 12) Mã sách C K (1, 2) Mã NXB C C K (2, 5), (4, 5) Mã vị trí C K (1, 7) Mã số thẻ K C C (8, 11), (8, 13) Mã ưu tiên C K C (8, 9), (9, 12) Mã nhân viên K C (10, 13) Mã số thẻ, Mã lưu trữ Dòng loại Mã lưu trữ, Mã ưu tiên Dòng loại Mã nhân viên, Mã số thẻ Dòng loại - Từ ma trận trên ta sẽ dễ dàng xét các điều kiện ràng buộc giữa các đối tượng trong quá trình truy xuất và nhập dữ liệu. - Trước khi bắt tay vào lập trình ta sẽ sử dụng các đoạn mã giả mô phỏng chương trình trước để tiện cho việc xử lý các sự kiện của từng đối tượng, đặt các biến, trình bày và sử dụng các thuật toán sao cho phù hợp. - Ví dụ : Sau đây là một đoạn mã giả cho các tiến trình trong việc cập nhật sách. Các tiến trình này đơn giản và chúng thực thi liên tiếp nhau để tạo ra một output cuối cùng. Các tiến trình sau nhận output từ tiến trình trước đó làm input của mình. Ta chỉ tạo được ra mã giả cho 3 tiến trình mà có thể lập trình để xử lý yêu cầu: Phân loại sách. Tạo số đăng ký riêng. Tạo danh mục. Mã giả cho việc cập nhật sách là: READ (thông tin về sách nhận về) DO WHILE (các bản ghi về loại sách chưa xét) IF (có thông tin trùng với thông tin trên sách) THEN Lấy thông tin về loại sách GENERATE (số đăng ký riêng) cho sách UPDATE (Danh mục) cho sách vừa tạo số đăng ký ENDI ENDD Nguyên tắc kết hợp : - Nguyên tắc này thường đi chung với nguyên tắc chia nhỏ , kết hợp các đối tượng đồng nhất hoặc các đối tượng dùng cho các hoạt động kế cận, kết hợp về mặt thời gian các hoạt động đồng nhất hoặc kế cận, đồng thời chúng ta phải đặt ra câu hỏi: kết hợp theo kiểu gì?, kết hợp như thế nào?, đến mức nào?, để có phương pháp thực hiện tốt nhất. - Điển hình như khi lập trình phần mềm quản lí thư viện này phần dữ liệu thường được tạo và quản lý bằng SQL Server hay My SQL còn phần giao diện thường được lập trình bằng một trong các ngôn ngữ C#, java … và các báo cáo thường được thiết kế bởi Crysral Report. - Trong quá trình lập trình sau khi chia nhỏ các đối tượng ra để tiện cho việc lập trình và quản lí, người ta sẽ kết hợp các đối tượng đó lại thành một bài toán hoàn chỉnh. Cũng như khi lập trình ta chia thành các lớp nhỏ, mỗi lớp nhỏ chứa từng đối tượng riêng biệt và các sự kiện liên quan tới từng đối tượng đó, và sau đó kết hợp các lớp với nhau để hoàn thiện chương trình. - Trong phần tạo các biểu mẫu mô phỏng giao diện của chương trình, ta sẽ kết hợp một số thuộc tính trong các bảng dữ liệu với nhau. Ví dụ : ta kết hợp một số thuộc tính trong bảng Đọc giả và một số thuộc tính trong bảng Sách để có biểu mẫu như sau : Phần : Số thẻ, Họ tên, Nghề nghiệp, Địa chỉ thuộc bảng Đọc giả và Mã sách, Tên sách, Thể loại, Tác giả thuộc bảng Sách. BM3 Phiếu Mượn Sách Thư viện THPT Nguyễn Du PHIẾU MƯỢN SÁCH Số thẻ:…………………………………………………………….................. Họ tên:…………………………………………………………………........... Nghê nghiệp:…………………………………………………………………. Địa chỉ:………………………………………………………………………… Mã sách Tên sách Thể loại Tác giả Ngày… tháng… năm 20… Trong quá trình đọc giả tìm sách ta sẽ kết hợp nhiều câu truy vấn SQL thành một câu truy vấn duy nhất, giúp cho câu lệnh ngắn gọn dễ quản lí và sửa lỗi. Ở đoạn code dưới đây đọc giả có thể tìm sách theo từng đối tượng : sách, tác giả, nhà xuất bản, ngôn ngữ hay thể loại hoặc theo tất cả các đối tượng. Chẳng hạn như khi đọc giả muốn tìm theo tác giả thì các đối tượng còn lại đều là null, vì không có nhập liệu. String sach = " TenSach like '%" + txtSach.getText().trim() + "%' "; String tacgia = " and TenTacGia like '%" + txtTacGia.getText().trim() + "%' "; String nxb = " and TenNXB like '%" + txtNhaXuatBan.getText().trim() + "%' "; String ngonngu = " and TenNgonNgu like '%" + txtNgonNgu.getText().trim() + "%' "; String theloai = " and TenTheLoai like '%" + txtTheLoai.getText().trim() + "%' "; test.sql = "Select MaSach,TenSach,TenTacGia,TenNgonNgu,TenTheLoai,TenNXB,NoiDung,ViTri,TrangThai from Sach, TacGia, NXB, NgonNgu, TheLoai" + " where Sach.matacgia = TacGia.matacgia and " + " Sach.manxb = NXB.manxb and " + " Sach.mangonngu = NgonNgu.mangonngu and " + " Sach.matheloai = TheLoai.matheloai and " + sach + tacgia + nxb + ngonngu + theloai; Nguyên tắc đảo ngược : - Ta thường đặt ra câu hỏi hệ thống cho trước có chức năng gì ? Có thể đảo ngược về mặt chức năng hay không?. - Để giải quyết bài toán quản lí thư viện này người lập trình cần đảo ngược vai trò của mình, đứng ở hai vị trí : người quản lí thư viện và đọc giả. Có như vậy thì phần mềm quản lí thư viện mới có đầy đủ các chức năng mà người quản lí và đọc giả đòi hỏi. - Ví dụ : Ở vị trí người quản lí thư viện có các nhu cầu : cập nhật thông tin sách, quản lí việc trả mượn sách, cập nhật thông tin đọc giả, thống kê. Ở vị trí đọc giả có các nhu cầu : tra cứu tài liệu xem chi tiết tài liệu, xem thông tin cá nhân, thay đôi thông tin cá nhân. Nguyên tắc tách khỏi : - Tách phần gây “phiền phức” (tính chất “phiền phức”) hay ngược lại, tách phần duy nhất “cần thiết” (tính chất “cần thiết”) ra khỏi đối tượng, cũng là phân nhỏ nhưng tách thành hai phần độc lập : phần giữ lại để sử dụng và phần không giữ lại (tách khỏi) là phần không cần thiết. - Nguyên tắc này được áp dụng trong quá trình truy xuất dò tìm để truy xuất cơ sở dữ liệu khi đọc giả tra cứu tìm sách, trong quá trình cập nhật thông tin sách hoặc thông tin đọc giả. - Ví dụ : trong quá trình mượn sách nếu có hai đọc giả mượn cung một quyển sách thì ta sẽ lấy độ ưu tiên của đọc giả để so sánh đọc giả nào có độ ưu tiên cao hơn sẽ được mượn sách. sql = "Select Ma-uu-tien from DocGia"; rs = s.executeQuery(sql); int a = 0; while(rs.next()){ if(rs.getString(2)>a){ a = rs.getString(2);// Mã ưu tiên của đọc giả nằm ở cột 2 } } sql = “select * from docgia where Ma-uu-tien like’%” +a+”%’”; rs = s.executeQuery(sql); Nguyên tắc trung gian : Sử dụng đối tượng trung gian, chuyển tiếp.   - Trong nhiều chương trình máy tính, người ta có thể viết những biểu thức tính toán phức tạp trên cùng một hàng. Điều này tuy chẳng ảnh hưởng đến kết quả tính toán cuối cùng nhưng sẽ làm cho việc đọc biểu thức trở nên khó khăn hơn và khó kiểm tra hơn khi bị lỗi. - Điển hình như trong khi lấy dữ liệu từ các textbox do đọc giả nhập vào hay người quản lí nhập vào, nếu ta không đặt các biến trung gian thì cú pháp câu lệnh để insert dữ liệu vào cơ sở dữ liệu trở nên dài dòng, nhập nhằn và khó kiểm tra khi bị lỗi. - Ví dụ : Khi thêm người quản lí thêm một số thể loại vào trong cơ sở dữ liệu ta có câu lệnh như sau : Khi ta không sử dụng các biến trung gian sql = "Insert into TheLoai values (" +" + txtMaTheLoai.getText().trim().toUpperCase()+ "', +'" + txtTenTheLoai.getText().trim()+"' + ")"; Khi ta sử dụng các biến trung gian String maTheLoai = "'" + txtMaTheLoai.getText().trim().toUpperCase()+ "',"; String tenTheLoai = "'" + txtTenTheLoai.getText().trim()+"'"; sql = "Insert into TheLoai values (" + maTheLoai + tenTheLoai + ")"; Nguyên tắc vạn năng : Một đối tượng có thể thực hiện nhiều chức năng khác nhau. - Để tiện cho việc kết nối cơ sở dữ liệu khi lập trình phần mềm quản lí thư viện, ta dùng một lớp GetConnection.java để tạo kết nối với cơ sở dữ liệu, vừa phục vụ cho việc truy xuất dữ liệu, vừa phục vụ cho việc insert dữ liệu vào cơ sở dữ liệu. - Chẳng hạn như trong lớp panelDocgia.java, lớp này vừa thực nhiệm vụ hiển thị thông tin các độc giả, vừa cho phép thêm, xóa, sửa thông tin đọc giả. //hiển thị thông tin đọc giả sql = "Select * from " + tableName; rs = s.executeQuery(sql); //System.out.println(rs); model = new ScrollTable(rs); // Xóa một đọc giả nào đó if (KiemTraXoa(dong,"DocGia","MuonSach", "MaDocGia")) Remove(dong,"DocGia"); Refresh("DocGia",jTable1); Nguyên tắc chứa trong : - Hầu như khi lập trình bất kỳ phần mềm nào thì nguyên tắc này đều được áp dụng. Điển hình như trong lớp MainIntroduction.java có các chức năng :quản lí thư viện, các luật,tìm sách,quản lí tài khoản. Khi ta nhấp vào một trong các button đó thì các hàm hay các lớp liên quan được gọi thực thi .Ví dụ : private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { QuyDinhFrame frame = new QuyDinhFrame(); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { MainFrame frame = new MainFrame(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { TimSachFrame frame = new TimSachFrame(); } Khi ta tạo một đối tượng frame của lớp QuyDinhFrame,MainFrame hay TimSachFrame thì các hàm bên trong các lớp này được gọi thực thi. Các phương pháp được dùng xử lý bài toán : Kết hợp cả hai phương pháp trực tiếp và gián tiếp. Phương pháp gián tiếp được thực hiện trước để tìm ra thuật toán tối ưu cho bài toán. Sau khi tìm ra thuật toán ta sử dụng phương pháp gián tiếp để chuyển đổi lời giải từ ngôn ngữ bên ngoài sang các ngôn ngữ được sử dụng trong máy tính. Phương pháp trực tiếp : - Áp dụng nguyên lý thứ nhất, ta chuyển đổi dữ liệu bài toán thành dữ liệu của chương trình. Ta biểu diễn dữ liệu bài toán trong ngôn ngữ lập trình (viết trên java) như sau : String TenDocGia; String NgaySinh; int dateNgaySinh ; int monthNgaySinh; - Áp dụng nguyên lý thứ năm, ta chia bài toán thành các bài toán nhỏ hơn. Trong bài toán quản lí thư viện ta lại chia ra hai bài toán nhỏ hơn để giải quyết: giải quyết vấn đề quản lí cập nhật thông tin sách, vấn đề quản lí thông tin đọc giả, vấn đề trả mượn sách, làm thẻ thư viện... Phương pháp gián tiếp : - Ta sử dụng nguyên lý vét cạn toàn bộ trong phương pháp thử - sai để tìm ra tất cả các thuật toán có thể có cho bài toán, sau đó kết hợp nguyên lý thu gọn không gian tìm kiếm và nguyên lý giảm độ phức tạp của thử và sai để thu hẹp, đơn giản hóa tối đa điều kiện chấp nhận một trường hợp và loại bỏ những trường hợp hoặc nhóm trường hợp chắc chắn không dẫn đến lời giải. Sau đó ta sử dụng nguyên lý chung trong phương pháp Heuristic để chọn hướng đi (trường hợp) triển vọng nhất trong số những hướng đi (trường hợp) đã biết. III .Kết luận : Sử dụng các nguyên tắc, phương pháp luận sáng tạo trên sẽ giúp cho việc lập trình các phần mềm, lập trình game, cũng như giải quyết các bài toán trong tin học sẽ dễ dàng và nhanh hơn, bởi việc giải quyết chúng bằng những phương pháp thuật toán tối ưu nhất. Không chỉ trong lĩnh vực tin học mà trong nhiều lĩnh vực khác, việc áp dụng các nguyên tắc trong phương pháp luận sáng tạo sẽ giúp cho việc giải quyết vấn đề nhanh chóng, tối ưu trong khoảng thời gian ngắn nhất và đem lại hiệu quả cao nhất.

Các file đính kèm theo tài liệu này:

  • doc2727840I H7884C QU7888C GIA THNH PH7888 H7890 CH MINH.doc
Tài liệu liên quan