Kurzusok
/
Crystal
Crystal
/
Feladatok
/
Navigációs számítógép
Navigációs számítógép

Navigációs számítógép

Tanulófeladat

Bevezetés

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.

Előjeles egész típusok

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

Előjel nélküli egész típusok

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

Lebegőpontos típusok

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.

Utasítások

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.

1. Navigációs állandók

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árolni
  • MARS_DISTANCE a 227_940_000 értékkel, amelyet Int32-ként kell tárolni
  • ATMOSPHERE_DISTANCE a 10_000 értékkel, amelyet Int16-ként kell tárolni

2. A terület helyes elemzése

A 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.

Note

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

3. A sebesség kiszámítása

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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Navigációs számítógép feladatot?

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.