Треки
/
Crystal
Crystal
/
Вправи
/
Відсотки - це цікаво
Відсотки - це цікаво

Відсотки - це цікаво

Навчальна вправа

Вступ

Цикл як керувальна конструкція дає змогу виконувати код повторно, доки виконується певна умова.

Цикли 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

Ключове слово 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
Note

Ключове слово return варто пропускати, коли останній вираз методу і є тим значенням, яке потрібно повернути.

Вказівки

У цій вправі ми будемо працювати з ощадними рахунками. Щороку баланс нашого ощадного рахунку оновлюється відповідно до його відсоткової ставки. Відсоткова ставка, яку дає нам банк, залежить від суми грошей на рахунку (його балансу):

  • 3.213% за відʼємного балансу (баланс стає ще відʼємнішим).
  • 0.5% за додатного балансу, меншого за 1000 доларів.
  • 1.621% за додатного балансу від 1000 доларів і меншого за 5000 доларів.
  • 2.475% за додатного балансу від 5000 доларів.

На нас чекають чотири завдання, і в кожному з них ітиметься про баланс та його відсоткову ставку.

1. Обчислити відсоткову ставку

Реалізуйте метод SavingsAccount.interest_rate(), який приймає баланс як аргумент. Метод повинен повернути відсоткову ставку для заданого балансу.

SavingsAccount.interest_rate(200.75)
# => 0.5

2. Обчислити відсотки

Реалізуйте метод SavingsAccount.interest(), який приймає баланс як аргумент. Метод повинен повернути відсотки для заданого балансу.

SavingsAccount.interest(200.75)
# => 1.00375

3. Обчислити річне оновлення балансу

Реалізуйте метод SavingsAccount.annual_balance_update(), який приймає баланс як аргумент. Метод повинен повернути баланс через один рік.

SavingsAccount.annual_balance_update(200.75)
# => 201.75375

4. Обчислити кількість років до досягнення бажаного балансу

Реалізуйте метод SavingsAccount.years_before_desired_balance(), який приймає баланс і цільовий баланс як аргументи. Метод повинен повернути кількість років, потрібних для досягнення цільового балансу.

balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Note

Коли до початкового балансу застосовують прості відсотки, баланс множать на відсоткову ставку, і добуток цих двох величин і є сумою відсотків.

Складні відсотки, зі свого боку, нараховують, застосовуючи відсотки регулярно. За кожного нарахування суму відсотків обчислюють і додають до початкового балансу, тож наступні розрахунки відсотків виконуються вже від більшого балансу.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Crystal Exercism

Час розпочати Відсотки - це цікаво?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Crystal, а також 26 концепцій142 вправи та справжнє наставництво від людей, і все це безкоштовно.