Logik des Ausleihsystems
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 64 von 70.
Aufgabe
EinfachLassen wir Ihr Bibliothekssystem zum Leben erwecken, indem wir die zentrale Ausleihlogik implementieren! Sie werden ein zentralisiertes System erstellen, das zwischen Büchern und Benutzern koordiniert, Bibliotheksregeln wie Ausleihlimits durchsetzt und sicherstellt, dass Bücher nur ausgeliehen werden können, wenn sie verfügbar sind.
Sie werden auf Ihrer bestehenden Struktur aus vier Dateien aufbauen:
Book.cs: Behalten Sie Ihre Book-Klasse mit den EigenschaftenId,Title,AuthorundIsAvailablesowie den MethodenBorrow()undReturn()aus der vorherigen Lektion bei.User.cs: Behalten Sie Ihre User-Klasse mitName,MemberId,BorrowedCountund den Methoden zur Verwaltung ausgeliehener Bücher bei. Fügen Sie eine KonstanteMaxBookshinzu, die auf 3 gesetzt ist und die maximale Anzahl an Büchern darstellt, die ein Benutzer gleichzeitig ausleihen kann. Fügen Sie eine MethodeCanBorrow()hinzu, die nur dann true zurückgibt, wenn der Benutzer weniger alsMaxBooksausgeliehen hat.Library.cs: Hier fließt Ihre Logik für das Ausleihsystem zusammen. Ihre Library-Klasse sollte Sammlungen von Büchern und Benutzern sowie Methoden zum Hinzufügen dieser enthalten. Implementieren Sie zwei Schlüsselmethoden:BorrowBook(string bookId, int memberId)- Koordiniert den Ausleihvorgang. Sie sollte prüfen, ob das Buch existiert, ob der Benutzer existiert, ob das Buch verfügbar ist und ob der Benutzer weitere Bücher ausleihen kann. Geben Sie für jeden Fehlerfall oder Erfolg entsprechende Meldungen zurück.ReturnBook(string bookId, int memberId)- Verarbeitet Rückgaben, indem überprüft wird, ob der Benutzer das Buch tatsächlich hat, bevor die Rückgabe verarbeitet wird.
Program.cs: Verarbeiten Sie Bibliotheksoperationen und zeigen Sie die Ergebnisse an.
Ihre BorrowBook-Methode sollte je nach Situation diese Meldungen zurückgeben:
Book not found- wenn die Buch-ID nicht existiertUser not found- wenn die Mitglieds-ID nicht existiert{Title} is not available- wenn das Buch bereits ausgeliehen ist{Name} has reached the borrowing limit- wenn der Benutzer bereits 3 Bücher hat{Name} borrowed {Title}- bei erfolgreicher Ausleihe
Ihre ReturnBook-Methode sollte zurückgeben:
Book not foundoderUser not found- für ungültige IDs{Name} did not borrow {Title}- wenn der Benutzer versucht, ein Buch zurückzugeben, das er nicht hat{Name} returned {Title}- bei erfolgreicher Rückgabe
Sie erhalten die folgenden Eingaben:
- Name der Bibliothek
- Anzahl der Bücher, dann jedes Buch als
id|title|author - Anzahl der Benutzer, dann jeder Benutzer als
name|memberId - Anzahl der Operationen, dann jede Operation als
action|bookId|memberId
Geben Sie das Ergebnis jeder Operation in einer eigenen Zeile aus.
Wenn die Eingaben beispielsweise wie folgt lauten:
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|101Sollte die Ausgabe wie folgt aussehen:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Beachten Sie, wie die Library-Klasse als Koordinator fungiert – sie validiert alle Bedingungen, bevor sie Operationen zulässt, und sorgt dafür, dass Ihre Book- und User-Klassen auf ihre eigenen Verantwortlichkeiten konzentriert bleiben. Diese Trennung macht Ihren Code einfacher zu warten und zu testen!
Probier es selbst
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Bibliotheksnamen lesen
string libraryName = Console.ReadLine();
// Eine Library-Instanz mit dem Bibliotheksnamen erstellen
Library library = new Library(libraryName);
// Anzahl der Bücher lesen
int numBooks = Convert.ToInt32(Console.ReadLine());
// Bücher lesen und hinzufügen
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);
}
// Anzahl der Benutzer lesen
int numUsers = Convert.ToInt32(Console.ReadLine());
// Benutzer lesen und registrieren
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);
}
// Anzahl der Operationen lesen
int numOperations = Convert.ToInt32(Console.ReadLine());
// Operationen verarbeiten
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);
}
}
}
}
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten9Variable Argumente
Das 'params'-SchlüsselwortOptionale ParameterBenannte ArgumenteMethodenüberladung12Projekt: Bibliothekssystem
ProjektstrukturBuch- und Benutzermodelle