לוגיקת השאלת ספרים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 64 מתוך 70.
אתגר
קלבואו נפיח חיים במערכת הספרייה שלך באמצעות מימוש הלוגיקה המרכזית של השאלת ספרים! תיצור מערכת מרכזית שמתאמת בין ספרים למשתמשים, אוכפת את כללי הספרייה כמו מגבלות השאלה ומוודאת שניתן לשאול ספרים רק כשהם זמינים.
תמשיך לבנות על מבנה ארבעת הקבצים הקיים שלך:
Book.cs: שמור על המחלקה Book שלך עם המאפייניםId,Title,Authorו-IsAvailable, יחד עם המתודותBorrow()ו-Return()מהשיעור הקודם.User.cs: שמור על המחלקה User שלך עםName,MemberId,BorrowedCountוהמתודות לניהול הספרים שהושאלו. הוסף קבועMaxBooksשערכו 3, המייצג את המספר המרבי של ספרים שמשתמש יכול לשאול בו-זמנית. הוסף מתודהCanBorrow()שמחזירה true רק אם המשתמש שאל פחות מ-MaxBooksספרים.Library.cs: כאן מתרכזת הלוגיקה של מערכת ההשאלה שלך. למחלקה Library צריכים להיות אוספים של ספרים ומשתמשים, וכן מתודות להוספתם. ממש את שתי המתודות המרכזיות:BorrowBook(string bookId, int memberId)- מתאמת את תהליך ההשאלה. היא צריכה לבדוק אם הספר קיים, אם המשתמש קיים, אם הספר זמין ואם המשתמש יכול לשאול ספרים נוספים. החזר הודעות מתאימות עבור כל מקרה של כישלון או הצלחה.ReturnBook(string bookId, int memberId)- מטפלת בהחזרות באמצעות אימות שלמשתמש אכן יש את הספר לפני עיבוד ההחזרה.
Program.cs: עבד את פעולות הספרייה והצג את התוצאות.
המתודה BorrowBook שלך צריכה להחזיר את ההודעות הבאות בהתאם למצב:
Book not found- כאשר מזהה הספר אינו קייםUser not found- כאשר מזהה החבר אינו קיים{Title} is not available- כאשר הספר כבר מושאל{Name} has reached the borrowing limit- כאשר למשתמש כבר יש 3 ספרים{Name} borrowed {Title}- במקרה של השאלה מוצלחת
המתודה ReturnBook שלך צריכה להחזיר:
Book not foundאוUser not found- עבור מזהים לא תקינים{Name} did not borrow {Title}- כאשר המשתמש מנסה להחזיר ספר שאין ברשותו{Name} returned {Title}- במקרה של החזרה מוצלחת
תקבל את הקלטים הבאים:
- שם הספרייה
- מספר הספרים, ולאחר מכן כל ספר בפורמט
id|title|author - מספר המשתמשים, ולאחר מכן כל משתמש בפורמט
name|memberId - מספר הפעולות, ולאחר מכן כל פעולה בפורמט
action|bookId|memberId
הדפס את התוצאה של כל פעולה בשורה נפרדת.
לדוגמה, אם הקלט הוא:
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הפלט צריך להיות:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984שים לב כיצד המחלקה Library משמשת כמתאמת — היא מאמתת את כל התנאים לפני אישור הפעולות, ומשאירה את המחלקות Book ו-User ממוקדות באחריויות שלהן. ההפרדה הזאת מקלה על התחזוקה והבדיקה של הקוד שלך!
נסו בעצמכם
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// קרא את שם הספרייה
string libraryName = Console.ReadLine();
// צור מופע של Library עם שם הספרייה
Library library = new Library(libraryName);
// קרא את מספר הספרים
int numBooks = Convert.ToInt32(Console.ReadLine());
// קרא והוסף ספרים
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);
}
// קרא את מספר המשתמשים
int numUsers = Convert.ToInt32(Console.ReadLine());
// קרא ורשום משתמשים
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);
}
// קרא את מספר הפעולות
int numOperations = Convert.ToInt32(Console.ReadLine());
// עבד את הפעולות
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);
}
}
}
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויות3ארכיטקטורת מחלקות
נתוני מופע לעומת נתונים סטטייםמילות המפתח 'readonly' ו-'const'שדות גיבויסיכום – מנהל חשבונות בנק12פרויקט: מערכת ספרייה
מבנה הפרויקטמודלים של ספרים ומשתמשיםלוגיקת השאלת ספריםחיפוש באמצעות LINQממשק משתמש בקונסולה / ממשק מנהלבדיקות יחידה (NUnit/xUnit)תרגלו בעצמכם: קומפיילר C# אונליין