A Crystalban számos különböző számtípus létezik, különféle célokra. Például egyes típusok gyorsabbak, de kisebb a lehetséges értékeik tartománya, mint másoknak. Néhány típusnak nagyobb a lehetséges értéktartománya, de lassabbak.
A Crystalban léteznek előjeles és előjel nélküli egész típusok is. Az előjeles egész típusok lehetnek pozitívak vagy negatívak. Az előjel nélküli egész típusok csak pozitívak lehetnek.
Ezek az előjeles egész típusok a Crystalban:
| Típus | Méret (bit) | Tartomány |
|---|---|---|
Int8 |
8 | -128-tól 127-ig |
Int16 |
16 | -32_768-tól 32_767-ig |
Int32 |
32 | -2_147_483_648-tól 2_147_483_647-ig |
Int64 |
64 | -9_223_372_036_854_775_808-tól 9_223_372_036_854_775_807-ig |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728-tól 170_141_183_460_469_231_731_687_303_715_884_105_727-ig |
A kisebb típusok kevesebb memóriát használnak és gyorsabbak, mint a nagyobb típusok, de kisebb a lehetséges értékeik tartománya.
Ha tudod, hogy az értékek egy bizonyos tartományon belül lesznek, a legjobb a lehető legkisebb típust használni a memória megtakarítása és a teljesítmény javítása érdekében.
Az alapértelmezett egész típus az Int32.
Ha egy egész számot adott típussal akarsz deklarálni, használhatod a típusnevet utótagként, a <number>_I <bit> hozzáadásával.
1_i8.class
# => Int8
A különböző egész típusok közötti átalakításhoz használhatod a to_i<bit> metódust.
A to_i metódus az alapértelmezett egész típusra, az Int32-re alakít.
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
Ezek az előjel nélküli egész típusok a Crystalban:
UInt8, UInt16, UInt32, UInt64, UInt128
Az előjeles és előjel nélküli egészek között az egyetlen különbség, hogy az előjel nélküli egészek csak pozitívak lehetnek.
Ha egy előjel nélküli egész számot adott típussal akarsz deklarálni, használhatod a típusnevet utótagként, a <number>_u<bit> hozzáadásával.
A különböző előjel nélküli egész típusok közötti átalakításhoz használhatod a to_u<bit> metódust.
A to_u metódus az alapértelmezett előjel nélküli egész típusra, az UInt32-re alakít.
1_u8.to_u16.class
# => UInt16
Ezek a lebegőpontos típusok a Crystalban:
| Típus | Méret (bit) | Tartomány |
|---|---|---|
Float32 |
32 | 1.2E-38-tól 3.4E+38-ig |
Float64 |
64 | 2.3E-308-tól 1.7E+308-ig |
Két különböző lebegőpontos típus van, az egyik pontosabb, mint a másik.
Az alapértelmezett lebegőpontos típus a Float64.
A különböző lebegőpontos típusok közötti átalakításhoz használhatod a to_f<bit> metódust.
A to_f metódus az alapértelmezett lebegőpontos típusra, a Float64-re alakít.
Az ESA (Exercism Űrügynökség) gőzerővel tervez egy új missziót a Mars egyik holdjára, a Phobosra. A misszió célja, hogy egy szondát leszállítsanak a Phobos felszínére, és adatokat küldjenek vissza a felszínről. Az ESA a segítségedet kérte, hogy megépítsd a szonda navigációs számítógépét. A navigációs számítógép memóriája korlátozott, ezért a memóriahasználatot a lehető legalacsonyabban kell tartanunk. Ezért a megfelelő adattípusokat kell használnunk.
A navigációs számítógépnek ismernie kell néhány objektum távolságát az űrben, hogy elvégezhesse a helyes számításokat. A távolságot km-ben mérik.
Definiáld a következő állandókat:
NEPTUNE_DISTANCE a 4_400_000_000 értékkel, amelyet Int64-ként kell tárolniMARS_DISTANCE a 227_940_000 értékkel, amelyet Int32-ként kell tárolniATMOSPHERE_DISTANCE a 10_000 értékkel, amelyet Int16-ként kell tárolniA navigációs számítógépnek ismernie kell néhány objektum területét az űrben, hogy elvégezhesse a helyes számításokat. A terület NEM lehet negatív. A mérnökök úgy tervezték a programot, hogy túlcsordulási hibát generáljon, amikor a terület negatív. A mérnökök azonban elfelejtették az előjeles egész számot előjel nélküli egész számmá alakítani.
Ezért a mérnökök egy olyan programot szeretnének, amely az előjeles egész számot előjel nélküli egész számmá alakítja.
Valósítsd meg a Navigation#correct_area_analysis metódust, amely egy measurement argumentumot kap, és a területet 32 bites előjel nélküli egészként adja vissza.
A megadott terület mindig elfér egy 32 bites előjel nélküli egész számban.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
A navigációs számítógépnek ismernie kell a szonda sebességét. A sebességet m/s-ban mérik.
A sebesség kiszámításához ismernünk kell a megtett távolságot és az utazáshoz szükséges időt. Ezután vedd a távolságot, és oszd el az idővel.
A sebesség nem feltétlenül pontos, és soha nem lesz jelentős nagyságú szám.
Ezért használhatunk Float32-t.
Valósítsd meg a Navigation#calculate_velocity metódust, amely distance és time argumentumokat kap, és a sebességet 32 bites Float-ként adja vissza.
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.