مسیرها
/
Crystal
Crystal
/
تمرین‌ها
/
کامپیوتر ناوبری
کامپیوتر ناوبری

کامپیوتر ناوبری

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

مقدمه

Crystal برای کاربردهای گوناگون، نوع‌های عددی مختلفی دارد. برای مثال، بعضی از نوع‌ها سریع‌ترند اما بازه‌ی مقادیر ممکن‌شان از بقیه کوچک‌تر است. بعضی دیگر بازه‌ی گسترده‌تری از مقادیر ممکن دارند اما کندترند.

در Crystal هم نوع‌های عدد صحیح علامت‌دار وجود دارد و هم نوع‌های عدد صحیح بدون علامت. نوع‌های عدد صحیح علامت‌دار می‌توانند مثبت یا منفی باشند. نوع‌های عدد صحیح بدون علامت فقط می‌توانند مثبت باشند.

نوع‌های عدد صحیح علامت‌دار

این‌ها نوع‌های عدد صحیح علامت‌دار در Crystal هستند:

نوع اندازه (بیت) بازه
Int8 ۸ از -۱۲۸ تا ۱۲۷
Int16 ۱۶ از -۳۲_۷۶۸ تا ۳۲_۷۶۷
Int32 ۳۲ از -۲_۱۴۷_۴۸۳_۶۴۸ تا ۲_۱۴۷_۴۸۳_۶۴۷
Int64 ۶۴ از -۹_۲۲۳_۳۷۲_۰۳۶_۸۵۴_۷۷۵_۸۰۸ تا ۹_۲۲۳_۳۷۲_۰۳۶_۸۵۴_۷۷۵_۸۰۷
Int128 ۱۲۸ از -۱۷۰_۱۴۱_۱۸۳_۴۶۰_۴۶۹_۲۳۱_۷۳۱_۶۸۷_۳۰۳_۷۱۵_۸۸۴_۱۰۵_۷۲۸ تا ۱۷۰_۱۴۱_۱۸۳_۴۶۰_۴۶۹_۲۳۱_۷۳۱_۶۸۷_۳۰۳_۷۱۵_۸۸۴_۱۰۵_۷۲۷

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

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

نوع پیش‌فرض عدد صحیح 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 ۳۲ از ۱.۲E-۳۸ تا ۳.۴E+۳۸
Float64 ۶۴ از ۲.۳E-۳۰۸ تا ۱.۷E+۳۰۸

دو نوع ممیز شناور متفاوت وجود دارد که یکی از دیگری دقیق‌تر است.

نوع پیش‌فرض ممیز شناور Float64 است.

می‌توانید از متد to_f<bit> برای تبدیل میان نوع‌های مختلف ممیز شناور استفاده کنید. متد to_f به نوع پیش‌فرض ممیز شناور، Float64، تبدیل می‌کند.

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

آژانس فضایی Exercism (ESA) با تمام سرعت در حال برنامه‌ریزی برای مأموریتی تازه به فوبوس است، قمری از مریخ. هدف این مأموریت نشاندن یک کاوشگر بر سطح فوبوس و فرستادن داده‌هایی درباره‌ی سطح آن است. 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 را به عنوان آرگومان می‌گیرد و مساحت را به‌صورت یک عدد صحیح بدون علامت ۳۲ بیتی برمی‌گرداند.

Note

مساحت داده‌شده همیشه در یک عدد صحیح بدون علامت ۳۲ بیتی جا می‌شود.

measurement = 52554
measurement.class
# => Int32

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

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

3. محاسبه‌ی سرعت

رایانه‌ی ناوبری باید سرعت کاوشگر را بداند. سرعت بر حسب متر بر ثانیه اندازه‌گیری می‌شود.

برای محاسبه‌ی سرعت باید مسافت پیموده‌شده و زمانی را که برای پیمودن آن مسافت صرف شده است بدانیم. سپس مسافت را بر زمان تقسیم کنید.

سرعت می‌تواند کمی نادقیق باشد و هرگز عدد بزرگی نخواهد بود. بنابراین می‌توانیم از یک Float32 استفاده کنیم.

متد Navigation#calculate_velocity را پیاده‌سازی کنید که distance و time را به عنوان آرگومان می‌گیرد و سرعت را به‌صورت یک Float ۳۲ بیتی برمی‌گرداند.

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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.