Menu
CoddyTech

Giao diện quản trị

Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 59 trên 64.

challenge icon

Thử thách

Trung bình

Trong thử thách này, bạn sẽ triển khai các chức năng quản trị cho hệ thống quản lý thư viện.

Bạn cần chỉnh sửa tệp library.py để thêm phương thức get_statistics vào lớp Library. Phương thức này trả về một từ điển (dictionary) chứa các số liệu thống kê quan trọng về trạng thái thư viện. Chi tiết triển khai được nêu trong các chú thích TODO trong tệp.

Các số liệu thống kê cần bao gồm:

  • Tổng số sách
  • Số sách hiện có
  • Số sách đã mượn
  • Tổng số người dùng
  • Số người dùng đã mượn sách

Các tệp book.py và user.py chứa các lớp đã được triển khai sẵn để lời giải của bạn tương tác với chúng. Bạn có thể xem các tệp này để hiểu cấu trúc hệ thống, nhưng phần triển khai của bạn nên tập trung vào tệp library.py.

Tự làm thử

from book import Book
from user import User
from library import Library

# Xử lý test case
test_case = input()

if test_case == "empty_library":
    library = Library("Empty Library")
    stats = library.get_statistics()
    
    print(f"Total Books: {stats['total_books']}")
    print(f"Available Books: {stats['available_books']}")
    print(f"Borrowed Books: {stats['borrowed_books']}")
    print(f"Total Users: {stats['total_users']}")
    print(f"Users with Books: {stats['users_with_books']}")

elif test_case == "with_borrowed_books":
    library = Library("Community Library")
    
    # Thêm sách và người dùng
    library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
    library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
    library.add_book(Book("1984", "George Orwell", "345678"))
    
    library.add_user(User("U001", "Alice"))
    library.add_user(User("U002", "Bob"))
    library.add_user(User("U003", "Charlie"))
    
    # Mượn một số cuốn sách
    library.borrow_book("123456", "U001")
    library.borrow_book("789012", "U001") # Alice mượn 2 cuốn sách
    library.borrow_book("345678", "U002") # Bob mượn 1 cuốn sách
    
    stats = library.get_statistics()
    print(f"Total Books: {stats['total_books']}")
    print(f"Available Books: {stats['available_books']}")
    print(f"Borrowed Books: {stats['borrowed_books']}")
    print(f"Total Users: {stats['total_users']}")
    print(f"Users with Books: {stats['users_with_books']}")

elif test_case == "return_books":
    library = Library("Return Test Library")
    
    # Thêm sách và người dùng
    library.add_book(Book("Python Programming", "John Smith", "111222"))
    library.add_book(Book("Data Structures", "Jane Doe", "333444"))
    
    library.add_user(User("U101", "David"))
    library.add_user(User("U102", "Emma"))
    
    # Mượn một cuốn sách
    library.borrow_book("111222", "U101")
    
    # Lấy số liệu thống kê trước khi trả sách
    stats_before = library.get_statistics()
    print("Before returning:")
    print(f"Total Books: {stats_before['total_books']}")
    print(f"Available Books: {stats_before['available_books']}")
    print(f"Borrowed Books: {stats_before['borrowed_books']}")
    print(f"Users with Books: {stats_before['users_with_books']}")
    
    # Triển khai chức năng trả sách (sẽ nằm trong lớp (class) Library)
    book = next((book for book in library.books if book.isbn == "111222"), None)
    user = next((user for user in library.users if user.user_id == "U101"), None)
    
    if book and user:
        book.available = True
        book.borrower = None
        user.books_borrowed.remove(book)
        print("Book returned successfully")
    
    # Lấy số liệu thống kê sau khi trả sách
    stats_after = library.get_statistics()
    print("\
After returning:")
    print(f"Total Books: {stats_after['total_books']}")
    print(f"Available Books: {stats_after['available_books']}")
    print(f"Borrowed Books: {stats_after['borrowed_books']}")
    print(f"Users with Books: {stats_after['users_with_books']}")

