Menu
Coddy logo textTech

Lógica do Sistema de Empréstimos

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 64 de 70.

challenge icon

Desafio

Fácil

Vamos dar vida ao seu Sistema de Biblioteca implementando a lógica central de empréstimo! Você criará um sistema centralizado que coordena entre livros e usuários, aplicando regras da biblioteca, como limites de empréstimo e garantindo que os livros só possam ser emprestados quando estiverem disponíveis.

Você continuará construindo sobre sua estrutura existente de quatro arquivos:

  • Book.cs: Mantenha sua classe Book com as propriedades Id, Title, Author e IsAvailable, junto com os métodos Borrow() e Return() da lição anterior.
  • User.cs: Mantenha sua classe User com Name, MemberId, BorrowedCount e os métodos para gerenciar livros emprestados. Adicione uma constante MaxBooks definida como 3 que representa o número máximo de livros que um usuário pode emprestar de uma vez. Adicione um método CanBorrow() que retorna true apenas se o usuário tiver emprestado menos de MaxBooks.
  • Library.cs: É aqui que a lógica do seu sistema de empréstimo se une. Sua classe Library deve ter coleções de livros e usuários, além de métodos para adicioná-los. Implemente dois métodos principais:
    • BorrowBook(string bookId, int memberId) - Coordena o processo de empréstimo. Ele deve verificar se o livro existe, se o usuário existe, se o livro está disponível e se o usuário pode emprestar mais livros. Retorne as mensagens apropriadas para cada caso de falha ou sucesso.
    • ReturnBook(string bookId, int memberId) - Lida com devoluções verificando se o usuário realmente possui o livro antes de processar a devolução.
  • Program.cs: Processa as operações da biblioteca e exibe os resultados.

Seu método BorrowBook deve retornar estas mensagens com base na situação:

  • Book not found - quando o ID do livro não existe
  • User not found - quando o ID do membro não existe
  • {Title} is not available - quando o livro já está emprestado
  • {Name} has reached the borrowing limit - quando o usuário já possui 3 livros
  • {Name} borrowed {Title} - em caso de empréstimo bem-sucedido

Seu método ReturnBook deve retornar:

  • Book not found ou User not found - para IDs inválidos
  • {Name} did not borrow {Title} - quando o usuário tenta devolver um livro que não possui
  • {Name} returned {Title} - em caso de devolução bem-sucedida

Você receberá as seguintes entradas:

  • Nome da biblioteca
  • Número de livros, depois cada livro como id|title|author
  • Número de usuários, depois cada usuário como name|memberId
  • Número de operações, depois cada operação como action|bookId|memberId

Imprima o resultado de cada operação em sua própria linha.

Por exemplo, se as entradas forem:

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

A saída deve ser:

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

Observe como a classe Library atua como coordenadora - ela valida todas as condições antes de permitir as operações, mantendo suas classes Book e User focadas em suas próprias responsabilidades. Essa separação torna seu código mais fácil de manter e testar!

Experimente você mesmo

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Ler o nome da biblioteca
            string libraryName = Console.ReadLine();
            
            // Criar uma instância de Library com o nome da biblioteca
            Library library = new Library(libraryName);
            
            // Ler o número de livros
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Ler e adicionar livros
            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);
            }
            
            // Ler o número de usuários
            int numUsers = Convert.ToInt32(Console.ReadLine());
            
            // Ler e registrar usuários
            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);
            }
            
            // Ler o número de operações
            int numOperations = Convert.ToInt32(Console.ReadLine());
            
            // Processar operações
            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);
                }
            }
        }
    }
}

Todas as lições de Programação Orientada a Objetos