مسیرها
/
Go
Go
/
تمرین‌ها
/
فروشگاه گروس
فروشگاه گروس

فروشگاه گروس

تمرین یادگیری

مقدمه

در Go، map یک نوع داده‌ی توکار است که کلیدها را به مقدارها نگاشت می‌کند. در زبان‌های برنامه‌نویسی دیگر، ممکن است با مفهوم map به عنوان دیکشنری، جدول درهم‌سازی، مخزن کلید/مقدار یا آرایه‌ی انجمنی آشنا باشید.

از نظر نحوه‌ی نگارش، map به این شکل است:

map[KeyType]ElementType

همچنین مهم است بدانید که هر کلید یکتاست، یعنی اگر یک کلید را دو بار مقداردهی کنید، مقدار کلید متناظر بازنویسی می‌شود.

برای ساختن map، می‌توانید این کار را انجام دهید:

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

یا

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

در ادامه چند عملیات که می‌توانید با map انجام دهید آورده شده است

  // 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")

اگر بخواهید مقدار یک کلید را که در map وجود ندارد بازیابی کنید، مقدار صفر نوع مقدار را برمی‌گرداند. این می‌تواند شما را سردرگم کند، به‌ویژه اگر مقدار پیش‌فرض ElementType شما (برای مثال، ۰ برای یک int) یک مقدار معتبر باشد. برای بررسی اینکه آیا کلیدی در map شما وجود دارد، می‌توانید از این استفاده کنید:

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

دستورالعمل‌ها

یکی از دوستانتان یک فروشگاه عمده‌فروشی قدیمی به اسم Gross Store دارد. این اسم از مقدار کالایی می‌آید که فروشگاه می‌فروشد: همه‌شان بر حسب واحد گروس هستند. دوستتان از شما خواسته است برای فروشگاهش یک سیستم نقطه‌ی فروش (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. یک قلم کالا به صورتحساب مشتری اضافه کنید

برای پیاده‌سازی این مورد، باید این کارها را انجام دهید:

  • اگر unit داده‌شده در نگاشت units نباشد، false را برگردانید.
  • در غیر این صورت کالا را با کلید اسم کالا به 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 را برگردانید.
  • اگر unit داده‌شده در نگاشت units نباشد، false را برگردانید.
  • اگر مقدار جدید کمتر از 0 شود، false را برگردانید.
  • اگر مقدار جدید 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. مقدار یک کالای مشخص را که در صورتحساب مشتری است برگردانید

برای پیاده‌سازی این مورد، باید این کارها را انجام دهید:

  • اگر item در صورتحساب نباشد، 0 و false را برگردانید.
  • در غیر این صورت، مقدار کالا در 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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.