Ο βρόχος είναι μια δομή ελέγχου που επιτρέπει σε κώδικα να εκτελείται ξανά και ξανά, με βάση μια συνθήκη.
while
Ο βρόχος while είναι μια δομή ελέγχου που επιτρέπει σε κώδικα να εκτελείται ξανά και ξανά, με βάση μια συνθήκη.
Ο κώδικας μέσα σε έναν βρόχο while συνεχίζει να εκτελείται όσο η συνθήκη αποτιμάται ως truthy.
Οι βρόχοι while χρησιμοποιούνται συχνά όταν δεν ξέρεις από πριν πόσες επαναλήψεις θα χρειαστούν, αλλά μπορείς να τους χρησιμοποιήσεις όπου χρειάζεσαι βρόχο.
Η συνθήκη αποτιμάται πριν εκτελεστεί ο κώδικας μέσα στον βρόχο. Αυτό σημαίνει ότι, αν η συνθήκη είναι ψευδής, ο κώδικας μέσα στον βρόχο δεν θα εκτελεστεί ποτέ.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Όταν θέλεις να διατρέξεις μια συμβολοσειρά, μπορείς να κάνεις βρόχο με βάση το μήκος της.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until
Οι until βρόχοι λειτουργούν όπως οι βρόχοι while, με τη διαφορά ότι ο κώδικας μέσα στον βρόχο συνεχίζει να εκτελείται μέχρι η συνθήκη να αποτιμηθεί ως truthy.
Είναι η ίδια διαφορά που υπάρχει ανάμεσα στο if και στο unless.
i = 0
until i == 3
puts i
i += 1
end
Ένα συχνό σφάλμα με τους βρόχους while είναι να μπεις σε έναν "ατέρμονο βρόχο", από τον οποίο δεν βγαίνεις ποτέ.
Ένας ατέρμονος βρόχος μπορεί να προκληθεί από μια συνθήκη που δεν αποτιμάται ποτέ ως truthy ή falsey.
Αυτό συνήθως οφείλεται σε λάθος του προγραμματιστή, για παράδειγμα όταν ξεχνάς να αυξήσεις τη μεταβλητή του βρόχου.
Μερικές φορές όμως, ο ατέρμονος βρόχος είναι ο πιο ξεκάθαρος τρόπος να υλοποιήσεις τη λογική του προγράμματος.
Ή μπορεί να είναι απαραίτητο ο βρόχος να τρέχει για πάντα. Για παράδειγμα, ένας διακομιστής HTTP περιμένει μια εισερχόμενη σύνδεση, την εξυπηρετεί και μετά περιμένει την επόμενη.
breakΜε τη λέξη-κλειδί break μπορείς να βγεις νωρίτερα από έναν βρόχο.
Αυτό είναι βολικό όταν θέλεις να βγεις νωρίτερα από έναν βρόχο κάτω από ορισμένες συνθήκες.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
nextΜε τη λέξη-κλειδί next μπορείς να προχωρήσεις κατευθείαν στην επόμενη επανάληψη ενός βρόχου.
Αυτό είναι βολικό όταν θέλεις να παραλείψεις συγκεκριμένες επαναλήψεις ενός βρόχου.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
Ο τύπος μιας μεταβλητής μπορεί να διαφέρει μέσα σε έναν βρόχο.
Στο παρακάτω παράδειγμα, ο τύπος της a είναι Int32 | String, επειδή στο πρώτο μέρος του βρόχου μπορεί να είναι Int32 ή String.
Η μεταβλητή a έχει τον τύπο Int32 | String μόνο στο πρώτο μέρος του βρόχου, αφού όταν ξεκινά ο βρόχος περιέχει Int32 και στη δεύτερη επανάληψη περιέχει String.
Θα εξηγήσουμε αναλυτικά αυτό το σύστημα πολλαπλών τύπων αργότερα.
Επειδή όμως είμαστε σίγουροι ότι στο δεύτερο μέρος του βρόχου θα περιέχει μόνο String, ο τύπος της a είναι String στο δεύτερο μέρος του βρόχου.
Κατά την εκτέλεση, δεν θα περιέχει ποτέ ταυτόχρονα Int32 και String.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
Στην Crystal, μια μέθοδος επιστρέφει την τιμή της τελευταίας της έκφρασης.
Μερικές φορές όμως χρειάζεται να επιστρέψεις μια τιμή πριν από την τελευταία έκφραση.
Γι' αυτό υπάρχει η λέξη-κλειδί return, που επιστρέφει την τιμή της έκφρασης που ακολουθεί.
Ο κώδικας που γράφεται μετά από ένα return δεν εκτελείται.
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
Όταν η τελευταία έκφραση μιας μεθόδου είναι η τιμή που πρέπει να επιστραφεί, παράλειψε τη λέξη-κλειδί return.
Σε αυτή την άσκηση θα δουλέψεις με λογαριασμούς ταμιευτηρίου. Κάθε χρόνο, το υπόλοιπο του λογαριασμού ταμιευτηρίου σου ενημερώνεται με βάση το επιτόκιό του. Το επιτόκιο που σου δίνει η τράπεζά σου εξαρτάται από το ποσό των χρημάτων στον λογαριασμό σου (το υπόλοιπό του):
1000 δολάρια.1000 δολάρια και μικρότερο από 5000 δολάρια.5000 δολάρια.Έχεις τέσσερις εργασίες, και καθεμία από αυτές θα ασχοληθεί με το υπόλοιπό σου και το επιτόκιό του.
Υλοποίησε τη μέθοδο SavingsAccount.interest_rate() που παίρνει ως όρισμα ένα υπόλοιπο.
Η μέθοδος πρέπει να επιστρέφει το επιτόκιο για το δεδομένο υπόλοιπο.
SavingsAccount.interest_rate(200.75)
# => 0.5
Υλοποίησε τη μέθοδο SavingsAccount.interest() που παίρνει ως όρισμα ένα υπόλοιπο.
Η μέθοδος πρέπει να επιστρέφει τον τόκο για το δεδομένο υπόλοιπο.
SavingsAccount.interest(200.75)
# => 1.00375
Υλοποίησε τη μέθοδο SavingsAccount.annual_balance_update() που παίρνει ως όρισμα ένα υπόλοιπο.
Η μέθοδος πρέπει να επιστρέφει το υπόλοιπο μετά από ένα χρόνο.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
Υλοποίησε τη μέθοδο SavingsAccount.years_before_desired_balance() που παίρνει ως ορίσματα ένα υπόλοιπο και ένα υπόλοιπο-στόχο.
Η μέθοδος πρέπει να επιστρέφει τον αριθμό των χρόνων που θα χρειαζόταν για να φτάσεις στο υπόλοιπο-στόχο.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Όταν εφαρμόζεις απλό τόκο σε ένα αρχικό κεφάλαιο, το υπόλοιπο πολλαπλασιάζεται με το επιτόκιο και το γινόμενο των δύο είναι το ποσό του τόκου.
Ο σύνθετος τόκος, από την άλλη, εφαρμόζεται σε επαναλαμβανόμενη βάση. Σε κάθε εφαρμογή, το ποσό του τόκου υπολογίζεται και προστίθεται στο αρχικό κεφάλαιο, ώστε οι επόμενοι υπολογισμοί τόκου να γίνονται πάνω σε μεγαλύτερο αρχικό κεφάλαιο.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.