Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نماذج الكتاب والمستخدم

جزء من قسم Object Oriented Programming في رحلة 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)، وقائمة خاصة (private list) لتخزين IDs للكتب المستعارة. أضف خاصية للقراءة فقط (read-only property) باسم BorrowedCount ترجع عدد الكتب التي يمتلكها المستخدم حاليًا. قم بتضمين الميثودز AddBorrowedBook(string bookId) و RemoveBorrowedBook(string bookId) لإدارة الكتب المستعارة للمستخدم. أضف أيضًا ميثود HasBook(string bookId) ترجع true إذا كان المستخدم قد استعار ذلك الكتاب المحدد.
  • Library.cs: يجب أن تحتفظ فئة Library بمجموعات من الكتب والمستخدمين. قم بتضمين الميثودز AddBook(Book book) و RegisterUser(User user) لملء المكتبة. أضف ميثود GetBookById(string id) ترجع الكتاب الذي يحمل ذلك 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)");
            }
        }
    }
}

جميع دروس Object Oriented Programming