elif test_case == "edge_cases":
    # Thư viện trống
    empty_library = Library("Empty Library")
    empty_stats = empty_library.get_statistics()
    print("Empty library statistics:")
    print(f"Total Books: {empty_stats['total_books']}")
    print(f"Available Books: {empty_stats['available_books']}")
    print(f"Borrowed Books: {empty_stats['borrowed_books']}")
    print(f"Total Users: {empty_stats['total_users']}")
    print(f"Users with Books: {empty_stats['users_with_books']}")
    
    # Có sách nhưng không có người dùng
    books_only = Library("Books Only")
    books_only.add_book(Book("Book 1", "Author 1", "B001"))
    books_only.add_book(Book("Book 2", "Author 2", "B002"))
    books_stats = books_only.get_statistics()
    print("\
Library with books but no users:")
    print(f"Total Books: {books_stats['total_books']}")
    print(f"Available Books: {books_stats['available_books']}")
    print(f"Total Users: {books_stats['total_users']}")
    print(f"Users with Books: {books_stats['users_with_books']}")
    
    # Có người dùng nhưng không có sách
    users_only = Library("Users Only")
    users_only.add_user(User("U201", "User 1"))
    users_only.add_user(User("U202", "User 2"))
    users_stats = users_only.get_statistics()
    print("\
Library with users but no books:")
    print(f"Total Books: {users_stats['total_books']}")
    print(f"Available Books: {users_stats['available_books']}")
    print(f"Total Users: {users_stats['total_users']}")
    print(f"Users with Books: {users_stats['users_with_books']}")
    
    # Các trường hợp lỗi
    error_library = Library("Error Test")
    error_library.add_book(Book("Error Book", "Error Author", "E001"))
    error_library.add_user(User("E101", "Error User"))
    
    print("\
Error cases:")
    print(f"Borrow non-existent book: {error_library.borrow_book('NONEXISTENT', 'E101')}")
    print(f"Borrow with non-existent user: {error_library.borrow_book('E001', 'NONEXISTENT')}")

elif test_case == "large_library":
    large_library = Library("Large Library")
    
    # Thêm 100 cuốn sách
    for i in range(1, 101):
        large_library.add_book(Book(f"Book {i}", f"Author {i}", f"ISBN{i:06d}"))
    
    # Thêm 100 người dùng
    for i in range(1, 101):
        large_library.add_user(User(f"U{i:03d}", f"User {i}"))
    
    # Cho 50 người dùng mượn sách
    for i in range(1, 51):
        large_library.borrow_book(f"ISBN{i:06d}", f"U{i:03d}")
    
    # Cho một số người dùng mượn nhiều cuốn sách
    for i in range(1, 11):
        large_library.borrow_book(f"ISBN{i+50:06d}", f"U{i:03d}")
    
    stats = large_library.get_statistics()
    print("Large library statistics:")
    print(f"Total Books: {stats['total_books']}")
    print(f"Available Books: {stats['available_books']}")
    print(f"Borrowed Books: {stats['borrowed_books']}")
    print(f"Total Users: {stats['total_users']}")
    print(f"Users with Books: {stats['users_with_books']}")
    
    # Kiểm tra các phép tính
    print("\
Verification:")
    print(f"Total books should be 100: {stats['total_books'] == 100}")
    print(f"Borrowed books should be 60: {stats['borrowed_books'] == 60}")
    print(f"Available books should be 40: {stats['available_books'] == 40}")
    print(f"Users with books should be 50: {stats['users_with_books'] == 50}")

elif test_case == "statistics_accuracy":
    accuracy_library = Library("Accuracy Test")
    
    # Thêm đúng 10 cuốn sách
    for i in range(1, 11):
        accuracy_library.add_book(Book(f"Book {i}", f"Author {i}", f"A{i:03d}"))
    
    # Thêm đúng 5 người dùng
    for i in range(1, 6):
        accuracy_library.add_user(User(f"AU{i}", f"Accuracy User {i}"))
    
    # Chưa có cuốn sách nào được mượn
    stats1 = accuracy_library.get_statistics()
    print("Initial state:")
    print(f"Total Books: {stats1['total_books']} (Expected: 10)")
    print(f"Available Books: {stats1['available_books']} (Expected: 10)")
    print(f"Borrowed Books: {stats1['borrowed_books']} (Expected: 0)")
    print(f"Total Users: {stats1['total_users']} (Expected: 5)")
    print(f"Users with Books: {stats1['users_with_books']} (Expected: 0)")
    
    # Cho 3 người dùng mượn sách
    accuracy_library.borrow_book("A001", "AU1")
    accuracy_library.borrow_book("A002", "AU1")  # Người dùng 1 mượn 2 cuốn sách
    accuracy_library.borrow_book("A003", "AU2")  # Người dùng 2 mượn 1 cuốn sách
    accuracy_library.borrow_book("A004", "AU3")  # Người dùng 3 mượn 1 cuốn sách
    
    stats2 = accuracy_library.get_statistics()
    print("\
After borrowing:")
    print(f"Total Books: {stats2['total_books']} (Expected: 10)")
    print(f"Available Books: {stats2['available_books']} (Expected: 6)")
    print(f"Borrowed Books: {stats2['borrowed_books']} (Expected: 4)")
    print(f"Total Users: {stats2['total_users']} (Expected: 5)")
    print(f"Users with Books: {stats2['users_with_books']} (Expected: 3)")

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Python online