ट्रैक
/
Crystal
Crystal
/
अभ्यास
/
नेविगेशन कंप्यूटर
नेविगेशन कंप्यूटर

नेविगेशन कंप्यूटर

सीखने का अभ्यास

परिचय

Crystal में अलग-अलग ज़रूरतों के लिए कई तरह के संख्या टाइप होते हैं। जैसे, कुछ टाइप बाकी टाइपों से तेज़ होते हैं, लेकिन उनमें संभावित वैल्यू की रेंज कम होती है। कुछ टाइपों में संभावित वैल्यू की रेंज ज़्यादा होती है, पर वे धीमे होते हैं।

Crystal में चिह्नित और अचिह्नित, दोनों तरह के पूर्णांक टाइप होते हैं। चिह्नित पूर्णांक टाइप धनात्मक या ऋणात्मक हो सकते हैं। अचिह्नित पूर्णांक टाइप केवल धनात्मक हो सकते हैं।

चिह्नित पूर्णांक टाइप

Crystal में ये चिह्नित पूर्णांक टाइप हैं:

टाइप आकार (बिट में) रेंज
Int8 8 -128 से 127 तक
Int16 16 -32_768 से 32_767 तक
Int32 32 -2_147_483_648 से 2_147_483_647 तक
Int64 64 -9_223_372_036_854_775_808 से 9_223_372_036_854_775_807 तक
Int128 128 -170_141_183_460_469_231_731_687_303_715_884_105_728 से 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 से 3.4E+38 तक
Float64 64 2.3E-308 से 1.7E+308 तक

दो अलग-अलग दशमलव संख्या टाइप होते हैं, जिनमें एक दूसरे से ज़्यादा सटीक होता है।

डिफॉल्ट दशमलव संख्या टाइप Float64 है।

अलग-अलग दशमलव संख्या टाइपों के बीच बदलने के लिए आप to_f<bit> मेथड इस्तेमाल कर सकते हैं। to_f मेथड डिफॉल्ट दशमलव संख्या टाइप, Float64, में बदलता है।

निर्देश

ESA (Exercism Space Agency) मंगल के एक चाँद Phobos पर एक नया मिशन भेजने की योजना पूरी रफ्तार से बना रहा है। इस मिशन का उद्देश्य Phobos की सतह पर एक प्रोब उतारना और सतह के बारे में जानकारी वापस भेजना है। 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 को आर्गुमेंट के रूप में लेता है और वेग को 32 बिट वाले 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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।