Цикл як керувальна конструкція дає змогу виконувати код повторно, доки виконується певна умова.
while
Цикл while як керувальна конструкція дає змогу виконувати код повторно, доки виконується певна умова.
Код усередині циклу while виконується доти, доки умова дає правдиве значення.
Цикли while часто використовують, коли кількість ітерацій заздалегідь невідома, але їх можна застосовувати в будь-якій ситуації, де потрібен цикл.
Умова перевіряється перед виконанням коду всередині циклу, тож якщо умова хибна, код у циклі не виконається жодного разу.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Щоб перебрати символи рядка тексту (англ. string), можна пройтися циклом по довжині цього рядка тексту.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until
Цикли until працюють так само, як цикли while, з однією відмінністю: код у циклі виконується доти, доки умова не дасть правдивого значення.
Це та сама різниця, що й між if та unless.
i = 0
until i == 3
puts i
i += 1
end
З циклами while часто трапляється така помилка: програма потрапляє в «нескінченний цикл», який ніколи не завершується.
Нескінченний цикл виникає, коли умова ніколи не дає потрібного правдивого чи неправдивого значення.
Найчастіше причина в помилці програміста, наприклад, коли забувають збільшити змінну циклу.
Але іноді нескінченний цикл є найзрозумілішим способом реалізувати логіку програми.
Або ж цикл справді мусить тривати вічно. Наприклад, HTTP-сервер чекає на вхідне зʼєднання, обробляє його, а тоді чекає на наступне.
Ключове слово break дає змогу вийти з циклу достроково.
Це зручно, коли за певних умов потрібно завершити цикл раніше.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
Ключове слово 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 вправи та справжнє наставництво від людей, і все це безкоштовно.