Menu
Coddy logo textTech

Modelli di libri e utenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 63 di 70.

challenge icon

Sfida

Facile

Espandiamo il tuo sistema bibliotecario arricchendo i modelli Book e User con funzionalità più complete. Aggiungerai il monitoraggio dello stato dei libri, la possibilità per gli utenti di prenderli in prestito e un'adeguata incapsulazione per proteggere i tuoi dati.

Continuerai a lavorare con la struttura composta da quattro file:

  • Book.cs: potenzia la tua classe Book con un identificatore univoco e il monitoraggio dello stato. Ogni libro dovrebbe avere un Id (string), un Title (string), un Author (string) e un IsAvailable (bool, con valore predefinito true). Aggiungi i metodi Borrow() e Return(), che modificano lo stato di disponibilità e restituiscono un messaggio che indica se l'operazione è riuscita o meno. Se qualcuno prova a prendere in prestito un libro non disponibile, restituisci "{Title} is not available". Se prova a restituire un libro già disponibile, restituisci "{Title} was not borrowed". Le operazioni riuscite dovrebbero restituire "{Title} has been borrowed" oppure "{Title} has been returned".
  • User.cs: espandi la tua classe User per tenere traccia dei libri presi in prestito. Includi Name (string), MemberId (int) e un elenco privato in cui memorizzare gli ID dei libri presi in prestito. Aggiungi una proprietà di sola lettura BorrowedCount che restituisca il numero di libri attualmente in possesso dell'utente. Includi i metodi AddBorrowedBook(string bookId) e RemoveBorrowedBook(string bookId) per gestire i libri presi in prestito dall'utente. Aggiungi anche un metodo HasBook(string bookId) che restituisca true se l'utente ha preso in prestito quel libro specifico.
  • Library.cs: la tua classe Library dovrebbe mantenere raccolte di libri e utenti. Includi i metodi AddBook(Book book) e RegisterUser(User user) per popolare la biblioteca. Aggiungi un metodo GetBookById(string id) che restituisca il libro con quell'ID (oppure null se non viene trovato) e un metodo GetUserById(int memberId) che funzioni allo stesso modo per gli utenti.
  • Program.cs: riunisci tutte le parti elaborando le operazioni della biblioteca in base all'input.

Riceverai i seguenti input:

  • Nome della biblioteca
  • Numero di libri da aggiungere
  • Per ogni libro: id|title|author
  • Numero di utenti da registrare
  • Per ogni utente: name|memberId
  • Numero di operazioni da eseguire
  • Per ogni operazione: action|bookId|memberId, dove action è borrow oppure return

Per ogni operazione, stampa il risultato dell'azione di prestito o restituzione. Al termine di tutte le operazioni, stampa un riepilogo per ogni utente, indicando il suo nome e quanti libri ha attualmente preso in prestito, nel formato {Name}: {BorrowedCount} book(s).

Ad esempio, se gli input sono:

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

L'output dovrebbe essere:

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)

Nota come Alice riesca a prendere in prestito due libri, ma quando Bob prova a prendere in prestito Clean Code (che Alice ha già preso), l'operazione fallisce. Dopo che Alice restituisce Clean Code, il suo conteggio scende a 1. Questo dimostra come i tuoi modelli collaborano per far rispettare le regole della biblioteca!

Provalo tu

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Leggi il nome della biblioteca
            string libraryName = Console.ReadLine();
            
            // Crea un'istanza di Library con il nome della biblioteca
            Library library = new Library(libraryName);
            
            // Leggi il numero di libri
            int numBooks = Convert.ToInt32(Console.ReadLine());
            
            // Leggi e aggiungi i libri
            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);
            }
            
            // Leggi il numero di utenti
            int numUsers = Convert.ToInt32(Console.ReadLine());
            
            // Leggi e registra gli utenti
            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);
            }
            
            // Leggi il numero di operazioni
            int numOperations = Convert.ToInt32(Console.ReadLine());
            
            // Elabora le operazioni
            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);
                    }
                }
            }
            
            // Stampa un riepilogo per ogni utente
            foreach (User user in usersList)
            {
                Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
            }
        }
    }
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C# online