Menu
Coddy logo textTech

Logika systemu wypożyczeń

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 64 z 70.

challenge icon

Wyzwanie

Łatwy

Ożywmy Twój system biblioteczny, implementując podstawową logikę wypożyczania! Utworzysz scentralizowany system, który koordynuje działanie książek i użytkowników, egzekwuje zasady biblioteki, takie jak limity wypożyczeń, oraz pilnuje, by książki można było wypożyczać tylko wtedy, gdy są dostępne.

Będziesz kontynuować pracę nad istniejącą strukturą złożoną z czterech plików:

  • Book.cs: Zachowaj klasę Book z właściwościami Id, Title, Author i IsAvailable oraz metodami Borrow() i Return() z poprzedniej lekcji.
  • User.cs: Zachowaj klasę User z właściwościami Name, MemberId, BorrowedCount oraz metodami zarządzającymi wypożyczonymi książkami. Dodaj stałą MaxBooks o wartości 3, która określa maksymalną liczbę książek, jakie użytkownik może wypożyczyć jednocześnie. Dodaj metodę CanBorrow(), która zwraca true tylko wtedy, gdy użytkownik wypożyczył mniej niż MaxBooks książek.
  • Library.cs: To tutaj łączy się logika systemu wypożyczeń. Klasa Library powinna zawierać kolekcje książek i użytkowników oraz metody ich dodawania. Zaimplementuj dwie kluczowe metody:
    • BorrowBook(string bookId, int memberId) - koordynuje proces wypożyczania. Powinna sprawdzać, czy książka istnieje, czy użytkownik istnieje, czy książka jest dostępna oraz czy użytkownik może wypożyczyć więcej książek. Zwracaj odpowiednie komunikaty dla każdego przypadku niepowodzenia lub powodzenia.
    • ReturnBook(string bookId, int memberId) - obsługuje zwroty, sprawdzając przed ich przetworzeniem, czy użytkownik rzeczywiście ma tę książkę.
  • Program.cs: Przetwarzaj operacje biblioteczne i wyświetlaj wyniki.

Metoda BorrowBook powinna zwracać następujące komunikaty w zależności od sytuacji:

  • Book not found - gdy identyfikator książki nie istnieje
  • User not found - gdy identyfikator użytkownika nie istnieje
  • {Title} is not available - gdy książka jest już wypożyczona
  • {Name} has reached the borrowing limit - gdy użytkownik ma już 3 książki
  • {Name} borrowed {Title} - po pomyślnym wypożyczeniu

Metoda ReturnBook powinna zwracać:

  • Book not found lub User not found - dla nieprawidłowych identyfikatorów
  • {Name} did not borrow {Title} - gdy użytkownik próbuje zwrócić książkę, której nie ma
  • {Name} returned {Title} - po pomyślnym zwrocie

Otrzymasz następujące dane wejściowe:

  • Nazwę biblioteki
  • Liczbę książek, a następnie dane każdej książki w formacie id|title|author
  • Liczbę użytkowników, a następnie dane każdego użytkownika w formacie name|memberId
  • Liczbę operacji, a następnie każdą operację w formacie action|bookId|memberId

Wyświetl wynik każdej operacji w osobnym wierszu.

Na przykład, jeśli dane wejściowe to:

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

Wynik powinien być następujący:

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

Zwróć uwagę, jak klasa Library pełni funkcję koordynatora — sprawdza wszystkie warunki przed zezwoleniem na wykonanie operacji, dzięki czemu klasy Book i User mogą skupiać się na własnych zadaniach. Taki podział ułatwia utrzymanie i testowanie kodu!

Spróbuj swoich sił

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Wczytaj nazwę biblioteki
            string libraryName = Console.ReadLine();
            
            // Utwórz instancję Library z nazwą biblioteki
            Library library = new Library(libraryName);
            
            // Wczytaj liczbę książek
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Wczytaj i dodaj książki
            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);
            }
            
            // Wczytaj liczbę użytkowników
            int numUsers = Convert.ToInt32(Console.ReadLine());
            
            // Wczytaj i zarejestruj użytkowników
            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);
            }
            
            // Wczytaj liczbę operacji
            int numOperations = Convert.ToInt32(Console.ReadLine());
            
            // Przetwórz operacje
            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);
                }
            }
        }
    }
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online