Menu
Coddy logo textTech

Modelos de Livro e Usuário

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy. Lição 63 de 70.

challenge icon

Desafio

Fácil

Vamos expandir seu Sistema de Biblioteca desenvolvendo os modelos Book e User com funcionalidades mais avançadas. Você adicionará o acompanhamento de status dos livros, recursos de empréstimo para os usuários e o encapsulamento adequado para manter seus dados seguros.

Você continuará trabalhando com sua estrutura de quatro arquivos:

  • Book.cs: Aprimore sua classe Book com um identificador exclusivo e acompanhamento de status. Cada livro deve ter um Id (string), Title (string), Author (string) e IsAvailable (bool, com valor padrão true). Adicione os métodos Borrow() e Return(), que alteram o status de disponibilidade e retornam uma mensagem indicando sucesso ou falha. Se alguém tentar pegar emprestado um livro indisponível, retorne "{Title} is not available". Se tentar devolver um livro que já está disponível, retorne "{Title} was not borrowed". As operações bem-sucedidas devem retornar "{Title} has been borrowed" ou "{Title} has been returned".
  • User.cs: Expanda sua classe User para acompanhar os livros emprestados. Inclua Name (string), MemberId (int) e uma lista privada para armazenar os IDs dos livros emprestados. Adicione uma propriedade somente leitura BorrowedCount que retorne quantos livros o usuário possui atualmente. Inclua os métodos AddBorrowedBook(string bookId) e RemoveBorrowedBook(string bookId) para gerenciar os livros emprestados pelo usuário. Adicione também um método HasBook(string bookId) que retorne true se o usuário tiver pegado emprestado aquele livro específico.
  • Library.cs: Sua classe Library deve manter coleções de livros e usuários. Inclua os métodos AddBook(Book book) e RegisterUser(User user) para preencher a biblioteca. Adicione um método GetBookById(string id) que retorne o livro com esse ID (ou null se não for encontrado) e GetUserById(int memberId), que funcione de maneira semelhante para os usuários.
  • Program.cs: Reúna tudo processando as operações da biblioteca com base na entrada.

Você receberá as seguintes entradas:

  • Nome da biblioteca
  • Número de livros a serem adicionados
  • Para cada livro: id|title|author
  • Número de usuários a serem registrados
  • Para cada usuário: name|memberId
  • Número de operações a serem realizadas
  • Para cada operação: action|bookId|memberId, em que action pode ser borrow ou return

Para cada operação, imprima o resultado da ação de empréstimo ou devolução. Após todas as operações, imprima um resumo para cada usuário mostrando seu nome e quantos livros ele possui atualmente emprestados, no formato {Name}: {BorrowedCount} book(s).

Por exemplo, se as entradas forem:

Downtown Library
2
B001|Clean Code|Robert Martin
B002|Design Patterns|Gang of Four
2
Alice|101
Bob|102
4
borrow|B001|101
borrow|B002|101
borrow|B001|102
return|B001|101

A saída deverá ser:

Clean Code has been borrowed
Design Patterns has been borrowed
Clean Code is not available
Clean Code has been returned
Alice: 1 book(s)
Bob: 0 book(s)

Observe como Alice pega dois livros emprestados com sucesso, mas, quando Bob tenta pegar Clean Code, que Alice já possui, a operação falha. Depois que Alice devolve Clean Code, sua contagem diminui para 1. Isso demonstra como seus modelos trabalham juntos para aplicar as regras da biblioteca!

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
            List<User> usersList = new List<User>();
            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);
                usersList.Add(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]);
                
                Book book = library.GetBookById(bookId);
                User user = library.GetUserById(memberId);
                
                if (action == "borrow")
                {
                    string result = book.Borrow();
                    Console.WriteLine(result);
                    if (result.Contains("has been borrowed"))
                    {
                        user.AddBorrowedBook(bookId);
                    }
                }
                else if (action == "return")
                {
                    string result = book.Return();
                    Console.WriteLine(result);
                    if (result.Contains("has been returned"))
                    {
                        user.RemoveBorrowedBook(bookId);
                    }
                }
            }
            
            // Imprimir resumo para cada usuário
            foreach (User user in usersList)
            {
                Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
            }
        }
    }
}

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

Pratique por conta própria: Compilador de C# online