Η Crystal διαθέτει μια ποικιλία από διαφορετικούς τύπους αριθμών για διάφορους σκοπούς. Για παράδειγμα, κάποιοι τύποι είναι ταχύτεροι αλλά έχουν μικρότερο εύρος δυνατών τιμών από άλλους. Κάποιοι έχουν πιο εκτεταμένο εύρος δυνατών τιμών αλλά είναι πιο αργοί.
Στη Crystal, υπάρχουν και προσημασμένοι και μη προσημασμένοι τύποι ακεραίων. Οι προσημασμένοι τύποι ακεραίων μπορούν να είναι θετικοί ή αρνητικοί. Οι μη προσημασμένοι τύποι ακεραίων μπορούν να είναι μόνο θετικοί.
Αυτοί είναι οι τύποι προσημασμένων ακεραίων στη Crystal:
| Τύπος | Μέγεθος (σε bit) | Εύρος |
|---|---|---|
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:
| Τύπος | Μέγεθος (σε bit) | Εύρος |
|---|---|---|
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) βρίσκεται σε πλήρη εξέλιξη, σχεδιάζοντας μια νέα αποστολή στον Φόβο, έναν δορυφόρο του Άρη. Ο στόχος της αποστολής είναι να προσγειώσει έναν ανιχνευτή στην επιφάνεια του Φόβου και να στείλει πίσω δεδομένα για την επιφάνεια. Η ESA ζήτησε τη βοήθειά σου για να φτιάξεις τον υπολογιστή πλοήγησης του ανιχνευτή. Ο υπολογιστής πλοήγησης έχει περιορισμένη μνήμη, οπότε πρέπει να κρατήσουμε τη χρήση της μνήμης όσο το δυνατόν χαμηλότερη. Γι' αυτό, πρέπει να χρησιμοποιήσουμε τους κατάλληλους τύπους δεδομένων.
Ο υπολογιστής πλοήγησης χρειάζεται να γνωρίζει την απόσταση ανάμεσα σε κάποια αντικείμενα στο διάστημα για να κάνει τους σωστούς υπολογισμούς. Η απόσταση μετριέται σε km.
Όρισε τις παρακάτω σταθερές:
NEPTUNE_DISTANCE με την τιμή 4_400_000_000 που θα πρέπει να αποθηκευτεί ως Int64
MARS_DISTANCE με την τιμή 227_940_000 που θα πρέπει να αποθηκευτεί ως Int32
ATMOSPHERE_DISTANCE με την τιμή 10_000 που θα πρέπει να αποθηκευτεί ως Int16
Ο υπολογιστής πλοήγησης χρειάζεται να γνωρίζει το εμβαδόν κάποιων αντικειμένων στο διάστημα για να κάνει τους σωστούς υπολογισμούς. Ένα εμβαδόν ΔΕΝ μπορεί να είναι αρνητικό. Οι μηχανικοί είχαν σχεδιάσει το πρόγραμμα να παράγει ένα σφάλμα υπερχείλισης όταν το εμβαδόν ήταν αρνητικό. Ωστόσο, οι μηχανικοί ξέχασαν να αλλάξουν τον προσημασμένο ακέραιο σε απρόσημο ακέραιο.
Επομένως, οι μηχανικοί θα ήθελαν ένα πρόγραμμα που μετατρέπει έναν προσημασμένο ακέραιο σε απρόσημο ακέραιο.
Υλοποίησε τη μέθοδο Navigation#correct_area_analysis που παίρνει ένα measurement ως όρισμα και επιστρέφει το εμβαδόν ως απρόσημο ακέραιο με 32 bits.
Το εμβαδόν που δίνεται θα χωράει πάντα σε έναν απρόσημο ακέραιο με 32 bits.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
Ο υπολογιστής πλοήγησης χρειάζεται να γνωρίζει την ταχύτητα του ανιχνευτή. Η ταχύτητα μετριέται σε m/s.
Για να υπολογίσουμε την ταχύτητα, χρειάζεται να γνωρίζουμε την απόσταση που διανύθηκε και τον χρόνο που χρειάστηκε για να διανυθεί αυτή η απόσταση. Έπειτα, πάρε την απόσταση και διαίρεσέ τη με τον χρόνο.
Η ταχύτητα μπορεί να μην είναι ακριβής και δεν θα είναι ποτέ ένας μεγάλος αριθμός.
Γι' αυτό, μπορούμε να χρησιμοποιήσουμε ένα Float32.
Υλοποίησε τη μέθοδο Navigation#calculate_velocity που παίρνει distance και time ως ορίσματα και επιστρέφει την ταχύτητα ως Float με 32 bits.
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.