JavaScript is required
Danh sách đề

Đề thi kết thúc học phần học kì 2 môn Lập trình hướng đối tượng có đáp án chi tiết - Đề 1

4 câu hỏi 90 phút

Thẻ ghi nhớ
Nhấn để lật thẻ
1 / 4

Hãy giải thích và cho ví dụ minh họa các khái niệm tính trừu tượng (Abstraction), Tính bao bọc (Encapsulation) của lập trình hướng đối tượng

Đáp án
Đáp án đúng:

Tính trừu tượng (Abstraction) là việc ẩn đi các chi tiết phức tạp và chỉ hiển thị những thông tin cần thiết.

Ví dụ, khi lái xe, bạn không cần biết động cơ hoạt động thế nào, bạn chỉ cần biết cách điều khiển vô lăng, phanh, ga.

Tính bao bọc (Encapsulation) là việc đóng gói dữ liệu và phương thức vào trong một đơn vị (class) và bảo vệ dữ liệu khỏi sự truy cập trực tiếp từ bên ngoài.

Ví dụ, một lớp 'Ngân hàng' có thuộc tính 'số dư' được bảo vệ và chỉ có thể truy cập thông qua các phương thức 'gửi tiền' và 'rút tiền'.

Danh sách câu hỏi:

Lời giải:

Tính trừu tượng (Abstraction) là việc ẩn đi các chi tiết phức tạp và chỉ hiển thị những thông tin cần thiết.

Ví dụ, khi lái xe, bạn không cần biết động cơ hoạt động thế nào, bạn chỉ cần biết cách điều khiển vô lăng, phanh, ga.

Tính bao bọc (Encapsulation) là việc đóng gói dữ liệu và phương thức vào trong một đơn vị (class) và bảo vệ dữ liệu khỏi sự truy cập trực tiếp từ bên ngoài.

Ví dụ, một lớp 'Ngân hàng' có thuộc tính 'số dư' được bảo vệ và chỉ có thể truy cập thông qua các phương thức 'gửi tiền' và 'rút tiền'.

Lời giải:

Tính kế thừa (Inheritance):

Tính kế thừa là một cơ chế cho phép một lớp (lớp con/lớp dẫn xuất) kế thừa các thuộc tính và phương thức từ một lớp khác (lớp cha/lớp cơ sở). Lớp con sẽ tự động có tất cả các đặc điểm của lớp cha và có thể mở rộng hoặc sửa đổi chúng. Điều này giúp tránh việc lặp lại code, tăng tính tái sử dụng và tổ chức code một cách có hệ thống.

  • Ví dụ: Giả sử ta có lớp Vehicle (Phương tiện) với các thuộc tính chung như brand (Nhãn hiệu), model (Mẫu xe) và phương thức startEngine() (Khởi động động cơ). Ta có thể tạo các lớp con như Car (Ô tô), Motorcycle (Xe máy) kế thừa từ lớp Vehicle. Các lớp CarMotorcycle sẽ tự động có các thuộc tính brand, model và phương thức startEngine(). Ngoài ra, chúng có thể có thêm các thuộc tính và phương thức riêng, ví dụ Car có thêm thuộc tính numberOfDoors (Số cửa) và Motorcycle có thêm thuộc tính hasSidecar (Có thùng xe).

Tính đa hình (Polymorphism):

Tính đa hình cho phép các đối tượng thuộc các lớp khác nhau phản ứng khác nhau đối với cùng một phương thức gọi. Có hai dạng đa hình chính:

  • Đa hình thời gian biên dịch (Compile-time polymorphism) / Nạp chồng (Overloading): Cho phép định nghĩa nhiều phương thức cùng tên nhưng khác nhau về tham số (số lượng, kiểu dữ liệu). Khi gọi phương thức, trình biên dịch sẽ chọn phương thức phù hợp dựa trên tham số truyền vào.

  • Đa hình thời gian chạy (Runtime polymorphism) / Ghi đè (Overriding): Cho phép lớp con định nghĩa lại một phương thức đã có ở lớp cha. Khi gọi phương thức này trên một đối tượng thuộc lớp con, phương thức được định nghĩa trong lớp con sẽ được thực thi.

  • Ví dụ: Tiếp tục với ví dụ trên, lớp Vehicle có phương thức accelerate() (Tăng tốc). Các lớp CarMotorcycle có thể ghi đè phương thức accelerate() để thể hiện cách tăng tốc khác nhau. Khi gọi accelerate() trên một đối tượng Car, nó sẽ tăng tốc theo cách của ô tô, còn khi gọi trên một đối tượng Motorcycle, nó sẽ tăng tốc theo cách của xe máy. Một ví dụ khác về nạp chồng, trong lớp Calculator ta có thể định nghĩa nhiều phương thức add() với các tham số khác nhau (ví dụ add(int a, int b), add(double a, double b), add(int a, int b, int c)), trình biên dịch sẽ chọn phương thức add() phù hợp dựa trên kiểu và số lượng tham số được truyền vào khi gọi hàm.

Lời giải:

