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

نظام الاستعارة

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 100 من 107.

challenge icon

التحدي

سهل

لنبنِ نظام الاستعارة لمشروع إدارة Library الخاص بنا! ستنشئ بنية Library تدير مجموعات الكتب والمستخدمين، مع أساليب لمعالجة عمليات الاستعارة والإرجاع، بما في ذلك التحقق المناسب.

ستنظّم الكود عبر أربعة ملفات:

  • book.go: بنية Book الخاصة بك من الدرس السابق، مع حقول ID وTitle وAuthor وISBN وAvailable. ضمّن المُنشئ NewBook الذي يهيّئ الكتب على أنها متاحة.
  • user.go: بنية User الخاصة بك، مع ID وName وEmail وBorrowedBooks (شريحة من معرّفات الكتب). ضمّن المُنشئ NewUser الذي يهيّئ المستخدمين بقائمة استعارة فارغة.
  • library.go: أنشئ بنية Library تخزّن الكتب والمستخدمين في خرائط (مفهرسة بواسطة معرّفاتهم). أنشئ المكوّنات التالية:
    • مُنشئ NewLibrary يهيّئ خرائط فارغة للكتب والمستخدمين
    • أسلوب AddBook يضيف كتابًا إلى المكتبة
    • أسلوب AddUser يضيف مستخدمًا إلى المكتبة
    • أسلوب Borrow يستقبل معرّف مستخدم ومعرّف كتاب، ويتحقق من صحة العملية، ويضع علامة على أن الكتاب غير متاح، ويضيف معرّف الكتاب إلى قائمة استعارة المستخدم، ويُرجع خطأً إذا حدث خطب ما
    • أسلوب Return يعكس عملية الاستعارة: يضع علامة على أن الكتاب متاح ويزيله من قائمة استعارة المستخدم

    يجب أن يُرجع أسلوب Borrow الأخطاء التالية:

    • user not found إذا لم يكن معرّف المستخدم موجودًا
    • book not found إذا لم يكن معرّف الكتاب موجودًا
    • book not available إذا كان الكتاب مستعارًا بالفعل

    يجب أن يُرجع أسلوب Return الأخطاء التالية:

    • user not found إذا لم يكن معرّف المستخدم موجودًا
    • book not found إذا لم يكن معرّف الكتاب موجودًا
    • book not borrowed إذا كان الكتاب متاحًا بالفعل
  • main.go: اجمع كل شيء معًا من خلال إنشاء مكتبة، وإضافة الكتب والمستخدمين، ثم معالجة عمليات الاستعارة والإرجاع.

    اقرأ عدد الكتب، ثم اقرأ لكل كتاب معرّفه وعنوانه ومؤلفه وISBN الخاص به. بعد ذلك، اقرأ عدد المستخدمين، واقرأ لكل مستخدم معرّفه واسمه وبريده الإلكتروني. ثم اقرأ عدد العمليات، حيث تكون كل عملية إما borrow [userID] [bookID] أو return [userID] [bookID].

    لكل عملية، اطبع OK إذا نجحت، أو Error: [message] إذا فشلت.

سيتم توفير المدخلات التالية:

  • عدد الكتب، ثم معرّف كل كتاب وعنوانه ومؤلفه وISBN الخاص به (كل عنصر في سطر منفصل)
  • عدد المستخدمين، ثم معرّف كل مستخدم واسمه وبريده الإلكتروني (كل عنصر في سطر منفصل)
  • عدد العمليات، ثم كل عملية في سطر منفصل

على سبيل المثال، إذا كانت المدخلات:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com
4
borrow U001 B001
borrow U001 B001
return U001 B001
borrow U002 B001

فيجب أن تكون مخرجاتك:

OK
Error: book not available
OK
Error: user not found

وإذا كانت المدخلات:

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com
3
borrow U001 B100
borrow U002 B100
return U001 B100

فيجب أن تكون مخرجاتك:

OK
Error: book not available
OK

وإذا كانت المدخلات:

1
B001
Go in Action
William Kennedy
978-1617291784
1
U001
Dave Miller
dave@test.com
2
return U001 B001
borrow U001 B999

فيجب أن تكون مخرجاتك:

Error: book not borrowed
Error: book not found

لاحظ كيف تعمل Library بوصفها المنسّق المركزي. فهي تتحقق من صحة جميع العمليات قبل تعديل الحالة، مما يضمن بقاء الكتب والمستخدمين متزامنين. يتيح استخدام مستقبلات المؤشرات لأساليبك تعديل البيانات الفعلية المخزّنة في الخرائط!

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// اقرأ عدد الكتب
	var numBooks int
	fmt.Fscanln(reader, &numBooks)

	// TODO: أنشئ مكتبة جديدة

	// TODO: اقرأ تفاصيل كل كتاب (ID, Title, Author, ISBN في أسطر منفصلة)
	// وأضفها إلى المكتبة
	for i := 0; i < numBooks; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		title, _ := reader.ReadString('\n')
		title = strings.TrimSpace(title)
		author, _ := reader.ReadString('\n')
		author = strings.TrimSpace(author)
		isbn, _ := reader.ReadString('\n')
		isbn = strings.TrimSpace(isbn)

		// TODO: أنشئ كتابًا وأضفه إلى المكتبة
	}

	// اقرأ عدد المستخدمين
	var numUsers int
	fmt.Fscanln(reader, &numUsers)

	// TODO: اقرأ تفاصيل كل مستخدم (ID, Name, Email في أسطر منفصلة)
	// وأضفها إلى المكتبة
	for i := 0; i < numUsers; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)
		email, _ := reader.ReadString('\n')
		email = strings.TrimSpace(email)

		// TODO: أنشئ مستخدمًا وأضفه إلى المكتبة
	}

	// اقرأ عدد العمليات
	var numOps int
	fmt.Fscanln(reader, &numOps)

	// TODO: عالج كل عملية
	// التنسيق: "borrow [userID] [bookID]" أو "return [userID] [bookID]"
	for i := 0; i < numOps; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		parts := strings.Split(line, " ")

		// TODO: حلّل العملية واستدعِ الطريقة المناسبة
		// اطبع "OK" عند النجاح أو "Error: [message]" عند الفشل
	}
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت