Kurzusok
/
Crystal
Crystal
/
Feladatok
/
Leolvadás-megelőzés
Leolvadás-megelőzés

Leolvadás-megelőzés

Tanulófeladat

Bevezetés

A Crystalben vannak úgynevezett vezérlő kifejezések. Ezekkel szabályozható, hogyan fut le a program, és igaz vagy hamis értéket vesznek fel. Vannak olyan operátorok, amelyekkel igaz vagy hamis értékeket hozhatsz létre, ezeket egyenlőség- és összehasonlító operátoroknak nevezzük.

Két fő vezérlő kifejezés dönti el, hogy melyik kód fut le és melyik nem, vagyis hogy melyik ág fut végre. Ez a kettő az if és az unless kifejezés.

Összehasonlító operátorok

Az összehasonlító operátorok értékek összehasonlítására szolgálnak, és true vagy false értéket adnak vissza. Ezek az operátorok két azonos típusú értéket várnak. Ha az értékek típusa eltér, a fordító hibát dob. Íme az összehasonlító operátorok listája, és egy-egy példa arra, mikor adnak true értéket:

Metódus Leírás Példa
< kisebb, mint 4 < 5
<= kisebb vagy egyenlő 4 <= 4
> nagyobb, mint 3 > 1
>= nagyobb vagy egyenlő 2 >= 2

Egyenlőségoperátorok

Az egyenlőségoperátorok hasonlítanak az összehasonlító operátorokhoz, de arra valók, hogy eldöntsék, két érték egyenlő-e.

A == operátor azt vizsgálja, hogy két érték egyenlő-e, az érték típusát is beleértve. Ha az értékek megegyeznek, true-t ad vissza, ellenkező esetben false-t. A == operátor bármilyen típusú értéket össze tud hasonlítani bármilyen más típusú értékkel. A != ugyanígy működik, de akkor ad true-t, ha az értékek nem egyenlők, és false-t, ha egyenlők.

Az if elágazás

Az if elágazás azt vizsgálja, hogy egy adott feltétel igaz-e vagy hamis. Ha a feltétel igaz, akkor lefut az elágazáson belüli kód. Az if elágazást az end kulcsszó zárja le.

if 1 == 1
  puts "1 is equal to 1"
end
# => 1 is equal to 1

if 1 > 2
  puts "1 is greater than 2"
end
# => no output

Az unless elágazás

Az unless elágazás nagyon hasonlóan működik az if elágazáshoz, de akkor futtatja az unless elágazáson belüli kódot, ha a feltétel hamis.

unless 1 == 1
  puts "1 is not equal to 1"
end
# => no output

unless 1 > 2
  puts "1 is not greater than 2"
end
# => 1 is not greater than 2

Az else ág

Az else ág az if és az unless elágazással együtt használható. Az else ág akkor fut le, ha az if ág vagy az unless ág nem fut le.

Bár egy `else` ág használható `unless,` mellett, ez nem ajánlott, mert rontja az olvashatóságot.
Helyette érdemesebb az `if !condition` szerkezetet használni `else` ággal.
if 1 == 1
  puts "1 is equal to 1"
else
  puts "1 is not equal to 1"
end
# => 1 is equal to 1

unless 1 < 2
  puts "1 is not greater than 2"
else
  puts "1 is greater than 2"
end
# => 1 is greater than 2

„Lépcsőzetes if” elágazások

Az elsif ág az if elágazással együtt használható. Az elsif ág akkor fut le, ha az if ág nem futott le, és az elsif feltétele igaz. Az elsif ágak egymás után fűzhetők, és az első igaz feltételű ág fut le. Az if elágazás végén lehet egy else ág is, amely akkor fut le, ha egyik korábbi ág feltétele sem volt igaz.

if 1 != 1
  puts "1 is not equal to 1"
elsif 1 > 2
  puts "1 is greater than 2"
else
  puts "1 is not equal to 1 and 1 is not greater than 2"
end
# => 1 is not equal to 1 and 1 is not greater than 2

Típusok elágazásokkal

Ha a változó különböző ágakban különböző típusú értéket kap, mindkét típust felveszi. Ez azért van, mert a fordító nem tudja, melyik ág fut le. Ezt a többszörös értékadást, más néven uniót, a későbbi fogalmakban fejtjük ki. Az alábbi példán láthatod:

if 1 == 1
  a = 1
else
  a = "1"
end

