CSharp

Bottle vs Attendance

Đề thi: Nền tảng và Lập trình hướng đối tượng với C#

Ngày thi: 8/8/2026

Thời gian: từ 8/8/2026 22:00 đến 9/8/2026 23:59:59

*** Điểm trừ: Bài làm giống nhau hoặc copy từ internet, AI***

Nộp bài: Nén tất cả các file .cs vào chung một thư mục đặt theo HoTen.zip hoặc HoTen.rar rồi gửi vào link sau: https://forms.gle/rYAMHu7S4wvsC9nJ9

Bài 1: Chai chứa chất lỏng (5 điểm)

Tạo lớp Bottle để biểu diễn một chai chứa chất lỏng. Các đối tượng Bottle được tạo bằng cách gọi phương thức khởi tạo constructor với một tham số kiểu double capacity, biểu diễn dung tích của chai (tính bằng mililit – mL), tức là lượng chất lỏng tối đa mà chai có thể chứa. Giả sử giá trị này luôn lớn hơn hoặc bằng 0. Khi một đối tượng Bottle được tạo ra, nó sẽ được đổ đầy đến dung tích tối đa. Lớp Bottle có một phương thức tên là UpdateAmount, dùng để cập nhật lượng chất lỏng trong chai. Phương thức này nhận một tham số kiểu double AmoutToBeRemoved, biểu diễn lượng chất lỏng (mL) sẽ bị lấy ra khỏi chai, với điều kiện rằng tham số này luôn lớn hơn 0 và nhỏ hơn hoặc bằng lượng chất lỏng hiện có trong chai. Nếu sau khi cập nhật mà lượng chất lỏng trong chai nhỏ hơn 25% dung tích, thì chai sẽ tự động được đổ đầy lại về mức dung tích ban đầu. Phương thức UpdateAmount sẽ trả về một giá trị kiểu double, biểu diễn lượng chất lỏng còn lại trong chai (mL) sau khi đã cập nhật. Bảng dưới đây minh họa một chuỗi các lệnh thực thi mẫu và kết quả tương ứng. Chuỗi lệnh này được viết trong một lớp khác, không phải lớp Bottle.

CodeTrả vềGiải thích
double amt;
Bottle water = new Bottle(1000.0);Một đối tượng Bottle có tên water được tạo với dung tích 1.000 mL chất lỏng.
amt = water.UpdateAmount(400.0);600.0400 mL được sử dụng, nên còn lại 600 mL trong chai.
amt = water.UpdateAmount(100.0);500.0100 mL được sử dụng, nên còn lại 500 mL trong chai.
amt = water.UpdateAmount(300.0);1000.0300 mL được sử dụng, nên còn lại 200 mL trong chai. Vì lượng này nhỏ hơn 250 mL (25% của 1.000 mL), nên chai được tự động đổ đầy lại và trở về mức ban đầu là 1.000 mL.
Bottle shampoo = new Bottle(40.0);Một đối tượng Bottle có tên shampoo được tạo với dung tích 40 mL chất lỏng.
amt = shampoo.UpdateAmount(30.0);10.030 mL được sử dụng, nên còn lại 10 mL trong chai.
amt = shampoo.UpdateAmount(1.0);40.01 mL được sử dụng, nên còn lại 9 mL trong chai.

Vì lượng này nhỏ hơn 10 mL (25% của 40 mL), nên chai được tự động đổ đầy lại và trở về mức ban đầu là 40 mL.

Bài 2. Tham dự lớp (5 điểm)

Tạo lớp Lớp CourseRecord (2 điểm) được sử dụng để lưu trữ thông tin về một sinh viên đăng ký trong một khóa học. Một phần định nghĩa của lớp CourseRecord được hiển thị bên dưới.

public class CourseRecord{
    /**
    * Returns a unique ID for the student associated with this
    * CourseRecord
    */
    public String GetStudentID()
    { /* implementation not shown */ }
    /**
    * Returns a nonnegative integer representing the number of times the
    * student associated with this CourseRecord has been absent in the
    * course
    */
    public uint GetAbsences()
    { /* implementation not shown */ }
    /* There may be instance variables, constructors, and methods
    that are not shown. */
}

Tạo Lớp Attendance (3 điểm) quản lý hai danh sách (List) các đối tượng CourseRecord, có tên là historyList và mathList. Một phần định nghĩa của lớp Attendance được trình bày bên dưới.

public class Attendance{
    /* The students enrolled in a history course */
    private List<CourseRecord> historyList;
    /* The students enrolled in a math course */
    private List<CourseRecord> mathList;
    /**
    * Returns the number of students who are enrolled in both
    * the history course and the math course but have more
    * absences in the history course than the math course
    * Preconditions:
    * No student ID appears multiple times in historyList.
    * No student ID appears multiple times in mathList.
    * historyList and mathList do not contain any null elements.
    * Postcondition:
    * historyList and mathList are unchanged.
    */
    public int MoreHistoryThanMathAbsences()
    { /* to be implemented */ }
    /* There may be instance variables, constructors, and methods
    that are not shown. */
}

Hãy viết phương thức MoreHistoryThanMathAbsences của lớp Attendance. Phương thức này phải trả về số lượng sinh viên đăng ký cả môn lịch sử và môn toán, nhưng có số lần vắng mặt ở môn lịch sử nhiều hơn so với môn toán. Ví dụ, giả sử historyList và mathList có nội dung như sau.

historyList:
Student IDrc29br98dr03ot32sq98ry00
Number of Absences112231
mathList:
Student IDfr27sq98dr03dk12ot32js33ry00
Number of Absences2121103

Trong ví dụ này, có bốn mã sinh viên ("dr03", "ot32", "sq98" và "ry00") xuất hiện trong cả historyList và mathList. Trong số đó, chỉ có "ot32" và "sq98" có số lần vắng mặt ở môn lịch sử nhiều hơn môn toán, vì vậy phương thức nên trả về giá trị 2.