Menu
Coddy logo textTech

מודלים של ספרים ומשתמשים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 63 מתוך 70.

challenge icon

אתגר

קל

בואו נרחיב את מערכת הספרייה שלך באמצעות הוספת יכולות עשירות יותר למודלים Book ו-User. תוסיף מעקב אחר מצב הספרים, אפשרות להשאיל ספרים למשתמשים וכימוס מתאים כדי לשמור על בטיחות הנתונים שלך.

תמשיך לעבוד עם המבנה בן ארבעת הקבצים שלך:

  • Book.cs: שפר את המחלקה Book באמצעות מזהה ייחודי ומעקב אחר מצב הספר. לכל ספר צריכים להיות Id (string), Title (string), Author (string) ו-IsAvailable (bool, עם ערך ברירת מחדל true). הוסף את המתודות Borrow() ו-Return(), שמשנות את מצב הזמינות ומחזירות הודעה המציינת הצלחה או כישלון. אם מישהו מנסה לשאול ספר שאינו זמין, החזר "{Title} is not available". אם מישהו מנסה להחזיר ספר שכבר זמין, החזר "{Title} was not borrowed". פעולות מוצלחות צריכות להחזיר "{Title} has been borrowed" או "{Title} has been returned".
  • User.cs: הרחב את המחלקה User כך שתעקוב אחר ספרים שאולים. כלול Name (string), MemberId (int) ורשימה פרטית לאחסון מזהי הספרים השאולים. הוסף מאפיין לקריאה בלבד בשם BorrowedCount, שמחזיר את מספר הספרים שהמשתמש מחזיק כרגע. כלול את המתודות AddBorrowedBook(string bookId) ו-RemoveBorrowedBook(string bookId) לניהול הספרים השאולים של המשתמש. הוסף גם מתודה HasBook(string bookId), שמחזירה true אם המשתמש שאל את הספר המסוים הזה.
  • Library.cs: המחלקה Library שלך צריכה לנהל אוספים של ספרים ומשתמשים. כלול את המתודות AddBook(Book book) ו-RegisterUser(User user) להוספת ספרים ומשתמשים לספרייה. הוסף מתודה GetBookById(string id), שמחזירה את הספר עם המזהה הזה (או null אם הוא לא נמצא), ואת GetUserById(int memberId), שפועלת באופן דומה עבור משתמשים.
  • Program.cs: חבר את כל הרכיבים יחד באמצעות עיבוד פעולות הספרייה על סמך הקלט.

הקלט שיתקבל יהיה מהסוגים הבאים:

  • שם הספרייה
  • מספר הספרים להוספה
  • עבור כל ספר: id|title|author
  • מספר המשתמשים לרישום
  • עבור כל משתמש: name|memberId
  • מספר הפעולות לביצוע
  • עבור כל פעולה: action|bookId|memberId, כאשר action הוא borrow או return

עבור כל פעולה, הדפס את תוצאת פעולת ההשאלה או ההחזרה. לאחר כל הפעולות, הדפס סיכום עבור כל משתמש, המציג את שמו ואת מספר הספרים שהוא מחזיק כרגע בפורמט {Name}: {BorrowedCount} book(s).

לדוגמה, אם הקלט הוא:

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

הפלט צריך להיות:

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)

שימו לב: Alice מצליחה לשאול שני ספרים, אבל כש-Bob מנסה לשאול את Clean Code (שכבר נמצא אצל Alice), הפעולה נכשלת. לאחר ש-Alice מחזירה את Clean Code, מספר הספרים שלה יורד ל-1. כך אפשר לראות כיצד המודלים שלך פועלים יחד כדי לאכוף את כללי הספרייה!

נסו בעצמכם

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());
            
            // קרא ורשום משתמשים
            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);
            }
            
            // קרא את מספר הפעולות
            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]);
                
                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);
                    }
                }
            }
            
            // הדפס סיכום עבור כל משתמש
            foreach (User user in usersList)
            {
                Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
            }
        }
    }
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C# אונליין