Διαδρομές
/
Crystal
Crystal
/
Ασκήσεις
/
Αποτροπή κατάρρευσης
Αποτροπή κατάρρευσης

Αποτροπή κατάρρευσης

Άσκηση εκμάθησης

Εισαγωγή

Η Crystal έχει αυτό που ονομάζουμε εκφράσεις ελέγχου. Αυτές χρησιμοποιούνται για να ελέγχουν τον τρόπο με τον οποίο θα τρέξει το πρόγραμμα και παίρνουν μια αληθή ή ψευδή τιμή. Υπάρχουν τελεστές που μπορούν να χρησιμοποιηθούν για να δημιουργήσουν αληθείς ή ψευδείς τιμές, αυτοί είναι γνωστοί ως τελεστές ισότητας και σύγκρισης.

Υπάρχουν δύο βασικές εκφράσεις ελέγχου που καθορίζουν ποιος κώδικας θα εκτελεστεί και ποιος όχι. Με άλλα λόγια, ποιος από τους κλάδους θα εκτελεστεί.

Αυτές οι δύο είναι: η if και η έκφραση unless.

Τελεστές σύγκρισης

Οι τελεστές σύγκρισης χρησιμοποιούνται για να συγκρίνουν τιμές και επιστρέφουν μια τιμή true ή false. Αυτοί οι τελεστές απαιτούν δύο τιμές ίδιου τύπου για να συγκριθούν. Αν οι τιμές δεν είναι ίδιου τύπου, τότε ο μεταγλωττιστής θα πετάξει ένα σφάλμα. Ακολουθεί μια λίστα με τους τελεστές σύγκρισης και ένα παράδειγμα για το πότε δίνουν την τιμή true:

Μέθοδος Περιγραφή Παράδειγμα
< μικρότερο από 4 < 5
<= μικρότερο ή ίσο με 4 <= 4
> μεγαλύτερο από 3 > 1
>= μεγαλύτερο ή ίσο με 2 >= 2

Τελεστές ισότητας

Οι τελεστές ισότητας είναι παρόμοιοι με τους τελεστές σύγκρισης, αλλά χρησιμοποιούνται για να ελέγξουν αν δύο τιμές είναι ίσες ή όχι.

Ο τελεστής == ελέγχει αν δύο τιμές είναι ίσες, συμπεριλαμβανομένου του τύπου της τιμής. Αν οι τιμές είναι ίδιες, τότε επιστρέφει true, αλλιώς επιστρέφει false. Ο τελεστής == μπορεί να συγκρίνει οποιονδήποτε τύπο τιμής με οποιονδήποτε άλλο τύπο τιμής. Ο != λειτουργεί με τον ίδιο τρόπο, αλλά επιστρέφει true αν οι τιμές δεν είναι ίσες και false αν είναι ίσες.

Η εντολή if

Η εντολή if χρησιμοποιείται για να ελέγξει αν μια δεδομένη συνθήκη είναι αληθής ή ψευδής. Αν η συνθήκη είναι αληθής, τότε ο κώδικας μέσα στην εντολή if θα εκτελεστεί. Μια εντολή if τελειώνει με τη λέξη-κλειδί end.

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

Η εντολή unless

Η εντολή unless λειτουργεί πολύ παρόμοια με την εντολή if, αλλά εκτελεί τον κώδικα μέσα στην εντολή unless αν η συνθήκη είναι ψευδής.

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

Η εντολή else

Η εντολή else μπορεί να χρησιμοποιηθεί μαζί με τις εντολές if και unless. Η εντολή else θα εκτελεστεί αν ο κλάδος if ή ο κλάδος unless δεν εκτελεστεί.

Ακόμα κι αν ο κλάδος `else` μπορεί να χρησιμοποιηθεί μαζί με το `unless,`, αυτό δεν συνιστάται, γιατί βλάπτει την αναγνωσιμότητα.
Αντ' αυτού, συνιστάται η χρήση του `if !condition` με κλάδο else.
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

"Αλυσιδωτές" εντολές if

Η εντολή elsif μπορεί να χρησιμοποιηθεί μαζί με την εντολή if. Η εντολή elsif θα εκτελεστεί αν ο κλάδος if δεν εκτελεστεί και η συνθήκη της εντολής elsif είναι αληθής. Οι εντολές elsif μπορούν να αλυσοδεθούν μεταξύ τους και θα εκτελεστεί η πρώτη αληθής συνθήκη. Μπορεί επίσης να υπάρχει μια εντολή else στο τέλος της εντολής if, η οποία θα εκτελεστεί αν καμία από τις προηγούμενες εντολές δεν ήταν αληθής.

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

Τύποι με συνθήκες

Όταν ανατίθεται σε διαφορετικούς τύπους, η μεταβλητή θα φέρει και τους δύο τύπους. Αυτό συμβαίνει επειδή ο μεταγλωττιστής δεν γνωρίζει ποιος κλάδος θα εκτελεστεί. Αυτή η πολλαπλή ανάθεση, γνωστή και ως ένωση, θα εξηγηθεί σε επόμενες έννοιες. Αυτό φαίνεται στο παρακάτω παράδειγμα:

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

typeof(a) # => Int32 | String

Ο τριαδικός τελεστής

Η Crystal έχει έναν τριαδικό τελεστή, μια εντολή if-else σε μία γραμμή: 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

Οδηγίες

