المسارات
/
Go
Go
/
التمارين
/
المتجر الإجمالي
المتجر الإجمالي

المتجر الإجمالي

تمرين تعلّمي

مقدمة

في Go، map نوع بيانات مدمج يربط المفاتيح بالقيم. في لغات البرمجة الأخرى، قد تكون على دراية بمفهوم map كقاموس، أو جدول تجزئة، أو مخزن مفتاح/قيمة، أو مصفوفة ترابطية.

من الناحية التركيبية، يبدو map هكذا:

map[KeyType]ElementType

من المهم أيضًا معرفة أن كل مفتاح فريد، مما يعني أن إسناد المفتاح نفسه مرتين سيؤدي إلى الكتابة فوق قيمة المفتاح المقابل.

لإنشاء خريطة، يمكنك القيام بما يلي:

  // With map literal
  foo := map[string]int{}

أو

  // or with make function
  foo := make(map[string]int)

إليك بعض العمليات التي يمكنك إجراؤها على خريطة

  // Add a value in a map with the `=` operator:
  foo["bar"] = 42
  // Here we update the element of `bar`
  foo["bar"] = 73
  // To retrieve a map value, you can use
  baz := foo["bar"]
  // To delete an item from a map, you can use
  delete(foo, "bar")

إذا حاولت استرداد قيمة مفتاح غير موجود في الخريطة، فستُرجع القيمة الصفرية لنوع القيمة. قد يربكك هذا، خاصةً إذا كانت قيمة ElementType الافتراضية لديك (على سبيل المثال، 0 لـ int) قيمةً صالحة. للتحقق مما إذا كان المفتاح موجودًا في الخريطة، يمكنك استخدام

  value, exists := foo["baz"]
  // If the key "baz" does not exist,
  // value: 0; exists: false

التعليمات

لدى أحد أصدقائك متجر بيع بالجملة قديم يُدعى Gross Store. الاسم مأخوذ من كمية البضاعة التي يبيعها المتجر: فكل شيء عنده بوحدة gross. طلب منك صديقك أن تنفّذ نظام نقطة بيع (POS) لمتجره. أولًا، تريد بناء نموذج أولي له. في نموذجك الأولي، سيسجّل نظامك الكمية فقط. أعطاك صديقك قائمة بالقياسات لمساعدتك:

الوحدة القيمة
quarter_of_a_dozen 3
half_of_a_dozen 6
dozen 12
small_gross 120
gross 144
great_gross 1728

1. خزّن وحدة القياس في برنامجك

لكي تستخدم وحدة القياس، عليك تخزينها في برنامجك.

units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)

2. أنشئ فاتورة جديدة للعميل

تحتاج إلى تنفيذ دالة تُنشئ فاتورة جديدة (فارغة) للعميل.

bill := NewBill()
fmt.Println(bill)
// Output: map[]

3. أضف عنصرًا إلى فاتورة العميل

لتنفيذ ذلك، ستحتاج إلى:

  • أرجِع false إذا لم تكن الوحدة unit المُعطاة موجودة في خريطة units.
  • وإلا، أضف العنصر إلى bill الخاصة بالعميل، مُفهرَسًا باسم العنصر، ثم أرجِع true.
  • إذا كان العنصر موجودًا بالفعل في الفاتورة، فزد كميته بالمقدار الذي تقابله الوحدة unit المُعطاة.
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

لاحظ أن القيمة المُرجَعة من النوع bool.

4. أزل عنصرًا من فاتورة العميل

لتنفيذ ذلك، ستحتاج إلى:

  • أرجِع false إذا كان العنصر المُعطى غير موجود في الفاتورة
  • أرجِع false إذا لم تكن الوحدة unit المُعطاة موجودة في خريطة units.
  • أرجِع false إذا كانت الكمية الجديدة أقل من 0.
  • إذا كانت الكمية الجديدة 0، فأزل العنصر تمامًا من bill ثم أرجِع true.
  • وإلا، قلّل كمية العنصر وأرجِع true.
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

لاحظ أن القيمة المُرجَعة من النوع bool.

5. أرجِع كمية عنصر معيّن موجود في فاتورة العميل

لتنفيذ ذلك، ستحتاج إلى:

  • أرجِع 0 وfalse إذا لم يكن العنصر item موجودًا في الفاتورة.
  • وإلا، أرجِع كمية العنصر في bill وtrue.
bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true

لاحظ أن القيمتين المُرجَعتين من النوعين int وbool.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Go Exercism

مستعد لبدء المتجر الإجمالي؟

سجّل في Exercism لتتعلّم وتتقن Go عبر 34 مفهومًا165 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.