typeof(a) # => Int32 | String

Ternáris operátor

A Crystalben van ternáris operátor, egy egysoros if-else szerkezet: condition ? expression_if_truthy : expression_if_falsey

1 == 1 ? puts("1 is equal to 1") : puts("1 is not equal to 1")
# => 1 is equal to 1

Utasítások

Ebben a feladatban egy egyszerű vezérlőrendszert fejlesztünk egy atomreaktorhoz.

Ahhoz, hogy a reaktor energiát termeljen, kritikussági állapotban kell lennie. Ha a reaktor a kritikusságnál alacsonyabb állapotban van, akkor károsodhat. Ha a reaktor állapota túllépi a kritikusságot, akkor túlterhelődhet, és zónaolvadáshoz vezethet. Szeretnénk csökkenteni a zónaolvadás esélyét, és megfelelően kezelni a reaktor állapotát.

A következő három részfeladat mindegyike az ideális reaktorállapot fenntartásához szükséges kód megírásához kapcsolódik.

1. A kritikusság ellenőrzése

A vezérlőrendszer első dolga, hogy ellenőrizze, a reaktor kiegyensúlyozott-e a kritikusság szempontjából. A reaktor akkor tekinthető kritikusnak, ha teljesülnek a következő feltételek:

  • A hőmérséklet kisebb, mint 800 K.
  • A másodpercenként kibocsátott neutronok száma nagyobb, mint 500.
  • A hőmérséklet és a másodpercenként kibocsátott neutronok szorzata kisebb, mint 500000.

Valósítsd meg a Reactor.criticality_balanced? metódust, amely temperature (kelvinben mérve) és neutrons_emitted paramétereket vesz át, és true-t ad vissza, ha a kritikussági feltételek teljesülnek, false-t, ha nem.

Reactor.criticality_balanced?(750, 600)
# => true

2. A kimeneti teljesítmény tartományának meghatározása

Miután a reaktor elkezdett energiát termelni, meg kell határozni a hatásfokát. A hatásfok 4 sávba sorolható:

  1. green -> 80%-os vagy annál nagyobb hatásfok,
  2. orange -> 80%-nál kisebb, de legalább 60%-os hatásfok,
  3. red -> 60%-nál kisebb, de még mindig legalább 30%-os hatásfok,
  4. black -> 30%-nál kisebb hatásfok.

A százalékos érték a következőképpen számítható ki: (generated_power/theoretical_max_power)*100, ahol generated_power = voltage * current. Vedd figyelembe, hogy a százalékos érték általában nem egész szám, ezért ügyelj a < és <= összehasonlítások helyes használatára.

Valósítsd meg a Reactor.reactor_efficiency metódust három paraméterrel: voltage, current és theoretical_max_power. Ez a függvény a reaktor hatásfoksávját adja vissza: „green”, „orange”, „red” vagy „black”.

Reactor.reactor_efficiency(200,50,15000)
# => "orange"

3. Hibabiztos mechanizmus

Az utolsó részfeladatod egy hibabiztos mechanizmus létrehozása, amely elkerüli a túlterhelést és a zónaolvadást. Ez a mechanizmus meghatározza, hogy a reaktor az ideális kritikussági küszöb alatt, azzal egy szinten vagy felette van-e. A kritikusság ezután növelhető, csökkenthető vagy leállítható a szabályozórudak reaktorba történő behelyezésével (vagy eltávolításával).

Valósítsd meg a Reactor.fail_safe() metódust, amely 3 paramétert vesz át: temperature (kelvinben mérve), neutrons_produced_per_second és threshold, és egy állapotkódot ad ki a reaktorhoz.

  • Ha temperature * neutrons_produced_per_second < a threshold 90%-a, akkor add ki a „LOW” állapotkódot, jelezve, hogy az energiatermeléshez el kell távolítani a szabályozórudakat.

  • Ha temperature * neutrons_produced_per_second a threshold plusz-mínusz 10%-án belül van, a reaktor kritikus állapotban van, és a „NORMAL” állapotkódot kell kiadni, jelezve, hogy a reaktor optimális állapotban van, és a szabályozórudak ideális helyzetben vannak.

  • Ha temperature * neutrons_produced_per_second nincs a fent említett tartományokban, a reaktor zónaolvadásba kerül, és a „DANGER” állapotkódot kell kiadni, hogy azonnal leállítsák a reaktort.

temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Leolvadás-megelőzés 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.