المسارات
/
Crystal
Crystal
/
التمارين
/
حاسوب الملاحة
حاسوب الملاحة

حاسوب الملاحة

تمرين تعلّمي

مقدمة

تحتوي Crystal على مجموعة متنوعة من أنواع الأعداد المختلفة لأغراض متعددة. على سبيل المثال، بعض الأنواع أسرع لكن مدى قيمها الممكنة أصغر من غيرها. وبعضها الآخر له مدى أوسع من القيم الممكنة لكنه أبطأ.

في Crystal، توجد أنواع الأعداد الصحيحة الموقّعة وأنواع الأعداد الصحيحة غير الموقّعة. يمكن أن تكون الأعداد الصحيحة الموقّعة موجبة أو سالبة. أما الأعداد الصحيحة غير الموقّعة فلا يمكن أن تكون إلا موجبة.

أنواع الأعداد الصحيحة الموقّعة

هذه هي أنواع الأعداد الصحيحة الموقّعة في Crystal:

النوع الحجم (بت) المدى
Int8 8 -128 to 127
Int16 16 -32_768 to 32_767
Int32 32 -2_147_483_648 to 2_147_483_647
Int64 64 -9_223_372_036_854_775_808 to 9_223_372_036_854_775_807
Int128 128 -170_141_183_460_469_231_731_687_303_715_884_105_728 to 170_141_183_460_469_231_731_687_303_715_884_105_727

تستهلك الأنواع الأصغر ذاكرة أقل وتكون أسرع من الأنواع الأكبر، لكن مداها من القيم الممكنة أصغر.

حين تعرف أن القيم ستقع ضمن مدى معيّن، فمن الأفضل استخدام أصغر نوع ممكن لتوفير الذاكرة وتحسين الأداء.

نوع الأعداد الصحيحة الافتراضي هو Int32. لتعريف عدد صحيح بنوع محدّد، يمكنك استخدام اسم النوع كلاحقة عبر إضافة <number>_I <bit>.

1_i8.class
# => Int8

يمكنك استخدام طريقة to_i<bit> للتحويل بين أنواع الأعداد الصحيحة المختلفة. تحوّل طريقة to_i إلى نوع الأعداد الصحيحة الافتراضي، Int32.

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

أنواع الأعداد الصحيحة غير الموقّعة

هذه هي أنواع الأعداد الصحيحة غير الموقّعة في Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

الفرق الوحيد بين الأعداد الصحيحة الموقّعة وغير الموقّعة هو أن غير الموقّعة لا يمكن أن تكون إلا موجبة. لتعريف عدد صحيح غير موقّع بنوع محدّد، يمكنك استخدام اسم النوع كلاحقة عبر إضافة <number>_u<bit>. يمكنك استخدام طريقة to_u<bit> للتحويل بين أنواع الأعداد الصحيحة غير الموقّعة المختلفة. تحوّل طريقة to_u إلى نوع الأعداد الصحيحة غير الموقّعة الافتراضي، UInt32.

1_u8.to_u16.class
# => UInt16

أنواع الأعداد ذات الفاصلة العائمة

هذه هي أنواع الأعداد ذات الفاصلة العائمة في Crystal:

النوع الحجم (بت) المدى
Float32 32 1.2E-38 to 3.4E+38
Float64 64 2.3E-308 to 1.7E+308

يوجد نوعان مختلفان من أنواع الأعداد ذات الفاصلة العائمة، أحدهما أدقّ من الآخر.

نوع الأعداد ذات الفاصلة العائمة الافتراضي هو Float64.

يمكنك استخدام طريقة to_f<bit> للتحويل بين أنواع الأعداد ذات الفاصلة العائمة المختلفة. تحوّل طريقة to_f إلى نوع الأعداد ذات الفاصلة العائمة الافتراضي، Float64.

التعليمات

تعمل وكالة الفضاء Exercism (ESA) بكامل طاقتها على التخطيط لمهمة جديدة إلى فوبوس، أحد أقمار المريخ. هدف المهمة هو إنزال مسبار على سطح فوبوس وإرسال بيانات عن هذا السطح. وقد طلبت الوكالة مساعدتك في بناء حاسوب الملاحة الخاص بالمسبار. ذاكرة حاسوب الملاحة محدودة، لذا نحتاج إلى إبقاء استهلاك الذاكرة في أدنى حد ممكن. لذلك، علينا استخدام أنواع البيانات المناسبة.

1. ثوابت الملاحة

يحتاج حاسوب الملاحة إلى معرفة المسافة بين بعض الأجسام في الفضاء لإجراء الحسابات الصحيحة، وتُقاس المسافة بالكيلومتر.

عرّف الثوابت التالية:

  • NEPTUNE_DISTANCE بالقيمة 4_400_000_000 والتي ينبغي تخزينها على هيئة Int64
  • MARS_DISTANCE بالقيمة 227_940_000 والتي ينبغي تخزينها على هيئة Int32
  • ATMOSPHERE_DISTANCE بالقيمة 10_000 والتي ينبغي تخزينها على هيئة Int16

2. التحليل الصحيح للمساحة

يحتاج حاسوب الملاحة إلى معرفة مساحة بعض الأجسام في الفضاء لإجراء الحسابات الصحيحة. لا يمكن أن تكون المساحة سالبة. خطط المهندسون لأن يُنتج البرنامج خطأ تجاوز السعة عندما تكون المساحة سالبة. غير أن المهندسين نسوا تغيير العدد الصحيح بإشارة إلى عدد صحيح بدون إشارة.

لذلك، يريد المهندسون برنامجًا يحوّل عددًا صحيحًا بإشارة إلى عدد صحيح بدون إشارة.

نفّذ الطريقة Navigation#correct_area_analysis التي تأخذ measurement كوسيط وتُرجع المساحة كعدد صحيح بدون إشارة من 32 بت.

Note

ستتسع المساحة المعطاة دائمًا لعدد صحيح بدون إشارة من 32 بت.

measurement = 52554
measurement.class
# => Int32

Navigation.new.correct_area_analysis(measurement)
# => 52554

Navigation.new.correct_area_analysis(measurement).class
# => UInt32

3. حساب السرعة

يحتاج حاسوب الملاحة إلى معرفة سرعة المسبار. وتُقاس السرعة بوحدة m/s.

لحساب السرعة، نحتاج إلى معرفة المسافة المقطوعة والزمن الذي استغرقه قطع تلك المسافة. ثم نأخذ المسافة ونقسمها على الزمن.

قد لا تكون السرعة دقيقة تمامًا، ولن تكون أبدًا عددًا كبيرًا. لذلك، يمكننا استخدام Float32.

نفّذ الطريقة Navigation#calculate_velocity التي تأخذ distance و time كوسيطين وتُرجع السرعة على هيئة Float من 32 بت.

distance = 52554
time = 2.5

Navigation.new.calculate_velocity(distance, time)
# => 21021.6

Navigation.new.calculate_velocity(distance, time).class
# => Float32
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Crystal Exercism

مستعد لبدء حاسوب الملاحة؟

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