سرشماری

سرشماری

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

مقدمه

زبان Go مفهومی به نام «خالی»، «null» یا «undefined» برای مقادیر متغیرها ندارد. متغیرهایی که بدون مقدار اولیه‌ی صریح اعلام می‌شوند، به‌صورت پیش‌فرض مقدار صفر نوع خودشان را می‌گیرند.

مقدار صفر برای انواع اولیه مانند «منطقی»، انواع عددی و رشته‌ها به ترتیب false، 0 و "" است.

شناسه‌ی nil که به معنای صفر است، مقدار صفر برای انواع پیچیده‌تری مانند اشاره‌گرها، توابع، رابط‌ها، برش‌ها، کانال‌ها و نقشه‌هاست.

جدول زیر مقدار صفر را برای انواع Go نشان می‌دهد.

نوع مقدار صفر
منطقی false
عددی 0
رشته ""
اشاره‌گر nil
تابع nil
رابط nil
برش nil
کانال nil
نقشه nil

شاید متوجه شده باشید که انواع ساختار در جدول بالا نیامده‌اند. دلیلش این است که مقدار صفر برای یک نوع ساختار به فیلدهای آن بستگی دارد. یک ساختار زمانی به مقدار صفر خود می‌رسد که همه‌ی فیلدهایش به مقدار صفر مربوط به خودشان تنظیم شده باشند.

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

وظیفه‌ی شما این است که سیستم فناوری اطلاعات شهر را برای یک سرشماری پیش رو آماده کنید. به‌طور مشخص، مسئولیت برنامه‌ای را بر عهده دارید که داده‌های مأموران سرشماری را پردازش خواهد کرد.

برنامه باید بتواند با دریافت اطلاعات یک ساکن، ساکن تازه‌ای در سیستم ایجاد کند. علاوه بر این، توابعی خواهید ساخت که مطمئن شوند اطلاعات لازم در داده‌های ساکن وجود دارد و داده‌های یک ساکن را حذف می‌کنند. در پایان، ساکنان را می‌شمارید تا شمار دقیق سرشماری به دست آید.

1. ایجاد یک ساکن جدید

وقتی مأمور سرشماری اطلاعات یک ساکن را جمع‌آوری می‌کند، باید آن ساکن را با وارد کردن اسم، سن و نشانی‌اش در سیستم ثبت کند.

تابع NewResident را پیاده‌سازی کنید که سه آرگومان می‌گیرد:

  • اسم ساکن.
  • سن ساکن.
  • نشانی ساکن.

تابع باید اشاره‌گری به یک struct به نام Resident برگرداند که این اطلاعات را در خود نگه می‌دارد.

name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}

NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}

2. اعتبارسنجی اطلاعات لازم

ممکن است ساکنان تمایلی به ارائه‌ی داده‌های شخصی خود به مأموران سرشماری نداشته باشند. در چنین مواردی باید مشخص کنیم که آیا ساکن اطلاعات لازم را برای شمرده شدن در سرشماری ارائه کرده است یا نه.

برای اینکه ساکنی شمرده شود، باید برای اسم خود مقدار غیرصفر و نشانی‌ای ارائه کند که کلید street در آن مقدار غیرصفر داشته باشد. بقیه‌ی اطلاعات، مثل سن ساکن، اختیاری است. متد HasRequiredInfo را پیاده‌سازی کنید که یک مقدار «منطقی» برمی‌گرداند و نشان می‌دهد آیا ساکن اطلاعات لازم را ارائه کرده است یا نه.

name := "Matthew Sanabria"
age := 0
address := make(map[string]string)

resident := NewResident(name, age, address)

resident.HasRequiredInfo()
// => false

3. حذف اطلاعات ساکن

زندگی سریع می‌گذرد و اشتباه‌ها رخ می‌دهند. ممکن است ساکنی از شهر نقل مکان کند. ممکن است مأمور سرشماری هنگام جمع‌آوری داده‌ها اشتباه کند. در چنین مواردی باید بتوان داده‌های یک ساکن را حذف کرد تا شمرده نشود.

متد Delete را پیاده‌سازی کنید که همه‌ی فیلدهای ساکن را روی مقدار صفرشان قرار می‌دهد.

name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}

resident := NewResident(name, age, address)

fmt.Println(resident)
// Output: &{Matthew Sanabria 29 map[street:Main St.]}

resident.Delete()

fmt.Println(resident)
// Output: &{ 0 map[]}

4. شمردن ساکنان

حالا که سیستم از داده‌های سرشماری پشتیبانی می‌کند، وقت آن رسیده که سرشماری را انجام دهید و ساکنان را بشمارید!

تابع Count را پیاده‌سازی کنید که یک آرگومان می‌گیرد:

  • یک slice از اشاره‌گرها به structهای Resident.

تابع باید یک عدد صحیح برگرداند که تعداد ساکنان شمرده‌شده در سرشماری را نشان می‌دهد. هر ساکن تنها در صورتی شمرده می‌شود که اطلاعات لازم را به مأمور سرشماری ارائه کرده باشد.

name1 := "Matthew Sanabria"
age1 := 29
address1 := map[string]string{"street": "Main St."}

resident1 := NewResident(name1, age1, address1)

name2 := "Rob Pike"
age2 := 0
address2 := make(map[string]string)

resident2 := NewResident(name2, age2, address2)

residents := []*Resident{resident1, resident2}

Count(residents)
// => 1
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Go Exercism

آماده‌اید سرشماری را شروع کنید؟

در Exercism ثبت‌نام کنید تا Go را همراه با 34 مفهوم166 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.