ساخت برنامه محاسبه BMI با پایتون؛ پروژه کامل با اعتبارسنجی و تحلیل نتیجه

🗓 آخرین بهروزرسانی:
ساخت برنامه محاسبه BMI با پایتون یک پروژه مناسب برای تمرین ورودی کاربر، محاسبات اعشاری، شرطها، توابع و مدیریت خطاست. در این آموزش فقط فرمول BMI را اجرا نمیکنیم؛ برنامهای میسازیم که وزن و قد را دریافت کند، ورودیهای نامعتبر را رد کند، شاخص توده بدنی را محاسبه کند، نتیجه را در بازههای رایج بزرگسالان دستهبندی کند و امکان انجام چند محاسبه پشتسرهم را بدهد.
این مقاله ششمین پروژه از فاز اول دسته تمرین و پروژههای پایتون است. اگر پروژههای قبلی مثل محاسبه سن با پایتون یا تبدیل واحد با پایتون را انجام داده باشید، ساختار دریافت ورودی و جدا کردن منطق برنامه از رابط کاربری برایتان آشنا خواهد بود.
BMI چیست؟
BMI یا Body Mass Index شاخصی است که از نسبت وزن به مربع قد به دست میآید. این شاخص معمولاً بهعنوان یک ابزار غربالگری برای ارزیابی کلی نسبت وزن به قد در بزرگسالان استفاده میشود و بهتنهایی تشخیص پزشکی محسوب نمیشود. ترکیب بدن، توده عضلانی، سن و شرایط فردی میتوانند تفسیر نتیجه را تغییر دهند.
فرمول متریک BMI به شکل زیر است:
BMI = weight_kg / (height_m ** 2)برای مثال اگر فردی ۷۰ کیلوگرم وزن و ۱.۷۵ متر قد داشته باشد:
70 / (1.75 ** 2) = 22.86در برنامه نتیجه را معمولاً تا یک رقم اعشار نمایش میدهیم.
در این پروژه چه چیزی میسازیم؟
- دریافت وزن بر حسب کیلوگرم
- دریافت قد بر حسب سانتیمتر
- تبدیل سانتیمتر به متر
- محاسبه BMI با تابع مستقل
- اعتبارسنجی عددی ورودیها
- جلوگیری از پذیرش مقدار صفر یا منفی
- دستهبندی نتیجه برای بزرگسالان
- نمایش BMI با یک رقم اعشار
- امکان محاسبه دوباره بدون اجرای مجدد فایل
پیشنیازهای پروژه
در این پروژه هیچ کتابخانه خارجی نیاز نداریم. بهتر است با تابع input در پایتون، عملگرهای ریاضی و مقایسهای، شرطهای if و elif و توابع و پارامترها آشنا باشید.
یک فایل با نام زیر بسازید:
bmi_calculator.pyسپس آن را اجرا کنید:
python bmi_calculator.pyمرحله اول: دریافت وزن و قد
خروجی input() رشته است، بنابراین برای انجام محاسبات باید آن را به عدد تبدیل کنیم. چون وزن و قد ممکن است اعشاری باشند، از float استفاده میکنیم.
weight = float(
input("وزن بر حسب کیلوگرم: ")
)
height = float(
input("قد بر حسب سانتیمتر: ")
)این نسخه در صورت وارد کردن متن با ValueError متوقف میشود. در نسخه کامل این خطا را مدیریت خواهیم کرد.
مرحله دوم: تبدیل قد از سانتیمتر به متر
فرمول BMI با متر کار میکند. بنابراین قد ۱۷۵ سانتیمتر باید به ۱.۷۵ متر تبدیل شود:
height_m = height_cm / 100مرحله سوم: ساخت تابع calculate_bmi
بهتر است منطق محاسبه در یک تابع مستقل باشد تا بعداً بتوانیم آن را در رابط گرافیکی، API یا پروژه دیگری استفاده کنیم.
def calculate_bmi(
weight_kg,
height_cm,
):
if weight_kg <= 0:
raise ValueError(
"وزن باید بیشتر از صفر باشد."
)
if height_cm <= 0:
raise ValueError(
"قد باید بیشتر از صفر باشد."
)
height_m = height_cm / 100
return (
weight_kg / (height_m ** 2)
)وجود بررسی مقدارهای منفی و صفر مهم است. اگر قد صفر باشد، محاسبه به تقسیم بر صفر منجر میشود و اگر مقدار منفی باشد، ورودی از نظر منطقی معتبر نیست.
مرحله چهارم: دستهبندی BMI
برای بزرگسالان، دستهبندی رایج BMI به این شکل است:
- کمتر از ۱۸.۵: کموزن
- از ۱۸.۵ تا کمتر از ۲۵: محدوده معمول
- از ۲۵ تا کمتر از ۳۰: اضافهوزن
- ۳۰ و بالاتر: چاقی
این بازهها را به تابع جداگانه تبدیل میکنیم:
def classify_bmi(bmi):
if bmi < 18.5:
return "کموزن"
if bmi < 25:
return "محدوده معمول"
if bmi < 30:
return "اضافهوزن"
return "چاقی"چون شرطها از مقدار کمتر به بیشتر بررسی میشوند، نیازی به نوشتن شرطهای ترکیبی مثل 18.5 <= bmi < 25 نداریم.
نکته مهم درباره تفسیر BMI
این دستهبندی برای آموزش برنامهنویسی و نمایش بازههای رایج بزرگسالان استفاده میشود. BMI برای کودکان و نوجوانان باید بر اساس سن و جنس و صدکهای رشد تفسیر شود و این برنامه برای آن هدف طراحی نشده است. همچنین BMI بهتنهایی میزان چربی بدن، توده عضلانی یا وضعیت سلامت فرد را تشخیص نمیدهد.
مرحله پنجم: ساخت تابع دریافت عدد معتبر
برای وزن و قد به منطق اعتبارسنجی مشابه نیاز داریم. بنابراین آن را تکرار نمیکنیم و یک تابع عمومی میسازیم:
def get_positive_number(message):
while True:
value = input(message).strip()
try:
number = float(value)
except ValueError:
print(
"لطفاً یک عدد معتبر وارد کنید."
)
continue
if number <= 0:
print(
"مقدار باید بیشتر از صفر باشد."
)
continue
return numberاگر با ساختار try/except آشنا نیستید، آموزش مدیریت خطا در پایتون را مطالعه کنید.
مرحله ششم: نمایش نتیجه
برای نمایش تمیزتر نتیجه از round() یا قالببندی :.1f استفاده میکنیم:
bmi = calculate_bmi(
weight,
height,
)
status = classify_bmi(bmi)
print(
f"BMI شما: {bmi:.1f}"
)
print(
f"وضعیت: {status}"
)کد کامل برنامه محاسبه BMI با پایتون
def calculate_bmi(
weight_kg,
height_cm,
):
if weight_kg <= 0:
raise ValueError(
"وزن باید بیشتر از صفر باشد."
)
if height_cm <= 0:
raise ValueError(
"قد باید بیشتر از صفر باشد."
)
height_m = height_cm / 100
return (
weight_kg / (height_m ** 2)
)
def classify_bmi(bmi):
if bmi < 18.5:
return "کموزن"
if bmi < 25:
return "محدوده معمول"
if bmi < 30:
return "اضافهوزن"
return "چاقی"
def get_positive_number(message):
while True:
value = input(message).strip()
try:
number = float(value)
except ValueError:
print(
"لطفاً یک عدد معتبر وارد کنید."
)
continue
if number <= 0:
print(
"مقدار باید بیشتر از صفر باشد."
)
continue
return number
def run_calculation():
weight = get_positive_number(
"وزن بر حسب کیلوگرم: "
)
height = get_positive_number(
"قد بر حسب سانتیمتر: "
)
bmi = calculate_bmi(
weight,
height,
)
status = classify_bmi(bmi)
print("\nنتیجه محاسبه")
print(f"BMI: {bmi:.1f}")
print(f"وضعیت: {status}")
def main():
print(
"=== برنامه محاسبه BMI با پایتون ==="
)
while True:
run_calculation()
again = input(
"\nمحاسبه دیگری انجام شود؟ (بله/خیر): "
).strip()
if again != "بله":
print("برنامه پایان یافت.")
break
if __name__ == "__main__":
main()نمونه اجرای برنامه
=== برنامه محاسبه BMI با پایتون ===
وزن بر حسب کیلوگرم: 70
قد بر حسب سانتیمتر: 175
نتیجه محاسبه
BMI: 22.9
وضعیت: محدوده معمولچند تست برای بررسی منطق برنامه
قبل از انتشار یا توسعه پروژه، بهتر است چند ورودی متفاوت را امتحان کنیم:
print(
calculate_bmi(70, 175)
)
print(
classify_bmi(
calculate_bmi(50, 170)
)
)
print(
classify_bmi(
calculate_bmi(85, 170)
)
)در تستهای این مقاله، ۷۰ کیلوگرم و ۱۷۵ سانتیمتر BMI حدود ۲۲.۹، ۵۰ کیلوگرم و ۱۷۰ سانتیمتر حدود ۱۷.۳ و ۸۵ کیلوگرم و ۱۷۰ سانتیمتر حدود ۲۹.۴ تولید میکنند.
اشتباههای رایج در پروژه BMI
استفاده مستقیم از سانتیمتر در فرمول
اگر قد ۱۷۵ را بدون تبدیل به ۱.۷۵ در فرمول قرار دهید، نتیجه کاملاً اشتباه خواهد شد.
فراموش کردن توان دوم قد
فرمول BMI وزن تقسیم بر قد نیست؛ وزن باید بر مربع قد بر حسب متر تقسیم شود.
پذیرفتن مقدار صفر
قد صفر باعث خطای تقسیم بر صفر میشود. وزن و قد باید قبل از محاسبه اعتبارسنجی شوند.
استفاده از int بهجای float
وزن و قد میتوانند اعشاری باشند. استفاده از float انعطاف بیشتری دارد.
نمایش BMI بهعنوان تشخیص قطعی سلامت
برنامه باید روشن کند که BMI یک شاخص ساده نسبت وزن به قد است و نتیجه آن جایگزین ارزیابی پزشکی نیست.
چطور پروژه را توسعه دهیم؟
- پشتیبانی از واحدهای انگلیسی: وزن پوند و قد فوت/اینچ را دریافت و قبل از محاسبه تبدیل کنید.
- نمایش محدوده وزن متناظر: برای قد واردشده، وزن متناظر با BMI بین ۱۸.۵ و ۲۴.۹ را محاسبه کنید.
- ذخیره تاریخچه: وزن، قد، BMI و تاریخ محاسبه را در JSON ذخیره کنید.
- نمودار تغییرات: در پروژهای پیشرفتهتر تغییرات BMI را در طول زمان رسم کنید.
- نسخه GUI: با Tkinter فیلد وزن و قد، دکمه محاسبه و کارت نتیجه بسازید.
- تفکیک دقیقتر بازه چاقی: در نسخه آموزشی پیشرفته میتوانید زیرردههای مختلف را جدا کنید.
تمرین پیشنهادی: محاسبه بازه وزن بر اساس قد
تابعی بسازید که قد را دریافت کند و وزن متناظر با BMI برابر ۱۸.۵ و ۲۴.۹ را برگرداند:
def normal_weight_range(height_cm):
height_m = height_cm / 100
min_weight = (
18.5 * height_m ** 2
)
max_weight = (
24.9 * height_m ** 2
)
return min_weight, max_weightهدف این تمرین، کار بیشتر با همان فرمول از جهت معکوس است؛ نه ارائه توصیه درمانی یا هدف وزن شخصی.
این پروژه چه مفاهیمی را تمرین میدهد؟
- دریافت ورودی با input
- تبدیل داده با float
- عملگرهای ضرب، تقسیم و توان
- شرطهای چندمرحلهای
- توابع و مقدار بازگشتی
- پارامترها
- حلقه while
- مدیریت ValueError
- اعتبارسنجی ورودی
- قالببندی اعداد اعشاری
- تقسیم پروژه به توابع کوچک و قابل تست
جمعبندی
در این آموزش یک برنامه محاسبه BMI با پایتون ساختیم که وزن و قد را از کاربر دریافت میکند، ورودیها را بررسی میکند، قد را به متر تبدیل میکند، BMI را محاسبه میکند و نتیجه را در بازههای رایج بزرگسالان نمایش میدهد.
نکته مهم این پروژه جداسازی وظایف است: تابعی برای محاسبه، تابعی برای دستهبندی، تابعی برای دریافت ورودی معتبر و تابعی برای اجرای رابط کاربری داریم. این ساختار باعث میشود برنامه هم خواناتر باشد و هم در پروژههای بعدی راحتتر توسعه پیدا کند.
📌 همچنین بخوانید: تمرین پایتون با جواب، ساخت بازی با پایتون و Pygame و ساخت ربات با پایتون