Câu hỏi yêu cầu xây dựng một lớp (class) trong lập trình để biểu diễn khái niệm đơn thức P(x) = a*x^b, nơi 'a' là hệ số và 'b' là số mũ. Lớp này cần có các chức năng sau:

  1. Khởi tạo đơn thức: Cho phép tạo một đối tượng đơn thức mới bằng cách cung cấp hệ số 'a' và số mũ 'b'.
  2. Tính giá trị đơn thức: Cho phép tính giá trị của đơn thức P(x) khi biết giá trị của biến 'x'.
  3. Phép cộng đơn thức: Cho phép cộng hai đơn thức với nhau, nhưng chỉ khi chúng có cùng số mũ (cùng bậc). Kết quả của phép cộng là một đơn thức mới có cùng số mũ, và hệ số bằng tổng của hai hệ số ban đầu.

Để giải quyết bài toán này, ta cần định nghĩa một lớp (class) có các thuộc tính (attributes) để lưu trữ hệ số và số mũ, và các phương thức (methods) để thực hiện các chức năng trên. Việc cài đặt cụ thể sẽ phụ thuộc vào ngôn ngữ lập trình được sử dụng (ví dụ: Python, Java, C++).

Vì câu hỏi này thuộc dạng tự luận và yêu cầu xây dựng code, không có một đáp án đúng duy nhất được định nghĩa trước. Các bạn học sinh sẽ cần viết code để triển khai các chức năng được mô tả. Do đó, trường 'answer_iscorrect' sẽ được để là 'Không có đáp án đúng'.

Câu 4:

Thư viện trường học là trung tâm văn hóa, khoa học của nhà trường nhằm mở rộng kiến thức, góp phần nâng cao hiệu quả dạy - học và nghiên cứu khoa học của giáo viên và học sinh.

Một thư viện trường học cần quản lý danh sách các loại sách gồm 2 loại như sau:

● Sách giáo khoa: mã sách, tên sách, nhà xuất bản, số lượng, đơn giá và tình trạng (0: cũ, 1: mới).

- Nếu tình trạng sách là mới thì: Thành tiền = số lượng * đơn giá.

- Nếu tình trạng sách là cũ thì: Thành tiền = số lượng * đơn giá * 50%

● Sách tham khảo: mã sách, tên sách, nhà xuất bản, số lượng, đơn giá và tiền thuế.

- Thành tiền = số lượng * đơn giá + thuế

Yêu cầu:

1. Áp dụng kiến thức lập trình hướng đối tượng (kế thừa, đa hình) thiết kế sơ đồ chi tiết các lớp đối tượng.

2. Định nghĩa các lớp để quản lý theo yêu cầu của thư viện trường học.

3. Xây dựng các phương thức để thực hiện các yêu cầu sau:

a. Nhập và xuất danh sách các sách của thư viện trường học.

b. Tính thành tiền mà thư viện trường học phải trả cho từng loại sách và hiển thị thông tin chi tiết những sách nào có thành tiền phải trả ít nhất.

c. Tìm thông tin các sách giáo khoa của nhà xuất bản có tên do người dùng nhập vào.

Lời giải:

Câu hỏi này yêu cầu thiết kế một hệ thống quản lý sách cho thư viện trường học sử dụng lập trình hướng đối tượng. Các yêu cầu cụ thể bao gồm: thiết kế sơ đồ lớp, định nghĩa các lớp (Sách, Sách Giáo Khoa, Sách Tham Khảo), và xây dựng các phương thức để nhập/xuất danh sách sách, tính thành tiền, tìm sách giáo khoa theo nhà xuất bản.

Phân tích chi tiết:

  1. Sơ đồ lớp: Cần xác định các lớp chính và mối quan hệ giữa chúng. Lớp Sách sẽ là lớp cha, chứa các thuộc tính chung như mã sách, tên sách, nhà xuất bản, số lượng, đơn giá. Lớp Sách Giáo KhoaSách Tham Khảo sẽ kế thừa từ lớp Sách và thêm các thuộc tính riêng (tình trạng sách cho Sách Giáo Khoa, tiền thuế cho Sách Tham Khảo).
  2. Định nghĩa lớp: Cần định nghĩa các thuộc tính (biến thành viên) và phương thức (hàm thành viên) cho mỗi lớp. Các phương thức bao gồm các phương thức khởi tạo, phương thức nhập/xuất thông tin, phương thức tính thành tiền.
  3. Xây dựng phương thức:
    • Nhập/xuất danh sách sách: Cần xây dựng các phương thức để nhập thông tin cho từng loại sách và lưu trữ chúng trong một danh sách (ví dụ: ArrayList). Sau đó, xây dựng phương thức để hiển thị danh sách sách.
    • Tính thành tiền: Xây dựng phương thức tính thành tiền cho từng loại sách dựa trên công thức đã cho. Duyệt qua danh sách sách, tính thành tiền cho từng cuốn sách và hiển thị thông tin chi tiết của những cuốn sách có thành tiền ít nhất.
    • Tìm sách giáo khoa: Xây dựng phương thức để tìm kiếm các sách giáo khoa của một nhà xuất bản cụ thể. Người dùng nhập tên nhà xuất bản, sau đó chương trình sẽ tìm kiếm và hiển thị thông tin các sách giáo khoa có nhà xuất bản trùng khớp.

Đây là một bài tập lập trình hướng đối tượng điển hình, đòi hỏi kiến thức về kế thừa, đa hình và sử dụng các cấu trúc dữ liệu để lưu trữ và quản lý dữ liệu. Vì câu hỏi này yêu cầu thiết kế và xây dựng chương trình, nên không có một đáp án cụ thể duy nhất mà sẽ có nhiều cách tiếp cận và triển khai khác nhau.