Логика системы выдачи книг
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 64 из 70.
Задание
ЛегкоДавайте оживим вашу библиотечную систему, реализовав основную логику выдачи книг! Вы создадите централизованную систему, которая координирует взаимодействие между книгами и пользователями, обеспечивая соблюдение библиотечных правил, таких как лимиты на выдачу, и гарантируя, что книги могут быть выданы только тогда, когда они доступны.
Вы продолжите работу над существующей структурой из четырех файлов:
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);
}
}
}
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов12Проект: Система библиотеки
Структура проектаМодели книг и пользователей