Menu
Coddy logo textTech

Логика системы выдачи книг

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 64 из 70.

challenge icon

Задание

Легко

Давайте оживим вашу библиотечную систему, реализовав основную логику выдачи книг! Вы создадите централизованную систему, которая координирует взаимодействие между книгами и пользователями, обеспечивая соблюдение библиотечных правил, таких как лимиты на выдачу, и гарантируя, что книги могут быть выданы только тогда, когда они доступны.

Вы продолжите работу над существующей структурой из четырех файлов:

  • Book.cs: Сохраните класс Book со свойствами Id, Title, Author и IsAvailable, а также методами Borrow() и Return() из предыдущего урока.
  • User.cs: Сохраните класс User со свойствами Name, MemberId, BorrowedCount и методами для управления взятыми книгами. Добавьте константу MaxBooks, равную 3, которая представляет максимальное количество книг, которое пользователь может взять одновременно. Добавьте метод CanBorrow(), который возвращает true только в том случае, если пользователь взял меньше книг, чем MaxBooks.
  • Library.cs: Здесь собирается логика вашей системы выдачи книг. Ваш класс Library должен иметь коллекции книг и пользователей, а также методы для их добавления. Реализуйте два ключевых метода:
    • BorrowBook(string bookId, int memberId) — координирует процесс выдачи. Он должен проверять, существует ли книга, существует ли пользователь, доступна ли книга и может ли пользователь взять больше книг. Возвращайте соответствующие сообщения для каждого случая неудачи или успеха.
    • ReturnBook(string bookId, int memberId) — обрабатывает возврат, проверяя, действительно ли у пользователя есть эта книга, прежде чем обрабатывать возврат.
  • Program.cs: Обрабатывает библиотечные операции и отображает результаты.

Ваш метод BorrowBook должен возвращать следующие сообщения в зависимости от ситуации:

  • "Book not found" — когда ID книги не существует
  • "User not found" — когда ID участника не существует
  • "{Title} is not available" — когда книга уже выдана
  • "{Name} has reached the borrowing limit" — когда у пользователя уже есть 3 книги
  • "{Name} borrowed {Title}" — при успешной выдаче

Ваш метод ReturnBook должен возвращать:

  • "Book not found" или "User not found" — для неверных ID
  • "{Name} did not borrow {Title}" — когда пользователь пытается вернуть книгу, которой у него нет
  • "{Name} returned {Title}" — при успешном возврате

Вы получите следующие входные данные:

  • Название библиотеки
  • Количество книг, затем каждая книга в формате id|title|author
  • Количество пользователей, затем каждый пользователь в формате name|memberId
  • Количество операций, затем каждая операция в формате action|bookId|memberId

Выводите результат каждой операции на отдельной строке.

Например, если входные данные следующие:

Central Library
4
B001|The Hobbit|Tolkien
B002|1984|Orwell
B003|Dune|Herbert
B004|Foundation|Asimov
2
Alice|101
Bob|102
6
borrow|B001|101
borrow|B002|101
borrow|B003|101
borrow|B004|101
borrow|B001|102
return|B002|101

Вывод должен быть таким:

Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984

Обратите внимание, как класс Library выступает в роли координатора — он проверяет все условия перед разрешением операций, позволяя вашим классам Book и User сосредоточиться на своих собственных обязанностях. Такое разделение делает ваш код более простым в обслуживании и тестировании!

Попробуйте сами

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Чтение названия библиотеки
            string libraryName = Console.ReadLine();
            
            // Создание экземпляра Library с названием библиотеки
            Library library = new Library(libraryName);
            
            // Чтение количества книг
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Чтение и добавление книг
            for (int i = 0; i < numBooks; i++)
            {
                string bookInput = Console.ReadLine();
                string[] bookParts = bookInput.Split('|');
                string bookId = bookParts[0];
                string bookTitle = bookParts[1];
                string bookAuthor = bookParts[2];
                
                Book book = new Book(bookId, bookTitle, bookAuthor);
                library.AddBook(book);
            }
            
            // Чтение количества пользователей
            int numUsers = Convert.ToInt32(Console.ReadLine());
            
            // Чтение и регистрация пользователей
            for (int i = 0; i < numUsers; i++)
            {
                string userInput = Console.ReadLine();
                string[] userParts = userInput.Split('|');
                string userName = userParts[0];
                int memberId = Convert.ToInt32(userParts[1]);
                
                User user = new User(userName, memberId);
                library.RegisterUser(user);
            }
            
            // Чтение количества операций
            int numOperations = Convert.ToInt32(Console.ReadLine());
            
            // Обработка операций
            for (int i = 0; i < numOperations; i++)
            {
                string operationInput = Console.ReadLine();
                string[] opParts = operationInput.Split('|');
                string action = opParts[0];
                string bookId = opParts[1];
                int memberId = Convert.ToInt32(opParts[2]);
                
                if (action == "borrow")
                {
                    string result = library.BorrowBook(bookId, memberId);
                    Console.WriteLine(result);
                }
                else if (action == "return")
                {
                    string result = library.ReturnBook(bookId, memberId);
                    Console.WriteLine(result);
                }
            }
        }
    }
}

Все уроки раздела Объектно-ориентированное программирование