Syntactic Confectionery Delight PerlMonks

### Body Mass Index Calculator

 on Jan 29, 2011 at 02:17 UTC ( #884961=CUFP: print w/replies, xml ) Need Help??

Instead of having to do this on paper and a calculator I decided to make a sweet Perl script to do this for me. Any comments are welcomed since I don't claim to be a Perl expert by any means. Enjoy!

```#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

# BMI Calculator For Men
# Created by: Jamie Newton
# 12-11-10 Formula Cited Sources
#  The Body Sculpting Bible for Men, Hugo Rivera & James Villepique

# Introduction -------------------------------------------------------
+-------------
say "BMI CALCULATOR FOR MEN\n\nHello, this tool will calculate your to
+tal fat percentage.";

# Declare Variables to be used in Script
my(\$current_weight);
my(\$waist_girth);
my(\$BodyShape);

# Collect User's Weight ----------------------------------------------
+-------------
do {
chomp(\$current_weight = <STDIN>);
} until (\$current_weight =~ /^[0-9]+\$/);

# Collect User's Waist Size ------------------------------------------
+-------------
do {
+ >";
chomp(\$waist_girth = <STDIN>);
} until (\$waist_girth =~ /^-{0,1}\d*\.{0,1}\d+\$/);

# Get Lean Body Weight (as if you had no fat at all) -----------------
+--------------
my \$Result1 = (\$current_weight * 1.082) + 94.42;
my \$Result2 = \$Result1 - (\$waist_girth * 4.15);

# Round to 2 decimal Places ------------------------------------------
+--------------
my \$BodyFatPercentage = sprintf "%.2f";

# Find Out The Total Body Fat Percentage -----------------------------
+--------------
chomp(\$BodyFatPercentage = ((\$current_weight-\$Result2) * 100) / \$curre
+nt_weight);

# Determine if the User is Underweight, Healthy, Overweight, or Obese
if (\$BodyFatPercentage < 18) {
\$BodyShape = "Underweight";
} elsif (\$BodyFatPercentage > 17 && \$BodyFatPercentage < 25) {
\$BodyShape = "Healthy";
} elsif (\$BodyFatPercentage > 24 && \$BodyFatPercentage < 30) {
\$BodyShape = "Overweight";
} elsif (\$BodyFatPercentage >= 30) {
\$BodyShape = "Obese";
}

#Display BF % to User
print "\nYour Total Body Fat % is ";
print sprintf("%.2f", \$BodyFatPercentage);
print "%\n\n";
print "This indicates that you are \$BodyShape.";
print "\n\n";
print "Extra: Your weight without any fat = \$Result2";
print "\n\n\n\n\n";

The early bird gets the worm but the second mouse gets the cheese.
pretendeavor

Replies are listed 'Best First'.
Re: Body Mass Index Calculator
by toolic (Bishop) on Jan 29, 2011 at 03:05 UTC
My comments have nothing to do with Perl.

That is not a definition of BMI that I am familiar with. Normally, it is:

```mass/(height)^2

I think it is important for you to specify units in your prompts. I entered my weight in pounds and my waist in inches -- and your code has declared me obese! Considering a friend recently likened my physique to that of a typical Boston Marathon champion, I'd say something is definitely askew.

First of all, I agree with you, that it is not a very accurate indicator of a true BMI measurement. Secondly, I had not thought about what units others may use because the book was American written and distributed, thanks for pointing that out. And finally, I only use the number as an indication of progress, not an actual reading of true BMI, only calipers can indicate that. Plus, I took the equations straight from the book, so if you have qualms with their formulated ways of arriving at a BMI % then write those authors. Thanks for the reply and taking a look at the script :)
The early bird gets the worm but the second mouse gets the cheese.
pretendeavor
Re: Body Mass Index Calculator
by GrandFather (Sage) on Jan 29, 2011 at 04:51 UTC

I see no indication of expected units for length or weight.

The following comments don't really affect the utility of the script, but are areas you may wish to look at to clean the code up somewhat:

print sprintf can be replaced by printf.

Why is \$waist_girth allowed to be negative?

Declarations for single variables don't need to be in a list. Instead just: my \$BodyShape;. Even better, declare variables where they are first used (\$BodyShape isn't used until half way through the program).

my \$BodyFatPercentage = sprintf "%.2f"; does nothing. sprintf will generate '0.00' (and a "Use of uninitialized value" warning) because of the missing parameter required by the %f format item. The chomp in the subsequent line does nothing because the calculation does not append a new line character.

\$waist_girth =~ /^-{0,1}\d*\.{0,1}\d+\$/ allows '.0' but not '0.'.

Update: corrected sprintf comment (thanks ambrus - though I was sure I'd checked it!).

True laziness is hard work
The early bird gets the worm but the second mouse gets the cheese.
pretendeavor
Re: Body Mass Index Calculator
by wazoox (Prior) on Jan 30, 2011 at 21:25 UTC
Unfortunately it doesn't make any sense with rational measurement units (kilograms an centimeters) :
```Please enter your current weight >
87
98

Your Total Body Fat % is 350.74%

This indicates that you are Obese.

Extra: Your weight without any fat = -218.146

I fail to understand what the calculations are about to apply proper conversion.
I plan on modifying this script as soon as I get a chance to try to accommodate these changes that have been requested...I feel like it could be much better...
The early bird gets the worm but the second mouse gets the cheese.
pretendeavor

Create A New User
Node Status?
node history
Node Type: CUFP [id://884961]
Approved by ww
Front-paged by Arunbear
help
Chatterbox?
 [ovedpo15]: can't I use just use lib \$FindBin::Bin/../ bin" asuming that p2 is in ./bin and p1 is in /config? it says "cant find p2.pm" altought p2 is p2.pl [moritz]: ovedpo15 "use lib" is only for .pm files [moritz]: if you don't have .pm file, you might to use "require" or "do" with an absolute path [ovedpo15]: I need to use FindBin thought. does FindBin finds only modules? or it can find perl script also? [moritz]: maybe you should start looking at the documentation of FindBin?

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2018-03-17 20:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When I think of a mole I think of:

Results (226 votes). Check out past polls.

Notices?