Українська
Практика
Приклад 1. Індекс маси тіла
Обчислити відношення маси в кілограмах до квадрата зросту в метрах. Для вправи з розгалужень використати інтервали індексу: менше 18,5; від 18,5 до 25; від 25 до 30; від 30. Межі зліва включні, справа невключні. Це навчальна арифметична класифікація для дорослих, а не індивідуальний медичний висновок. Довідка про показник: https://www.cdc.gov/bmi/adult-calculator/bmi-categories.html.
Вхід має бути числовим записом із крапкою. Програма відхиляє нескінченні й недодатні значення. Для захисту від очевидної помилки одиниць у цій вправі встановлено навчальні межі: маса до 500 кг, зріст від 0,5 до 2,5 м. Вони не є медичними нормативами.
py
import math
mass = float(input("Маса, кг: "))
height = float(input("Зріст, м: "))
if not (math.isfinite(mass) and math.isfinite(height)):
print("Потрібні скінченні числа")
elif not (0 < mass <= 500 and 0.5 <= height <= 2.5):
print("Перевірте межі та одиниці введення")
else:
bmi = mass / height ** 2
if bmi < 18.5:
interval = "менше 18.5"
elif bmi < 25:
interval = "від 18.5 до 25"
elif bmi < 30:
interval = "від 25 до 30"
else:
interval = "від 30"
print(f"Індекс: {bmi:.2f}")
print("Інтервал:", interval)Для маси 72 кг та зросту 1,8 м:
Індекс: 22.22
Інтервал: від 18.5 до 25Умови перевіряються за неокругленим значенням; .2f застосовується лише до друку. Для зросту 2 м і мас 74, 100 та 120 кг маємо точні межі 18,5, 25 і 30. Вони повинні потрапляти до наступного інтервалу. Нульовий зріст потрібно відхилити до ділення. Значення 180 замість 1.8 не повинно давати правдоподібний результат.
Приклад 2. Прості числа в діапазоні
Ввести цілі межі left та right. Дозволено від 0 до 100000, причому ліва межа не перевищує праву, а ширина діапазону не більша за 1000. Вивести всі прості числа включно з межами та їх кількість. Діапазон обмежено для швидкого інтерактивного запуску.
Формат цілих перевіримо перед перетворенням: до шести ASCII-цифр, без знака. Числа 0 і 1 не є простими. Пошук дільника виконується до isqrt(number) включно; знайдений дільник завершує внутрішній цикл через break. Якщо дільника немає, виконується його else.
py
from math import isqrt
left_text = input("Ліва межа: ").strip()
right_text = input("Права межа: ").strip()
valid = (1 <= len(left_text) <= 6
and left_text.isascii() and left_text.isdecimal()
and 1 <= len(right_text) <= 6
and right_text.isascii() and right_text.isdecimal())
if not valid:
print("Введіть від 1 до 6 цифр для кожної межі")
else:
left = int(left_text)
right = int(right_text)
if not (0 <= left <= right <= 100000
and right - left <= 1000):
print("Недопустимі межі або надто широкий діапазон")
else:
count = 0
for number in range(max(2, left), right + 1):
for divisor in range(2, isqrt(number) + 1):
if number % divisor == 0:
break
else:
print(number, end=" ")
count += 1
print()
print("Кількість:", count)Для меж 10 і 20:
11 13 17 19
Кількість: 4Після останнього простого числа технічно друкується пробіл, а далі новий рядок. У звіті його не потрібно спеціально позначати. Для меж 0 і 1 перший рядок порожній, кількість – 0. Для меж 2 і 2 отримаємо єдине просте число 2, хоча внутрішній цикл не зробить жодної ітерації. Саме цей випадок перевіряє розуміння for ... else.
Відступ else збігається з внутрішнім for, а не з if. Якщо перенести його на інший рівень, зміниться зміст алгоритму. Перевірте також однакові складені межі 9, 9, обернені межі 20, 10, знак мінус, порожній рядок і символ надрядкової двійки.
Приклад 3. Конвертер валют із меню
Побудувати меню перетворення гривень у навчальні USD та EUR. Фіксовані умовні курси: 40,00 грн за USD і 44,00 грн за EUR. Це тестові константи, не актуальні курси валют. Команда 0 завершує роботу. Вивести таблицю курсів і результат із двома знаками.
Сума вводиться як ціла кількість гривень від 1 до 1000000. Такий контракт дозволяє зосередитися на меню й циклі без передчасного використання винятків. Для обчислень використовується Decimal, для результату – явне округлення ROUND_HALF_UP.
py
from decimal import Decimal, ROUND_HALF_UP
print(f"{'Валюта':<10}{'Грн за одиницю':>15}")
print(f"{'USD':<10}{'40.00':>15}")
print(f"{'EUR':<10}{'44.00':>15}")
while True:
command = input("1 - USD, 2 - EUR, 0 - вихід: ").strip()
match command:
case "0":
break
case "1":
currency, rate = "USD", Decimal("40.00")
case "2":
currency, rate = "EUR", Decimal("44.00")
case _:
print("Невідома команда")
continue
text = input("Сума, цілі грн: ").strip()
if not (1 <= len(text) <= 7 and text.isascii()
and text.isdecimal()):
print("Потрібна ціла сума цифрами")
continue
amount = int(text)
if not 1 <= amount <= 1_000_000:
print("Сума поза межами 1..1000000")
continue
result = (Decimal(amount) / rate).quantize(
Decimal("0.01"), rounding=ROUND_HALF_UP
)
print(f"{amount:.2f} UAH = {result:.2f} {currency}")Для команди 1, суми 1000 і наступної команди 0 таблиця та результат мають вигляд:
Валюта Грн за одиницю
USD 40.00
EUR 44.00
1000.00 UAH = 25.00 USDПробіли в заголовку визначає ширина другого поля: повний фактичний вивід також містить запрошення input. Для команди 2 і суми 1000 очікується 22.73 EUR. Невідома команда повертає до меню до запиту суми. Неправильна сума не завершує програму, а починає новий цикл. Команда виходу обробляється до вибору курсу, тому старий курс не може випадково використатися після завершення.