MỤC LỤC MỤC LỤC 2 LỜI NÓI ĐẦU 3 PHÂN CÔNG THÀNH VIÊN TRONG NHÓM 4 CHƯƠNG 1. PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP 5 1.1. Mô tả yêu cầu bài toán 5 1.2. Biểu đồ IPO 6 1.2.1. Khởi tạo phiên làm việc mới: 6 1.2.2. Gán giá trị cho mảng 6 1.2.3. Sắp xếp 6 1.2.4. Tìm giá trị lớn nhất 6 1.2.5. Tìm giá trị nhỏ nhất 6 1.2.6. Tìm giá trị trung bình của mảng 7 1.2.7. Tìm độ lêch giữa 2 phần tử trong mảng 7 1.2.8. Tính độ lệch trung bình của các phần tử trong mảng 7 1.2.9. Tìm kiếm 7 1.2.10. Biểu diễn theo dạng BigO, hiển thị thời gian tính theo thực tế 7 1.2.11. Hiển thị dữ liệu 8 1.2.12. Thoát 8 1.3. Thiết kế chương trình 9 1.4. Thiết kế dữ liệu 9 1.5. Thiết kế giải thuật 12 1.5.1. Giải thuật: Cấp phát động bộ nhớ 12 1.5.2. Giải thuật: Đưa ra độ phức tạp và thời gian tính toán thực tế 12 CHƯƠNG 2. CÀI ĐẶT CHƯƠNG TRÌNH 13 2.1. Các kỹ thuật lập trình đã áp dụng 13 2.2. Kết quả chương trình 16 2.3. Giao diện chương trình 17 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 19 TÀI LIỆU THAM KHẢO 20 PHỤ LỤC 21 LỜI NÓI ĐẦU Một chương trình tốt là chương trình chạy thông, kiểm soát các lỗi tốt, phòng ngừa, bẫy lỗi hiệu quả, dễ dàng và thân thiện với người dùng đồng thời mã nguồn có khả năng tái sử dụng cao, … Đó chỉ là một trong số những phần rất nhỏ mà chúng em học được từ môn Kỹ thuật lập trình. Để cho ra đời một chương trình, sản phẩm phần mềm cần có nhiều qui trình và vòng đời đan xen nhau từ khâu phân tích, thiết kế chương trình, lập trình, kiểm thử, viết tài liệu, … Trong mỗi khâu lại chia ra thành các công đoạn nhỏ đòi hỏi lập trình viên phải tuân thủ. Thông qua bài tập lớn môn Kỹ thuật lập trình, chúng em không những được tìm hiểu sâu hơn về mặt lý thuyết mà còn được trực tiếp vận dụng những kiến thức đã được học trên lớp, những kiến thức đọc nâng cao vào trong một ứng dụng thực tế. Chúng em xin gửi lời cảm ơn chân thành tới cô Vũ Thị Thanh Giang, trong quá trình học trên lớp cũng như làm bài tập lớn, cô đã cung cấp cho chúng em những kiến thức và kỹ năng cơ bản đồng thời có những hướng dẫn và định hướng giúp chúng em hoàn thành bài tập lớn này. PHÂN CÔNG THÀNH VIÊN TRONG NHÓM STT Thành viên Công việc 1 Bùi Đình Cường Phân công công việc Viết template cho class (Thiết kế dữ liệu) Xây dựng phương thức nhập dữ liệu Xây dựng module tìm kiếm (tuần tự + nhị phân) Đễ xuất giải thuật tính toán thời gian thực tế, giải thuật cấp phát động Tổng hợp báo cáo 2 Lại Ngọc Ánh Tính toán giá trị trung bình trong ADT Độ phức tạp và thời gian tính toán thực tế Viết hướng dẫn sử dụng 3 Lê Đình Cường Tính toán độ lệch giữa hai phần tử trong ADT Tính toán độ lệch toàn bộ ADT 4 Phạm Thành Công Tìm kiếm giá trị cực đại và vị trí giá trị đó trong ADT Tìm kiếm giá trị cực tiểu và vị trí giá trị đó trong ADT
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ──────── * ─────── BÀI TẬP LỚN MÔN: KỸ THUẬT LẬP TRÌNH Đề tài: Thao tác trên ADT Sinh viên thực hiện: Bùi Đình Cường Lại Ngọc Ánh Phạm Thành Công Nguyễn Văn Quang Lê Đình Cường Lớp : TTM – K53 Giáo viên hướng dẫn : TS. Vũ Thị Hương Giang Hà Nội, tháng 5 năm 2012 Kỹ thuật lập trình MỤC LỤC MỤC LỤC 2 LỜI NÓI ĐẦU 3 PHÂN CÔNG THÀNH VIÊN TRONG NHÓM 4 Nhiệm vụ chung: 4 PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP 5 CHƯƠNG 1. CÀI ĐẶT CHƯƠNG TRÌNH 13 TÀI LIỆU THAM KHẢO 20 PHỤ LỤC 21 Nhóm 35 - Lớp TTM K53 2 Kỹ thuật lập trình LỜI NÓI ĐẦU Một chương trình tốt là chương trình chạy thông, kiểm soát các lỗi tốt, phòng ngừa, bẫy lỗi hiệu quả, dễ dàng và thân thiện với người dùng đồng thời mã nguồn có khả năng tái sử dụng cao, … Đó chỉ là một trong số những phần rất nhỏ mà chúng em học được từ môn Kỹ thuật lập trình. Để cho ra đời một chương trình, sản phẩm phần mềm cần có nhiều qui trình và vòng đời đan xen nhau từ khâu phân tích, thiết kế chương trình, lập trình, kiểm thử, viết tài liệu, … Trong mỗi khâu lại chia ra thành các công đoạn nhỏ đòi hỏi lập trình viên phải tuân thủ. Thông qua bài tập lớn môn Kỹ thuật lập trình, chúng em không những được tìm hiểu sâu hơn về mặt lý thuyết mà còn được trực tiếp vận dụng những kiến thức đã được học trên lớp, những kiến thức đọc nâng cao vào trong một ứng dụng thực tế. Chúng em xin gửi lời cảm ơn chân thành tới cô Vũ Thị Thanh Giang, trong quá trình học trên lớp cũng như làm bài tập lớn, cô đã cung cấp cho chúng em những kiến thức và kỹ năng cơ bản đồng thời có những hướng dẫn và định hướng giúp chúng em hoàn thành bài tập lớn này. Nhóm 35 - Lớp TTM K53 3 Kỹ thuật lập trình PHÂN CÔNG THÀNH VIÊN TRONG NHÓM STT Thành viên Công việc 1 Bùi Đình Cường - Phân công công việc - Viết template cho class (Thiết kế dữ liệu) - Xây dựng phương thức nhập dữ liệu - Xây dựng module tìm kiếm (tuần tự + nhị phân) - Đễ xuất giải thuật tính toán thời gian thực tế, giải thuật cấp phát động - Tổng hợp báo cáo 2 Lại Ngọc Ánh - Tính toán giá trị trung bình trong ADT - Độ phức tạp và thời gian tính toán thực tế - Viết hướng dẫn sử dụng 3 Lê Đình Cường - Tính toán độ lệch giữa hai phần tử trong ADT - Tính toán độ lệch toàn bộ ADT 4 Phạm Thành Công - Tìm kiếm giá trị cực đại và vị trí giá trị đó trong ADT - Tìm kiếm giá trị cực tiểu và vị trí giá trị đó trong ADT 5 Nguyễn Đức Quang - Sắp xếp nổi bọt - Sắp xếp chèn - Sắp xếp trộn Nhiệm vụ chung: - Thiết kế IPO cho module được giao. - Liệt kê các kỹ thuật lập trình đã sử dụng. - Kiểm thử, debug lỗi cho các thành viên khác. Nhóm 35 - Lớp TTM K53 4 Kỹ thuật lập trình PHÂN TÍCH YÊU CẦU VÀ THIẾT KẾ GIẢI PHÁP 0.1. Mô tả yêu cầu bài toán Bài tập lớn có mục tiêu ôn tập lại toàn bộ kiến thức đã học trong môn Kỹ thuật lập trình. Bài tập lớn giúp sinh viên ôn tập và vận dụng các kiến thức đã học từ bước thiết kế chương trình, thiết kế dữ liệu, mô tả giải thuật tới các kỹ năng viết mã nguồn chương trình, debug bắt lỗi chương trình, kiểm thử. Bài tập lớn giúp sinh viên tiếp cận một kiểu dữ liệu mới, kiểu dữ liệu trừu tượng. Kiểu dữ liệu có cả các thuộc tính và phương thức. Ngoài ra, bài tập lớn giúp học sinh ôn lại kiến thức liên quan tới các thuật toán cơ bản: sắp xếp, tìm kiếm, … Yêu cầu cụ thể của bài toán: - Sử dụng tất cả các kỹ thuật đã được học trong môn Kỹ thuật lập trình - Tạo một ADT: Array có thuộc tính là mảng các số thực và số lượng phần tử của mảng đó - Thực hiện các thao tác trên mảng này: o Khởi tạo một phiên bản mới của chính nó o Gán giá trị cho các thành phần thông tin của một đối tương Array o Sắp xếp các phần tử của mảng theo giải thuật bubble sort o Sắp xếp các phần tử của mảng theo giải thuật insertion sort o Sắp xếp các phần tử của mảng theo giải thuật selection sort o Tìm giá trị lớn nhất được lưu trữ trong mảng và vị trí của các phần tử có giá trị lớn nhất trong mảng o Tìm giá trị nhỏ nhất được lưu trữ trong mảng và vị trí của các phần tử có giá trị nhỏ nhất trong mảng o Tìm giá trị trung bình của các phần tử trong mảng o Tìm độ lệch về giá trị giữa 2 phần tử có vị trí biết trước trong mảng o Tìm độ lệch trung bình về giá trị của các phần tử trong mảng o Tìm kiếm (theo giải thuật sequential search) phần tử của mảng có giá trị là x ; nếu tìm thấy thì đưa ra vị trí của phần tử đó trong mảng, nếu không thì trả lại giá trị là 0. o Tìm kiếm (theo giải thuật binary search) phần tử của mảng có giá trị là x ; nếu tìm thấy thì đưa ra vị trí của phần tử đó trong mảng, nếu không thì thông báo là không tìm thấy phần tử như vậy. o Biểu diễn độ phức tạp tính toán theo ký pháp big-O và hiện thị thời gian tính toán thực tế bằng micro-second. - Viết một chương trình cung cấp các chức năng để kiểm tra ADT này; chương trình được lưu trữ trong file CheckArray.cpp. Hàm menu() : gồm các tùy chọn - 1-13: các chức năng tính toán trên mảng - Tùy chọn 1: có menu con cho phép - Nạp thông tin vào từ bàn phím hoặc từ 1 file dữ liệu vào/ra (I/O data file) - Quay lại menu chính Nhóm 35 - Lớp TTM K53 5 Kỹ thuật lập trình - Tùy chọn 2-13: có menu con cho phép - In kết quả ra màn hình hoặc ra 1 file dữ liệu vào/ra (I/O data file) - Quay lại menu chính - 14: thoát khỏi chương trình. 0.2. Biểu đồ IPO 0.2.1. Khởi tạo phiên làm việc mới: INPUT PROCESS OUTPUT Dữ liệu cũ Tạo dữ liệu mới 0.2.2. Gán giá trị cho ADT INPUT PROCESS OUTPUT - Giá trị cần thêm - ADT - Thêm giá trị vào ADT 0.2.3. Sắp xếp INPUT PROCESS OUTPUT - Mảng các phần tử chưa sắp xếp - Sắp xếp theo Buble Sort - Sắp xếp theo Insertion Sort - Sắp xếp theo Selection Sort -Mảng các phần tử đã được sắp xếp theo thứ tự từ nhỏ đến lớn 0.2.4. Tìm giá trị lớn nhất INPUT PROCESS OUTPUT ADT Tìm giá trị lớn nhất và vị trí Giá trị lớn nhất và vị trí của nó 0.2.5. Tìm giá trị nhỏ nhất INPUT PROCESS OUTPUT ADT Tìm giá trị nhỏ nhất và Giá trị nhỏ nhất và vị trí Nhóm 35 - Lớp TTM K53 6 Kỹ thuật lập trình vị trí của nó 0.2.6. Tìm giá trị trung bình của mảng INPUT PROCESS OUTPUT ADT Tìm giá trị trung bình Giá trị trung bình các phần tử trong ADT 0.2.7. Tìm độ lêch giữa 2 phần tử trong mảng INPUT PROCESS OUTPUT Vị trí phần tử thứ 1, vị trí phần tử thứ 2, ADT Tính độ lệch giá trị của hai phần tử Hiệu của 2 phần tử đầu vào 0.2.8. Tính độ lệch trung bình của các phần tử trong mảng INPUT PROCESS OUTPUT ADT - Tinh độ lệch cho toàn bộ dữ liệu - Tính trung bình Độ lệch trung bình của các phần tử trong mảng 0.2.9. Tìm kiếm INPUT PROCESS OUTPUT - ADT - Giá trị phần tử cần tìm - Tìm kiếm tuần tự - Tìm kiếm nhị phân - Số lượng phần tử có giá trị cần tìm - Vị trí các phần tử có giá trị ấy (Với tìm kiếm tuần tự) 0.2.10. Biểu diễn theo dạng Big-O, hiển thị thời gian tính theo thực tế INPUT PROCESS OUTPUT Nhóm 35 - Lớp TTM K53 7 Kỹ thuật lập trình ADT - Thực hiện các module với cùng một dữ liệu đầu vào - Tính toán thời gian - Độ phức tạp - Thời gian thực tế 0.2.11. Thoát INPUT PROCESS OUTPUT Đóng các dữ liệu đang mở Nhóm 35 - Lớp TTM K53 8 Kỹ thuật lập trình 0.3. Thiết kế chương trình 0.4. Thiết kế dữ liệu Với kiểu dữ liệu ADT gồm các thuộc tính và phương thức đã trình bày phần mô tả yêu cầu bài toán, chúng em đã quyết định dùng lớp (class) để thể hiện cấu trúc dữ liệu. Cụ thể: class Array { private: // Khai bao du lieu cua doi tuong double *arrayItems; // Con tro tro toi vung luu tru cac so thuc int count; // So luong cac gia tri da luu tru trong mang private: // Mang luu tru cac vi tri tim kiem duoc int *position; int countAlloc; // So lan cap phat dong public: //////////////////////////////////////////////////////////////////////////////////////////////////// // Phuong thuc khoi tao mac dinh //////////////////////////////////////////////////////////////////////////////////////////////////// Array(void); //////////////////////////////////////////////////////////////////////////////////////////////////// // Phuong thuc huy //////////////////////////////////////////////////////////////////////////////////////////////////// ~Array(void); //////////////////////////////////////////////////////////////////////////////////////////////////// Nhóm 35 - Lớp TTM K53 9 Nhập dữ liệu Xuất dữ liệu Tính toán Khởi tạo ADT Khởi tạo ADT Chương trình làm việc với ADT Chương trình làm việc với ADT Tìm kiếm Tìm kiếm Sắp xếp Sắp xếp Từ bàn phím Từ bàn phím Từ file Từ file Nhị phân Nhị phân Chèn Chèn Nổi bọt Nổi bọt Cực tiểu và vị trí Cực tiểu và vị trí Cực đại và vị trí Cực đại và vị trí Thời gian tính toán thực tế Thời gian tính toán thực tế Ra file Ra file Ra màn hình Ra màn hình Tuần tự Tuần tự Chọn Chọn Giá trị trung bình Giá trị trung bình Độ lệch Độ lệch Kỹ thuật lập trình // Khoi tao mot doi tuong moi //////////////////////////////////////////////////////////////////////////////////////////////////// void NewObj(); //////////////////////////////////////////////////////////////////////////////////////////////////// // Gan gia tri cho mot phan tu cua mang arrayItems // Parameter: double item : phan tu can them vao mang arrayItems // Return: true > neu them thanh cong // false > That bai //////////////////////////////////////////////////////////////////////////////////////////////////// bool AddValue(double item); //////////////////////////////////////////////////////////////////////////////////////////////////// // Hoan vi hai phan tu a va b //////////////////////////////////////////////////////////////////////////////////////////////////// void swap(double &a, double &b); //////////////////////////////////////////////////////////////////////////////////////////////////// // Sap xep theo bubble sort // Return: + true > neu sap xep thanh cong // + false > neu mang rong //////////////////////////////////////////////////////////////////////////////////////////////////// bool SortByBubbleSort(); //////////////////////////////////////////////////////////////////////////////////////////////////// // Sap xep theo insertion sort // Return: + true > neu sap xep thanh cong // + false > neu mang rong //////////////////////////////////////////////////////////////////////////////////////////////////// bool SortByInsertionSort(); //////////////////////////////////////////////////////////////////////////////////////////////////// // Sap xep theo selection sort // Return: + true > neu sap xep thanh cong // + false > neu mang rong //////////////////////////////////////////////////////////////////////////////////////////////////// bool SortBySelectionSort(); //////////////////////////////////////////////////////////////////////////////////////////////////// // Tim kiem phan tu lon nhat va vi tri cua no // Parameter: double &value : gia tri tim duoc // int &num > so luong cac vi tri lon nhat // Return: + Mang chua vi tri cua cac phan tu tim duoc // + null neu mang chua co phan tu nao //////////////////////////////////////////////////////////////////////////////////////////////////// int * FindMaxValueAndItsPosition(double &value, int &num); //////////////////////////////////////////////////////////////////////////////////////////////////// // Tim kiem phan tu lon nhat va vi tri cua no // Parameter: double &value : gia tri tim duoc // int &num > so luong cac vi tri nho nhat // Return: + Mang chua vi tri cua cac phan tu tim duoc // + null neu mang chua co phan tu nao //////////////////////////////////////////////////////////////////////////////////////////////////// int * FindMinValueAndItsPosition(double &value, int &num); //////////////////////////////////////////////////////////////////////////////////////////////////// // Tinh gia tri trung binh cac phan tu trong mang // Parameter: double &value: Gia tri trung binh cac phan tu trong mang // Return: + true > neu mang ton tai // + false > mang rong //////////////////////////////////////////////////////////////////////////////////////////////////// bool CalculateAverageValue(double &value); Nhóm 35 - Lớp TTM K53 10 [...]... K53 28 Kỹ thuật lập trình Hình 16 Sắp xếp chèn Nhóm 35 - Lớp TTM K53 29 Kỹ thuật lập trình Hình 17 Sắp xếp chọn Hình 18 Tìm cực đại và vị trí Nhóm 35 - Lớp TTM K53 30 Kỹ thuật lập trình Hình 19 Tìm cực tiểu và vị trí Hình 20 Tính giá trị trung bình Nhóm 35 - Lớp TTM K53 31 Kỹ thuật lập trình Hình 21 Tính độ lệch giữa hai phần tử Hình 22 Tìm kiếm tuần tự Nhóm 35 - Lớp TTM K53 32 Kỹ thuật lập trình Hình... chương trình hoặc sẽ thực hiện đồng thời cả hai thao tác: ghi ra màn hình và file File đầu ra có thể do người dùng nhập, nếu không sẽ là một file mặc định nào đó, ví dụ: out.txt Hình thức ghi file này như ghi log cho một server, khi người dùng thực hiện một thao tác nào đó thì thao tác đó được ghi lại Nhóm 35 - Lớp TTM K53 19 Kỹ thuật lập trình TÀI LIỆU THAM KHẢO [1] Slide môn Kỹ thuật lập trình của... 24 Kỹ thuật lập trình Hình 10 Chức năng tìm giá trị trung bình các phần tử trong mảng Hình 11 Chức năng tìm kiếm kiểu tuần tự Nhóm 35 - Lớp TTM K53 25 Kỹ thuật lập trình Hình 12 Chức năng tìm kiếm nhị phân Hình 13 Độ phức tạp và thời gian tính toán thực tế Nhóm 35 - Lớp TTM K53 26 Kỹ thuật lập trình Xuất dữ liệu ra file đầu ra Hình 14 Nhập dữ liệu từ bàn phím Nhóm 35 - Lớp TTM K53 27 Kỹ thuật lập trình. .. cho mỗi chức năng, do đó thời gian tính toán sẽ thể hiện sự so sánh một cách khách quan hơn Nhóm 35 - Lớp TTM K53 12 Kỹ thuật lập trình CHƯƠNG 1 CÀI ĐẶT CHƯƠNG TRÌNH 1.1 Các kỹ thuật lập trình đã áp dụng STT I Các kỹ thuật làm việc với biến II Các kỹ thuật viết mã chương trình hiệu quả Kỹ thuật / quy tắc 1 Khai báo biến: - Đặt tên bắt đầu bằng chữ cái viết thường tiếp theo là chữ cái, chữ số hoặc ký tự... LUẬN VÀ HƯỚNG PHÁT TRIỂN Bài tập lớn đã giải quyết được vấn đề thao tác trên ADT, thực hiện đầy đủ chức năng chương trình yêu cầu, sử dụng các kỹ thuật lập trình đã được học Tuy nhiên, giao diện thực hiện chương trình theo mô tả của đầu bài mang lại nhiều khó khăn và bất tiện tới cách giao tiếp với chương trình Cụ thể: khi thực hiện một thao tác, người dùng lại phải chọn hình thức hiển thị (ra màn hình... khác là dữ liệu được nhập từ file Hình 24 Nhập dữ liệu từ file Nhóm 35 - Lớp TTM K53 33 Kỹ thuật lập trình Hình 25 Tìm cực đại và vị trí Hình 26 Tìm cực tiểu và vị trí Nhóm 35 - Lớp TTM K53 34 Kỹ thuật lập trình Hình 27 Tính giá trị trung bình Hình 28 Tính độ lệch toàn bộ ADT Nhóm 35 - Lớp TTM K53 35 Kỹ thuật lập trình Hình 29 Tìm kiếm tuần tự Hình 30 Tìm kiếm nhị phân Nhóm 35 - Lớp TTM K53 36 ... hoặc ra file đầu ra) Nhóm 35 - Lớp TTM K53 21 Kỹ thuật lập trình DANH MỤC CÁC HÌNH Nhập dữ liệu từ bàn phím Xuất dữ liệu ra màn hình Hình 4 Chức năng nhập dữ liệu từ bàn phím Hình 5 Chức năng sắp xếp kiểu nổi bọt Nhóm 35 - Lớp TTM K53 22 Kỹ thuật lập trình Hình 6 Chức năng sắp xếp chèn Hình 7 Chức năng sắp xếp chọn Nhóm 35 - Lớp TTM K53 23 Kỹ thuật lập trình Hình 8 Chức năng tìm giá trị cực đại và... 17 Kỹ thuật lập trình Hình 3 Giao diện ví dụ một chức năng Khi thực hiện một chức năng: - Cho phép người dùng chọn cách hiển thị kết quả đầu ra( Trên màn hình hoặc ra file) - Nếu chọn đầu ra là File Yêu cầu người dùng nhập tên file đầu ra - Mặc định đầu ra ban đầu là màn hình // Dua ra man hinh #define OUTMONITOR Nhóm 35 - Lớp TTM K53 1 18 Kỹ thuật lập trình KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Bài tập lớn. .. break và continue 4 Một số kỹ thuật khác - Viết mã nguồn rõ ràng, mạch lạc - Chú thích các phần hợp lý, rõ ràng, dễ hiểu 1 Nguyên tắc chung: - Đơn giản, trực tiếp, rõ ràng - Có cấu trúc tốt: tránh hoàn toán dùng goto Toàn bộ chương trình Nhóm 35 - Lớp TTM K53 Toàn bộ chương trình Toàn bộ chương trình 14 Kỹ thuật lập trình IV Các kỹ thuật xây dựng hàm/thủ tục Toàn bộ chương trình 1 Bẫy lỗi: - Dùng hàm... quá trình xử lý - Toàn bộ chương trình 1 Chương trình có cấu trúc rõ ràng 2 Cung cấp đầy đủ tài liệu liên quan đến cấu trúc dữ liệu sử dụng trong chương trình, ý nghĩa các thuộc tính, tham số vào ra, giá trị trả về, ý nghĩa của một hàm 3 Chú thích rõ ràng có ý nghĩa - Toàn bộ chương trình Toàn bộ chương trình Nhóm 35 - Lớp TTM K53 - - Toàn bộ chương 15 Kỹ thuật lập trình 4 Module hóa chương trình trình . lỗi hiệu quả, dễ dàng và thân thiện với người dùng đồng thời mã nguồn có khả năng tái sử dụng cao, … Đó chỉ là một trong số những phần rất nhỏ mà chúng em học được từ môn Kỹ thuật lập trình mà còn được trực tiếp vận dụng những kiến thức đã được học trên lớp, những kiến thức đọc nâng cao vào trong một ứng dụng thực tế. Chúng em xin gửi lời cảm ơn chân thành tới cô Vũ Thị Thanh