التعداد

التعداد

تمرين تعلّمي

مقدمة

لا يوجد في لغة Go مفهوم للقيمة الفارغة أو المنعدمة أو غير المعرّفة لقيم المتغيرات. المتغيرات المعلَنة دون قيمة ابتدائية صريحة تأخذ افتراضيًا القيمة الصفرية لنوعها.

القيمة الصفرية للأنواع الأولية مثل القيم المنطقية والأنواع العددية والسلاسل النصية هي false و0 و"" على الترتيب.

المعرّف nil، بمعنى الصفر، هو القيمة الصفرية للأنواع الأكثر تعقيدًا مثل المؤشرات والدوال والواجهات والشرائح والقنوات والخرائط.

يوضّح الجدول التالي القيمة الصفرية لأنواع Go.

النوع القيمة الصفرية
قيمة منطقية false
عددية 0
سلسلة نصية ""
مؤشر nil
دالة nil
واجهة nil
شريحة nil
قناة nil
خريطة nil

ربما لاحظت أن أنواع البُنى غائبة عن الجدول أعلاه. وذلك لأن القيمة الصفرية لنوع البنية تعتمد على حقوله. تُضبط البُنى على قيمتها الصفرية عندما تُضبط جميع حقولها على قيمتها الصفرية.

التعليمات

مهمتك هي تجهيز نظام تقنية المعلومات في المدينة من أجل تعداد سكاني قادم. وبشكل أكثر تحديدًا، أنت مسؤول عن البرنامج الذي سيعالج البيانات الواردة من موظفي التعداد.

يجب أن يكون البرنامج قادرًا على إنشاء مقيم جديد في النظام عند إعطائه معلومات المقيم. بالإضافة إلى ذلك، ستنشئ دوالًا تتأكد من وجود المعلومات المطلوبة في بيانات المقيم، وتحذف بيانات المقيم. وأخيرًا، ستعدّ المقيمين لتوفير عدد دقيق للتعداد السكاني.

1. أنشئ مقيمًا جديدًا

عندما يجمع موظف التعداد معلومات أحد المقيمين، فإنه يحتاج إلى تسجيل ذلك المقيم بإدخال اسمه وعمره وعنوانه في النظام.

نفّذ الدالة NewResident التي تقبل ثلاثة وسائط:

  • اسم المقيم.
  • عمر المقيم.
  • عنوان المقيم.

ينبغي أن تُرجع الدالة مؤشرًا إلى بنية 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 التي تقبل وسيطًا واحدًا:

  • شريحة من مؤشرات إلى بُنى 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.