Thực hiện các yêu cầu sau trong một chương trình dạng Console Application bằng C++.
Định nghĩa một cấu trúc dữ liệu đơn giản (struct
) để lưu trữ thông tin về học sinh, bao gồm:
:bulb: Bạn có thể sử dụng lớp string
(trong thư viện <string>
) để lưu chuỗi.
Viết một hàm để nhập thông tin của một học sinh từ bàn phím và trả về một đối tượng học sinh.
Viết một hàm để tính điểm trung bình của một học sinh (trung bình cộng của 5 môn).
Viết một hàm để hiển thị thông tin của một học sinh ra màn hình với mẫu: Hoc sinh Nguyen Van A (STT 20 - Lop 10A1) co DTB cac mon la 8.2
Viết một hàm để đánh giá xếp loại của một học sinh dựa trên điểm trung bình:
Xuat sac
.Gioi
.Kha
.Trung binh
.Yeu
.Trong hàm main()
:
:bulb: Để khai báo mảng, học viên vui lòng tìm hiểu thêm về mảng trong C++:
Dưới đây là dữ liệu mẫu:
STT | Họ và tên | Lớp | Giới tính | Điểm Toán | Điểm Văn | Điểm Anh | Điểm Lý | Điểm Hoá |
---|---|---|---|---|---|---|---|---|
1 | Nguyễn Văn A | 10A1 | Nam | 4.5 | 7.5 | 6.0 | 5.0 | 2.5 |
2 | Trần Thị B | 10A1 | Nữ | 7.0 | 8.0 | 9.0 | 6.5 | 8.5 |
3 | Phạm Văn C | 10A1 | Nam | 9.0 | 9.5 | 9.0 | 10.0 | 8.5 |
4 | Lê Thị D | 10A1 | Nữ | 6.5 | 7.0 | 8.0 | 7.5 | 6.0 |
5 | Hoàng Văn E | 10A1 | Nam | 1.0 | 2.5 | 3.5 | 4.0 | 3.0 |
6 | Mai Thị F | 10A1 | Nữ | 9.5 | 9.0 | 9.0 | 9.5 | 10.0 |
7 | Đỗ Văn G | 10A1 | Nam | 8.5 | 9.0 | 6.0 | 7.5 | 8.0 |
8 | Nguyễn Thị H | 10A1 | Nữ | 6.0 | 6.5 | 8.0 | 6.0 | 5.5 |
9 | Trần Văn I | 10A1 | Nam | 8.0 | 7.5 | 9.0 | 6.5 | 6.5 |
10 | Phạm Thị K | 10A1 | Nữ | 8.0 | 8.0 | 7.5 | 8.5 | 9.0 |
Thực hiện các yêu cầu sau trong một chương trình dạng Console Application bằng C++.
Hãy cài đặt các lớp đối tượng theo như sơ đồ sau:
:bulb: Yêu cầu cài đặt: Các thuộc tính phải là private
và có getters, setters cho từng thuộc tính.
Trong bài tập này, bạn sẽ tự tạo lại một lớp vector
của riêng bạn (gọi là MyVector
), bắt chước một số đặc tính có sẵn của lớp vector
có sẵn trong STL (đương nhiên không cần làm lại toàn bộ).
Yêu cầu chung:
MyVector
sẽ chứa các số nguyên int
.private
MyVector()
: Sức chứa ban đầu là 0MyVector(int cap)
: Sức chứa ban đầu là cap
và các phần tử đều là 0.MyVector(int cap, int x)
: Khởi tạo mảng với sức chứa ban đầu là cap
và các phần tử đều gán là x
MyVector(int* a, int N)
: Khởi tạo mảng với sức chứa ban đầu là N
và các phần tử sao chép lại các phần tử từ mảng a
.MyVector(const MyVector& m)
: Sao chép vector m
để tạo ra vector mới (sức chứa đúng bằng m.size()
)int size()
: Lấy kích thước hiện tạiint cap()
: Lấy sức chứa hiện tạiint get(int id)
: Lấy phần tử tại vị trí id
int set(int id, int x)
: Gán phần tử tại vị trí id
giá trị x
void add(int x)
: Thêm phần tử x
vào cuối mảngvoid remove(int id)
: Xoá phần tử ở vị trí id
void delete(int x, int c = 1)
: Xoá c
phần tử x
trong mảng (từ trái sang), với c
mặc định là 1 (chỉ xoá 1 phần tử)void insert(int id, int x)
: Chèn phần tử x
vào vị trí id
int find(int x, int from = 0)
: Tìm phần tử x
trong mảng, nếu có trả về vị trí, nếu không tìm được trả về -1 (tham số from
chỉ vị trí bắt đầu tìm kiếm, mặc định là tìm từ đầu mảng from = 0
)void resize(int N)
: Thay đổi kích thước hiện tại (nới rộng hoặc thu hẹp), nếu thu hẹp thì các phần tử dư ra bị loại bỏ, nếu nới rộng thì các phần tử mới sẽ được khởi gán bằng 0.MyVector sub(int i, int l)
: Tạo ra một vector mới sao chép một đoạn con trong vector cũ từ chỉ số i
đến chỉ số i+l-1
(tức là mảng con này có đúng l
phần tử)vector
của C++ và cài thêm một số phương thức nữa nếu muốn.Trang trại gia súc của Mc Donald có nuôi một số các con vật sau: Vịt, Cừu, Bò.
Các con vật này đều có thể phát ra tiếng kêu đặc trưng. Tất cả các con vật được nuôi đều là giống cái.
Bạn được chỉ định thực hiện các yêu cầu sau:
:bulb: Một số lưu ý:
Random
được cài sẵn trong C#.List
.Do mở rộng quy mô, trang trại gia súc của Mc Donald đang cần một phần mềm để quản lý thông tin của các gia súc đang được chăn nuôi.
Trong bài tập tuần này, bạn được yêu cầu thiết kế ra một phần mềm giao diện đơn giản để:
Dưới đây là giao diện bạn cần phải thiết kế được sau bài tập này (bạn có thể thiết kế khác đi, tuy nhiên vẫn phải đảm bảo được các chức năng nêu trên)
Một số ràng buộc về tính năng:
MessageBox
để cảnh báo người dùng xem có muốn ghi đè không.:bulb: Một số lưu ý:
MessageBox
ngoài việc chỉ hiển thị ra thông điệp đơn giản còn có thể hiển thị kèm các nút bấm như OK
, Cancel
, biểu tượng cảnh báo,… bạn có thể tìm hiểu thêm các overloading trong phương thức Show
của lớp này.Grid
chứa StackPanel
(bên trái) và ListBox
(bên phải).
ComboBox
. Ở ví dụ dưới đây, ta có thể lấy chỉ số của mục đang được chọn nhờ thuộc tính cmbKind.SelectedIndex
Items
của ListBox
(thuộc tính này sử dụng như một List
thông thường).
Tạm gác việc xây dựng giao diện cho ứng dụng của nông trại Mc Donald. Trong bài tập tuần này, Mc Donald đang yêu cầu sự giúp đỡ của bạn để giải quyết vấn đề về phả hệ cho đàn gia súc của ông ta, cụ thể như sau:
B001
, C001
, V001
,… với chữ cái đứng đầu đại diện cho mỗi loài)Bạn sẽ dùng các mẫu thiết kế hướng đối tượng thuộc nhóm tạo lập (Creational Patterns) để tạo ra một ứng dụng Console Application hoặc WPF Application, cài đặt các lớp liên quan để thực hiện một số ràng buộc sau:
B013
phải hiện ra cha là bò B002
, mẹ là bò B003
, các anh-chị-em là B012
, B010
, B011
(ở đây là cùng cha khác mẹ), và có 1 con là B017
):bulb: Một số gợi ý:
Công ty in ấn sách nhận được đơn hàng in sách số lượng lớn. Công ty nhận được một số bản mẫu và được yêu cầu in ra số lượng bản sao theo yêu cầu với mỗi bản sao sẽ được đánh một số thứ tự riêng biệt với các bản sao khác của cùng một bản mẫu.
Hãy thiết kế một chương trình sử dụng mẫu thiết kế Prototype và Factory để giải quyết vấn đề này. Chương trình cần có các yêu cầu sau:
BookPrototype
đại diện cho bản mẫu của một cuốn sách, có các thuộc tính như title
(tiêu đề sách), author
(tác giả), category
(thể loại).BookFactory
để tạo ra các bản sao của các cuốn sách từ bản mẫu (BookPrototype
). Mỗi cuốn sách khi được in sẽ được đánh số thứ tự riêng biệt (ví dụ: Book 001, Book 002, …).Giả sử bạn có một ứng dụng chuyên dịch tiếng Việt sang tiếng Anh (bạn có sẵn hàm translateVietnameseToEnglish(string text)
đã được cài đặt rất kỳ công trong mã nguồn.
Một ngày nọ bạn có mua được một thư viện chuyên dịch từ Tiếng Anh sang nhiều ngôn ngữ khác nhau (tiếng Hàn, tiếng Tây Ban Nha, tiếng Trung Quốc, tiếng Nhật Bản). Thư viện này cung cấp sẵn một lớp (TranslationEngService
) chứa các phương thức tĩnh như translateEnglishToKorean(string text)
,… Bạn muốn mở rộng ứng dụng của bạn để hỗ trợ dịch từ Tiếng Việt sang các ngôn ngữ khác. Hãy sử dụng mẫu thiết kế Adapter để chuyển đổi từ Tiếng Việt sang Tiếng Anh và sử dụng với thư viện hiện có.
Giả sử bạn đang xây dựng một ứng dụng quản lý tác vụ (Task Management) với nhiều loại tác vụ khác nhau mà trong đó mỗi tác vụ có thể được thực hiện bằng nhiều phương thức triển khai khác nhau, chẳng hạn như triển khai qua email, triển khai qua file, gửi tin nhắn. Hãy sử dụng mẫu thiết kế Bridge để kết nối tác vụ với các phương thức thực hiện.
Yêu cầu:
AbstractTask
với phương thức abstract executeTask()
.ConcreteTask1
, ConcreteTask2
, ConcreteTask3
chỉ các loại công việc cụ thể kế thừa từ AbstractTask
và triển khai phương thức executeTask()
theo cách khác nhau.Implementor
với phương thức abstract doImplementation()
.EmailImplementor
, FileImplementor
, SMSImplementor
triển khai Implementor
với cách thức thực hiện khác nhau.Giả sử bạn đang xây dựng một ứng dụng gửi tin nhắn và bạn muốn mở rộng chức năng gửi tin nhắn bằng cách thêm tính năng mã hóa tin nhắn trước khi gửi. Hãy sử dụng mẫu thiết kế Decorator để thực hiện tính năng này.
Yêu cầu:
MessageSender
với phương thức sendMessage(string message)
.SMSMessageSender
triển khai MessageSender
với phương thức sendMessage()
để gửi tin nhắn văn bản.MMSMessageSender
triển khai MessageSender
với phương thức sendMessage()
để gửi tin nhắn có chứa tập tin đa phương tiện (media).BaseMessageEncryptorDecorator
triển khai MessageSender
với phương thức sendMessage()
để mã hóa tin nhắn trước khi gửi. Ngoài ra có 2 lớp kế thừa nó ứng với 2 phương thức mã hoá là Method1MessageEncryptorDecorator
và Method2MessageEncryptorDecorator
.Bạn là chủ của một cửa hàng bán lẻ máy tính và muốn xây dựng một hệ thống để tính tổng giá của các đơn hàng mà khách hàng đặt. Cửa hàng của bạn cung cấp các mặt hàng đơn lẻ như laptop, chuột, bàn phím và cũng có các gói sản phẩm đã được xây dựng trước như "Bộ máy tính gaming", "Bộ máy tính văn phòng", v.v. Bạn muốn khách hàng có thể chọn mua các mặt hàng đơn lẻ hoặc các gói sản phẩm.
Yêu cầu:
Ví dụ cụ thể:
Bạn là một nhà phân phối vé máy bay và muốn tạo ra một hệ thống đơn giản để giúp khách hàng đặt vé một cách dễ dàng và tiện lợi. Hệ thống của bạn cần gồm ba phần chính:
Yêu cầu:
BookingFacade
: che giấu sự phức tạp của các hệ thống con. Lớp này sẽ cung cấp 1 phương thức là bool BookFlight(string[] seats, string card, string passenger)
(danh sách mã ghế - seats
, mã thẻ thanh toán card
và mã hành khách passenger
) để khách hàng có thể đặt vé máy bay một cách dễ dàng mà không cần quan tâm đến các bước chi tiết.FlightBookingSystem
(hệ thống đặt vé máy bay) - có 3 phương thức là bool CheckAvailability(string seat)
để kiểm tra xem ghế còn không; decimal CalculatePrice(string seat)
để kiểm tra giá vé cho ghế mã seat
, trả về số tiền cần thanh toán; và void BookASeet(string seat, string passenger)
để ghi lại ghế seat
đã được hành khách passenger
đặt thành công.PaymentSystem
(hệ thống thanh toán) - có phương thức bool Charge(string card, decimal amount)
để thanh toán số tiền amount
từ thẻ card
.ConfirmationSystem
(hệ thống xác nhận đơn hàng) - có phương thức void SendComfirmation(string seat, decimal amount, string passenger)
.Bạn đang phát triển một trò chơi máy tính với nhiều đối tượng như quái vật hoặc vật phẩm. Mỗi đối tượng này có các thuộc tính như tốc độ, hình dạng, hướng di chuyển, v.v. Trong trường hợp các đối tượng có nhiều phiên bản giống nhau xuất hiện nhiều lần trong một bản đồ, việc tạo mới các đối tượng này mỗi lần chúng xuất hiện sẽ tốn nhiều bộ nhớ.
Yêu cầu:
Bạn đang phát triển một ứng dụng quản lý tệp tin trong hệ thống. Trong hệ thống này, có nhiều tệp tin có độ nhạy cảm và yêu cầu quyền truy cập đặc biệt. Bạn muốn sử dụng mẫu Proxy để kiểm soát quyền truy cập vào các tệp tin này, chỉ cho phép người dùng có quyền hợp lệ truy cập và từ chối người dùng không có quyền.
Yêu cầu:
Ví dụ cụ thể
Người dùng A yêu cầu truy cập vào tệp tin "financial_data.xlsx".
Người dùng B yêu cầu truy cập vào tệp tin "confidential_report.pdf".
Trong một ứng dụng quản lý tệp tin, người dùng thường thực hiện các tác vụ như mở, đóng, sao chép và dán tệp tin. Mẫu Command giúp chúng ta quản lý các lệnh này một cách linh hoạt và dễ mở rộng (có khả năng thêm các loại lệnh mới mà không cần sửa đổi nhiều mã nguồn hiện có).
Yêu cầu:
Mẫu thiết kế Iterator được sử dụng để cung cấp một cách truy cập tuần tự và không cần biết cấu trúc bên trong của một tập hợp đối tượng. Ngữ cảnh thường là khi chúng ta muốn duyệt qua các phần tử của một tập hợp (ví dụ: danh sách, mảng, cây) mà không cần phải biết chi tiết về cách tập hợp được triển khai.
Yêu cầu:
FibonacciNumbers
lưu lại thông tin về dãy số Fibonacci. (Hãy xem qua Định nghĩa dãy số Fibonacci trên Wikipedia)FibonacciIterator
để duyệt qua các phần tử của một tập hợp số Fibonacci. Lớp Iteratornày sẽ cung cấp các phương thức như next()
để truy cập phần tử tiếp theo, và hasNext()
để kiểm tra xem còn phần tử nào khác không.Sử dụng như sau:
Trong một hệ thống nhà thông minh, chúng ta có các thiết bị như đèn và quạt cần điều khiển từ một trung tâm thông minh. Mẫu Mediator giúp chúng ta tạo ra một đối tượng trung gian (Mediator) để điều khiển các thiết bị này một cách linh hoạt và giảm sự phụ thuộc giữa các thiết bị.
Yêu cầu:
Trong một trò chơi, người chơi thường muốn có khả năng lưu trữ trạng thái hiện tại của trò chơi để sau này có thể khôi phục lại nếu cần. Mẫu thiết kế Memento giúp chúng ta lưu trữ và khôi phục trạng thái của trò chơi một cách linh hoạt và dễ dàng.
Yêu cầu: Trong ví dụ này, chúng ta sẽ tạo một trò chơi lưu trữ trạng thái số điểm và cấp độ của người chơi, sử dụng mẫu thiết kế Memento để lưu trữ và khôi phục trạng thái của trò chơi.
The SOLID acronym stands for:
Bạn được yêu cầu thiết kế một hệ thống đơn giản để quản lý thông báo cho các người dùng trong một mạng xã hội đơn giản. Các thông báo này được gửi đi từ một người dùng đến các người dùng khác (có đăng ký nhận thông báo từ người dùng đó). Hệ thống cần có khả năng:
:bulb: Một người vừa có thể là Pushlisher
cũng có thể là Subcriber
của một Pushlisher
khác. Một người có thể đăng ký nhận thông báo từ nhiều Pushlisher
. (Hãy nghĩ về mạng xã hội Facebook hoặc Instagram)
Bạn được yêu cầu thiết kế một hệ thống quản lý đặt hàng đơn giản cho một cửa hàng trực tuyến. Hệ thống này sẽ có các trạng thái khác nhau của đơn hàng từ khi được tạo đến khi được giao hàng hoặc hủy bỏ. Các trạng thái bao gồm:
Hệ thống cần có khả năng hiển thị trạng thái hiện tại của đơn hàng.
:bulb: Ví dụ mẫu:
Bạn được yêu cầu thiết kế một hệ thống đơn hàng online đơn giản cho một cửa hàng bán hàng điện tử. Hệ thống này sẽ có các chức năng cơ bản như sau:
Hệ thống cần có khả năng:
:bulb: Ví dụ sử dụng
Nêu ra một ví dụ không tuân thủ nguyên tắc và đề xuất cách chữa.
Nêu ra một ví dụ không tuân thủ nguyên tắc và đề xuất cách chữa.
Cài đặt vào minh hoạ sơ đồ lớp dưới đây
Trong bài toán này, chúng ta cần thiết kế một hệ thống quản lý dịch vụ bảo dưỡng cho các phương tiện giao thông, bao gồm các loại ô tô, xe tải và xe máy. Mỗi phương tiện sẽ được kiểm tra bởi một nhà kiểm tra (VehicleInspector
) - đây là người sẽ tính toán phí bảo dưỡng cho mỗi loại phương tiện và tổng phí bảo dưỡng cho tất cả các phương tiện.
Dưới đây là cách tính chi phí bảo dưỡng cho mỗi loại phương tiện trong ví dụ này:
Car
(thông tin gồm color
và manufactureDate
): Chi phí bảo dưỡng cho mỗi chiếc xe ô tô sẽ phụ thuộc vào màu sơn của xe. Nếu màu sơn là "Black", chi phí sẽ là 100 đơn vị, nếu không, chi phí sẽ là 50 đơn vị.Van
(thông tin gồm storageCapacity
và numberOfDoors
): Chi phí bảo dưỡng cho mỗi chiếc xe tải sẽ phụ thuộc vào số cửa của xe. Nếu số cửa lớn hơn 4, chi phí sẽ là 500 đơn vị, nếu không, chi phí sẽ là 100 đơn vị.Motorbike
(thông tin gồm engineCapacity
và brand
): Chi phí bảo dưỡng cho mỗi chiếc xe máy sẽ phụ thuộc vào dung tích xi-lanh của động cơ. Nếu dung tích xi-lanh lớn hơn hoặc bằng 200, chi phí sẽ là 200 đơn vị, nếu không, chi phí sẽ là 50 đơn vị.Giả sử ta có 3 chiếc xe:
Dưới đây là sơ đồ lớp (chỉ mang tính tham khảo, chưa đúng với chuẩn UML)
Trong ngữ cảnh rút tiền từ máy ATM, ta có thể ứng dụng mô hình này vào việc xử lý các mệnh giá tiền trả về cho người rút, xem minh hoạ dưới đây:
Ví dụ bạn cần rút 5.000.000Đ, máy ATM chỉ còn lại một số loại tiền với số tờ còn lại tương ứng là: 200.000Đ - 10 tờ, 100.000Đ - 20 tờ. Trong tình huống này, việc rút tiền thất bại do máy không còn đủ tiền chi trả. Hãy xem mỗi khay đựng một mệnh giá là một "chain", hãy sử dụng mô hình này để cài đặt cho bài toán vừa nêu.
Hãy áp dụng mẫu thiết kế Abstract Factory để tạo ra các loại nội thất với chủng loại và kiểu dáng như trong mô tả dưới đây:
Học viên tự xem lại ví dụ đã được trình bày trong lớp học.
Học viên sẽ được cung cấp nội dung tóm tắt và PDF của quyển Design Patterns: Elements of Reusable Object-Oriented Software (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides).
Tạo một đồng hồ đếm ngược và sử dụng delegate để thông báo một thông điệp cho bất kỳ ai đã "đăng ký" khi đồng hồ chạy hết thời gian. Trong bài tập này, bạn cần cài đặt một lớp đồng hồ đếm ngược nhận vào thông điệp và thời gian đồng hồ cần chạy. Sau khi chạy hết thời gian, bạn sẽ gọi delegate và truyền vào thông điệp để thông báo cho các observers.
Hãy sử dụng biểu thức lambda cho bài tập trên.
:bulb: Hãy sử dụng phương thức Thread.Sleep()
để tạo đồng hồ đếm ngược.
Trong bài tập tuần này, bạn được yêu cầu viết kiểm thử đơn vị cho lớp PhanSo
. Biết rằng trong lớp này, bạn phải cài đặt các phương thức (số trong dấu ngoặc thể hiện cho số yêu cầu có trong mỗi ý):
1/5
)n
List<PhanSo> DocPhanSo(string inputFile)
)void GhiPhanSo(List<PhanSo> l, string outputFile)
)>
, <
, ==
, >=
, <=
, !=
++
, --
, +
và -
:warning: Chúng ta có tổng cộng 20 yêu cầu.
:warning: Đối với mỗi yêu cầu, bạn cần viết ít nhất 2-3 test cases (bằng framework NUnit)
:bulb: Bạn hãy tham khảo Operator Overloading (nạp chồng toán tử) trong C# để có thể nạp chồng các toán tử trong 10 yêu cầu cuối cùng.
:bulb: Ở các yêu cầu viết phương thức cộng, trừ, nhân và chia, bạn cũng có thể cài đặt dưới dạng nạp chồng các toán tử 2 ngôi +
, -
, *
và /
.
:bulb: Cần lưu ý đến các ngoại lệ có thể xảy ra.
ICollection
& IList
InterfacesArray
Bước đầu để xây dựng nên ứng dụng quản lý công việc là thiết kế sơ đồ lớp cho ứng dụng, cũng như xây dựng lược đồ cho cơ sở dữ liệu. Dưới đây là một số câu chuyện người dùng (user stories) thu thập được trong quá trình phân tích yêu cầu. Hãy sử dụng nó để thiết kế sơ lược nên 2 loại sơ đồ trên
…