# ruffier.py
''' Модуль для розрахунку результатів проби Руa’є.
Сума вимірювань пульсу у трьох спробах (до навантаження, одразу після та після короткого відпочинку)
в ідеалі має бути не більше 200 ударів на хвилину.
Ми пропонуємо дітям вимірювати свій пульс протягом 15 секунд,
і наводимо результат до ударів за хвилину множенням на 4:
S = 4* (P1 + P2 + P3)
Що далі цей результат від ідеальних 200 ударів, то гірше.
Традиційно таблиці даються для величини, поділеної на 10.
Індекс Руф’є
IR = (S - 200) / 10
оцінюється за таблицею відповідно до віку:
7-8 9-10 11-12 13-14 15+
(тільки для підлітків!)
чуд. 6.4 і менше 4.9 і менше 3.4 і менше 1.9 і менше 0.4 і менше
доб. 6.5 - 11.9 5 - 10.4 3.5 - 8.9 2 - 7.4 0.5 - 5.9
задов. 12 - 16.9 10.5 - 15.4 9 - 13.9 7.5 - 12.4 6 - 10.9
слабкий 17 - 20.9 15.5 - 19.4 14 - 17.9 12.5 - 16.4 11 - 14.9
незад. 21 і більше 19.5 і більше 18 і більше 16.5 і більше 15 і більше
для будь-якого віку результат "незадовільно" віддалений від "слабкого" на 4,
той від "задовільного" на 5, а "добрий" від "чуд" - на 5.5
тому напишемо функцію ruffier_result(r_index, level), яка отримуватиме
розрахований індекс Руф'є та рівень "незадовільно" для віку тестованого, і віддавати результат '''
# тут задаються рядки, за допомогою яких викладено результат:
txt_index = "Ваш індекс Руф’є:"
txt_workheart = "Працездатність серця:"
txt_nodata = ''' Немає даних для такого віку '''
txt_res = []
txt_res.append(''' Низька. Терміново зверніться до лікаря! ''')
txt_res.append(''' Задовільна. Зверніться до лікаря! ''')
txt_res.append(''' Середня. Можливо, варто додатково обстежитись у лікаря. ''')
txt_res.append(''' Вище середнього ''')
txt_res.append(''' Висока ''')
def ruffier_index(P1, P2, P3):
'''повертає значення індексу за трьома показниками пульсу для звірки з таблицею'''
return (4 * (P1+P2+P3) - 200) / 10
def neud_level(age):
''' варіанти з віком менше 7 і дорослим треба обробляти окремо,
тут підбираємо рівень "незадовільно" тільки всередині таблиці:
у віці 7 років "незад" - це індекс 21, далі кожні 2 роки він знижується на 1.5 до значення 15 в 15-16 років '''
norm_age = (min(age, 15) - 7) // 2 # кожні 2 роки різниці від 7 років перетворюються на одиницю - аж до 15 років
result = 21 - norm_age * 1.5 # множимо кожні 2 роки різниці на 1.5, так розподілені рівні у таблиці
return result
def ruffier_result(r_index, level):
''' функція отримує індекс Руф’є і інтерпретує його,
повертає рівень готовності: число від 0 до 4
(що вище рівень готовності, то краще). '''
if r_index >= level:
return 0
level = level - 4 # это не будет выполняться, если мы уже вернули ответ "неуд"
if r_index >= level:
return 1
level = level - 5 # аналогично, попадаем сюда, если уровень как минимум "уд"
if r_index >= level:
return 2
level = level - 5.5 # следующий уровень
if r_index >= level:
return 3
return 4 # здесь оказались, если индекс меньше всех промежуточных уровней, т.е. тестируемый крут.
def test(P1, P2, P3, age):
''' цю функцію можна використовувати зовні модуля для підрахунків індексу Руф’є.
Повертає готові тексти, які залишається намалювати у потрібному місці
Використовує для текстів константи, задані на початку цього модуля. '''
if age < 7:
return (txt_index + "0", txt_nodata) # тайна сия не для теста сего
else:
ruff_index = ruffier_index(P1, P2, P3) # расчет
result = txt_res[ruffier_result(ruff_index, neud_level(age))] # интерпретация, перевод числового уровня подготовки в текстовые данные
res = txt_index + str(ruff_index) + '\n' + txt_workheart + result
return res