[Buổi 27][Củng cố OOP cơ bản][HW] Bài 1: Quản lý khóa học có giới hạn đăng ký


LÀM BÀI

Points: 100
Time limit: 1.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

Quản lý khóa học có giới hạn đăng ký

Bối cảnh

Một hệ thống nhỏ quản lý các khóa học. Mỗi Courseid, capacity và danh sách mã sinh viên đã đăng ký. Course chịu trách nhiệm kiểm soát invariant: số người đăng ký không vượt capacity và một Student ID không được đăng ký trùng.

Hệ thống hỗ trợ:

  • ADD courseId capacity: thêm khóa học mới nếu ID chưa tồn tại và capacity>0.
  • ENROLL courseId studentId: đăng ký nếu course tồn tại, student chưa có và còn chỗ.
  • DROP courseId studentId: hủy đăng ký nếu student đang có trong course.
  • COUNT courseId: in số đang đăng ký hoặc NOT_FOUND.
  • FULL courseId: in YES/NO hoặc NOT_FOUND.

Bài Medium yêu cầu phân chia trách nhiệm: main/manager tìm Course phù hợp; chính Course quyết định enroll/drop/full. Không dùng inheritance hay exception.

Bài tích hợp B27 cần thể hiện rõ trách nhiệm giữa các class. Object nhỏ bảo vệ state cục bộ; class quản lý/aggregate root chịu trách nhiệm tìm object và phối hợp workflow. Một thao tác liên quan nhiều object phải kiểm tra đủ điều kiện trước khi mutation để tránh trạng thái chỉ cập nhật một nửa.

Yêu cầu

  1. Class Course có private state và methods enroll/drop/count/full.
  2. Quản lý nhiều Course bằng vector.
  3. ID course duy nhất.
  4. Mutation in OK/FAIL; query theo format.

Input

Dòng 1 q; q command.

Output

Mỗi command một dòng.

Ràng buộc

1≤q≤5000, capacity≤5000.

Ví dụ 1

Input

10
ADD C1 2
ENROLL C1 S1
ENROLL C1 S2
FULL C1
ENROLL C1 S3
COUNT C1
DROP C1 S1
FULL C1
COUNT C1
DROP C1 X

Output

OK
OK
OK
YES
FAIL
2
OK
NO
1
FAIL

Giải thích

C1 capacity2. Enroll S1,S2 đều OK và FULL trả YES. Enroll S3 fail vì hết chỗ. COUNT=2. Drop S1 thành công làm course còn1 người, FULL đổi thành NO, COUNT=1. Drop X fail vì không có student này.

Ví dụ này cũng kiểm tra trách nhiệm giữa manager và object domain: lookup/điều phối được thực hiện ở lớp quản lý, còn object tự quyết định mutation hợp lệ của state riêng. Vì vậy sau mỗi lệnh, các query tiếp theo phản ánh một trạng thái nhất quán thay vì các field bị sửa rời rạc.

Ví dụ 2

Input

6
ADD C1 1
ADD C1 2
ENROLL C2 S1
COUNT C2
FULL C1
COUNT C1

Output

OK
FAIL
FAIL
NOT_FOUND
NO
0

Giải thích

ADD C1 lần đầu OK, lần hai fail vì trùng ID. ENROLL vào C2 fail vì course không tồn tại; COUNT C2 là NOT_FOUND. C1 chưa có student nên FULL NO và COUNT0.

Ví dụ này cũng kiểm tra trách nhiệm giữa manager và object domain: lookup/điều phối được thực hiện ở lớp quản lý, còn object tự quyết định mutation hợp lệ của state riêng. Vì vậy sau mỗi lệnh, các query tiếp theo phản ánh một trạng thái nhất quán thay vì các field bị sửa rời rạc.

Thông tin học tập

  • Module: M07
  • Buổi: B27
  • Loại bài: HOMEWORK
  • Độ khó: Medium
  • Concepts: class responsibility, private state, vector, lookup, enrollment invariant, command simulation
  • Giới hạn kiến thức: B01-B27
  • Time limit: 1 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo