Ứ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

13 584 2
Ứ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

Đ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

- Đồ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

U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] ĐẠ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 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 sẽ tăng lên gấp bội và công việc quản 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 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 thư viện,bạn không thể giải quyết và quản 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 thư viện, bạn có thể quản hàng trăm công việc như : quản việc cho mượn sách, báo chí , quản 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 : 1 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] A. 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 :  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 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 thư viện chúng ta sẽ chia nhỏ quá trình quản thành các phần như sau : quản lưu trữ và cập nhật sách, quản 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 và sữa lỗi. 2 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] - 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 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 cơ sở dữ liệu như : SQL Server, My SQL . để quản 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 này, để tiện cho việc kết nối và quản 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 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 : 3 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] Form quản có dạng như sau : - Khi người quản đ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. 4 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] - Khi người quản 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 5 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] 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) 6 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] 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ý 7 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] 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 thư viện này phần dữ liệu thường được tạoquả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ìnhquả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 8 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] 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 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,Tran gThai 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 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 thư viện và đọc giả. 9 U I T - H C M Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY] Có như vậy thì phần mềm quản thư viện mới có đầy đủ các chức năng mà người quản và đọc giả đòi hỏi. - Ví dụ : + Ở vị trí người quản thư viện có các nhu cầu : cập nhật thông tin sách, quản 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ụngphầ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 10 [...]... 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 : UIT - HCM 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. .. TimSachFrame(); } - Á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 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 cập nhật thông tin sách, vấn đề quản 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... Refresh("DocGia",jTable1); * Nguyên tắc chứa trong : 11 Tài liệu: Docs.vn Hỗ trợ : Y! M minhu888 VNU-HCM [UNIVERSITY OF INFORMATION TECHNOLOGY ] - 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 thư viện, các luật,tìm sách ,quản 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... gọi thực thi Ví dụ : 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 B 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... 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ảnthư 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... 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; UIT... 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 13 ... 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 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 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... tin đọc giả //hiển thị thông tin đọc giả UIT - HCM 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 (" + . 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. 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

Ngày đăng: 25/04/2013, 09:19

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan