Reputation: 49
Hello everybody I'm really close to finishing this but I'm having problems with my for loop. I need my program to have a user enter either a 'w' or 'h' to have them enter a new weight or height. When they do my loop seems to stop for some reason.
package Assignments;
import java.util.*;
public class assignment3 {
public static void main(String[] args) {
//Scanner
Scanner stdIn = new Scanner(System.in);
//Variables
final double METERS_TO_CM = 100; // The constant to convert meters to centimeters
final double BSA_CONSTANT = 3600; // The constant to divide by for bsa
double bmi; // Body Mass Index
double weight; // Weight in kilograms
double height; // Height in meters
String classification; // Classifies the user into BMI categories
double bsa; // Body surface area
System.out.print("Welcome to the BMI and BSA Calculator to begin enter weight in kilograms.");
weight = stdIn.nextDouble();
System.out.print("Enter height in meters: ");
height = stdIn.nextDouble();
bmi = weight/(height*height);
bsa = Math.sqrt(((height*METERS_TO_CM)*weight)/BSA_CONSTANT);
if (bmi < 18.5)
{
classification = "Underweight";
}
else if (bmi < 25)
{
classification = "Normal";
}
else if (bmi < 30)
{
classification = "Overweight";
}
else
{
classification = "Obese";
}
System.out.println("Choose Options below to set height and weight");
System.out.println("Your classification is: " + classification);
System.out.println("(H)eight: " + height + " meters");
System.out.println("(W)eight: " + weight + " kilograms");
System.out.printf("BMI: %.1f\n", bmi);
System.out.printf("BSA: %.2f\n", bsa);
System.out.println("(Q)uit");
do {
String response = stdIn.next();
if (response.charAt(0)== 'w')
{
System.out.println("Enter new weight: ");
weight = stdIn.nextDouble();
System.out.println("Choose Options below to set height and weight");
System.out.println("Your classification is: " + classification);
System.out.println("(H)eight: " + height + " meters");
System.out.println("(W)eight: " + weight + " kilograms");
System.out.printf("BMI: %.1f\n", bmi);
System.out.printf("BSA: %.2f\n", bsa);
System.out.println("(Q)uit");
}
else if (response.charAt(0) == 'h')
{
System.out.println("Enter new height: ");
height = stdIn.nextDouble();
System.out.println("Choose Options below to set height and weight");
System.out.println("Your classification is: " + classification);
System.out.println("(H)eight: " + height + " meters");
System.out.println("(W)eight: " + weight + " kilograms");
System.out.printf("BMI: %.1f\n", bmi);
System.out.printf("BSA: %.2f\n", bsa);
System.out.println("(Q)uit");
}
else if (response.charAt(0)!= 'w')
{
System.out.println("That is not a valid choice try again");
response = stdIn.next();
}
else if (response.charAt(0)!= 'h')
{
System.out.println("that is not a valid choise try again");
response = stdIn.next();
}
} while (stdIn.next().compareToIgnoreCase("q")!=0);
}
}
Upvotes: 0
Views: 538
Reputation: 234795
You're calling stdIn.next()
in too many places: at the start of the loop, in the loop termination test, and in the last two branches (which, by the way, should both be replaced by a single else { ... }
). (The loop is a do-loop, by the way, not a for-loop.)
Another problem is the mixing of input using a Scanner and output using System.out. I suggest calling System.out.flush() before attempting any input through the Scanner.
Upvotes: 0
Reputation: 32484
By doing stdIn.next().compareToIgnoreCase("q")!=0
you are asking the computer to draw the next value out of the STDIN buffer. This means that after you've done your processing the While loop is waiting for data to come in from STDIN before it decides to continue processing. You would be better of having the while loop run continuously with while( true ) { ... }
and checking the input value ( when you ask for the H or W ) be check to see if it's a q. When it is, then have the program exit.
Upvotes: 3
Reputation: 285405
What for loop? -- never mind as it's been corrected
I do see potential problems with your Scanner object however as it doesn't deal with end of line tokens and you might want to place a call to stdIn.nextLine(); after every call to stdIn.next(); or stdIn.nextDouble();, just so you can properly handle the end of line character.
Upvotes: 0