The challenge
BMI
stands for Body Mass Index and is a value derived from the mass and height of a person. The BMI is defined as the body mass divided by the square of the body height
, and is universally expressed in units of kg/m², resulting from mass in kilograms and height in metres. Wikipedia
Write function BMI that calculates body mass index (bmi = weight / height ^ 2).
if bmi <= 18.5 return “Underweight”
if bmi <= 25.0 return “Normal”
if bmi <= 30.0 return “Overweight”
if bmi > 30 return “Obese”
Test cases
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class SolutionTest {
@Test
public void testBMI() {
assertEquals("Underweight", Calculate.bmi(50, 1.80));
assertEquals("Normal", Calculate.bmi(80, 1.80));
assertEquals("Overweight", Calculate.bmi(90, 1.80));
assertEquals("Obese", Calculate.bmi(100, 1.80));
}
@Test
public void testRandom() {
System.out.println("100 Random tests");
java.util.Random r = new java.util.Random();
for(int i = 0; i < 99; i++) {
double randomW = 40+r.nextDouble()*80;
double randomH = r.nextDouble()+0.50*2.23;
assertEquals(this.b(randomW, randomH), Calculate.bmi(randomW, randomH));
}
}
private static String b(double w, double h) {
double bmi = w/(h*h);
return bmi>30.0 ? "Obese" : bmi<=30.0 && bmi>25.0 ? "Overweight" : bmi<=18.5 ? "Underweight" : "Normal";
}
}
The solution in Java
Option 1:
import java.lang.*;
public class Calculate {
public static String bmi(double weight, double height) {
// Use `Math.pow` to get the power of the height
double bmi = weight / Math.pow(height, 2);
if (bmi<=18.5) return "Underweight";
if (bmi<=25.0) return "Normal";
if (bmi<=30.0) return "Overweight";
if (bmi>30) return "Obese";
// We should never get here..
return "";
}
}
Option 2:
public class Calculate {
public static String bmi(double weight, double height) {
double bmi = weight/(height*height);
return bmi <= 18.5 ? "Underweight": bmi <=25.0 ? "Normal" : bmi<=30.0 ? "Overweight" : "Obese";
}
}