Σε αυτή την άσκηση, θα αναπτύξουμε ένα απλό σύστημα ελέγχου για έναν πυρηνικό αντιδραστήρα.

Για να παράξει ο αντιδραστήρας ισχύ, πρέπει να βρίσκεται σε κατάσταση κρισιμότητας. Αν ο αντιδραστήρας βρίσκεται σε κατάσταση μικρότερη της κρισιμότητας, μπορεί να υποστεί ζημιά. Αν η κατάσταση του αντιδραστήρα ξεπεράσει την κρισιμότητα, μπορεί να υπερφορτωθεί και να οδηγήσει σε τήξη. Θέλουμε να μειώσουμε τις πιθανότητες τήξης και να διαχειριστούμε σωστά την κατάσταση του αντιδραστήρα.

Οι παρακάτω τρεις εργασίες σχετίζονται όλες με τη συγγραφή κώδικα για τη διατήρηση της ιδανικής κατάστασης του αντιδραστήρα.

1. Έλεγξε την κρισιμότητα

Το πρώτο πράγμα που πρέπει να κάνει ένα σύστημα ελέγχου είναι να ελέγξει αν ο αντιδραστήρας βρίσκεται σε ισορροπία κρισιμότητας. Ένας αντιδραστήρας λέγεται ότι είναι κρίσιμος αν ικανοποιεί τις παρακάτω συνθήκες:

  • Η θερμοκρασία είναι μικρότερη από 800 K.
  • Ο αριθμός των νετρονίων που εκπέμπονται ανά δευτερόλεπτο είναι μεγαλύτερος από 500.
  • Το γινόμενο της θερμοκρασίας και των νετρονίων που εκπέμπονται ανά δευτερόλεπτο είναι μικρότερο από 500000.

Υλοποίησε τη μέθοδο Reactor.criticality_balanced? που δέχεται ως παραμέτρους τη temperature, μετρημένη σε kelvin, και το neutrons_emitted, και επιστρέφει true αν ικανοποιούνται οι συνθήκες κρισιμότητας, false αν όχι.

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

2. Προσδιόρισε το εύρος της ισχύος εξόδου

Μόλις ο αντιδραστήρας αρχίσει να παράγει ισχύ, πρέπει να προσδιοριστεί η απόδοσή του. Η απόδοση μπορεί να ομαδοποιηθεί σε 4 ζώνες:

  1. green -> απόδοση 80% ή περισσότερο,
  2. orange -> απόδοση μικρότερη από 80% αλλά τουλάχιστον 60%,
  3. red -> απόδοση κάτω από 60%, αλλά ακόμη 30% ή περισσότερο,
  4. black -> απόδοση μικρότερη του 30%.

Η τιμή του ποσοστού μπορεί να υπολογιστεί ως (generated_power/theoretical_max_power)*100 όπου generated_power = voltage * current. Σημείωσε ότι η τιμή του ποσοστού συνήθως δεν είναι ακέραιος αριθμός, οπότε φρόντισε να χρησιμοποιήσεις σωστά τις συγκρίσεις < και <=.

Υλοποίησε τη μέθοδο Reactor.reactor_efficiency, με τρεις παραμέτρους: voltage, current και theoretical_max_power. Αυτή η συνάρτηση θα πρέπει να επιστρέφει τη ζώνη απόδοσης του αντιδραστήρα : "green", "orange", "red" ή "black".

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

3. Μηχανισμός ασφαλείας

Η τελευταία σου εργασία αφορά τη δημιουργία ενός μηχανισμού ασφαλείας για την αποφυγή υπερφόρτωσης και τήξης. Ο μηχανισμός αυτός θα καθορίζει αν ο αντιδραστήρας βρίσκεται κάτω, στο ή πάνω από το ιδανικό όριο κρισιμότητας. Η κρισιμότητα μπορεί τότε να αυξηθεί, να μειωθεί ή να σταματήσει με την εισαγωγή (ή την αφαίρεση) ράβδων ελέγχου στον αντιδραστήρα.

Υλοποίησε τη μέθοδο Reactor.fail_safe(), που δέχεται 3 παραμέτρους: τη temperature, μετρημένη σε kelvin, το neutrons_produced_per_second και το threshold, και επιστρέφει έναν κωδικό κατάστασης για τον αντιδραστήρα.

  • Αν temperature * neutrons_produced_per_second < 90% του threshold, επέστρεψε κωδικό κατάστασης "LOW" που υποδεικνύει ότι πρέπει να αφαιρεθούν ράβδοι ελέγχου για να παραχθεί ισχύς.

  • Αν το temperature * neutrons_produced_per_second βρίσκεται εντός συν ή πλην 10% του threshold ο αντιδραστήρας βρίσκεται σε κρισιμότητα και θα πρέπει να επιστραφεί ο κωδικός κατάστασης "NORMAL", που υποδεικνύει ότι ο αντιδραστήρας βρίσκεται σε βέλτιστη κατάσταση και οι ράβδοι ελέγχου βρίσκονται σε ιδανική θέση.

  • Αν το temperature * neutrons_produced_per_second δεν βρίσκεται στα παραπάνω εύρη, ο αντιδραστήρας οδηγείται σε τήξη και πρέπει να επιστραφεί ο κωδικός κατάστασης "DANGER" για να τερματιστεί αμέσως η λειτουργία του αντιδραστήρα.

temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Αποτροπή κατάρρευσης;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.