The problem
The following table shows the approximate speed of sound in air, water, and steel.
Medium Speed
- Air 1,100 feet per second
- Water 4,900 feet per second
- Steel 16,400 feet per second
Write a program that displays a menu allowing the user to select air, water, or steel. After the user has made a selection, he or she should ask to enter the distance a sound wave will travel in the selected medium. The program will then display the amount of time it will take (round the answer to 4 decimal places). Input validation: check that the user has selected one of the available choices from the menu.Do not accept distances less than 0.
Breaking it down
Create variables
double distance = 0.0; // Distance
String medium; // To hold "air", "water", or "steel"
// Create a Scanner object for keyboard input.
Scanner keyboard = new Scanner(System.in);
Create distance travelled method
/**
* Method should return the distance traveled in seconds.
*
* @param medium
* @param distance
* @throws NullPointerException when medium is null
*
* @return distance traveled
*/
static double getDistanceTraveledInSeconds(String medium, double distance) {
checkNotNull(medium);
if (medium.equalsIgnoreCase("air")) {
return distance / 1100.0;
} else {
if (medium.equalsIgnoreCase("water")) {
return distance / 4900.0;
} else {
if (medium.equalsIgnoreCase("steel")) {
return distance / 16400.0;
}
}
}
return 0.0;
}
Get input from user
// Get the user's medium of choice.
System.out.print("Enter one of the following: air, water, or steel: ");
medium = keyboard.nextLine();
// Get the distance.
System.out.print("Enter the distance the sound wave will travel: ");
distance = keyboard.nextDouble();
Calculate and display output
// calculate
double distanceTravelled = getDistanceTraveledInSeconds(medium, distance);
// display output
System.out.println("It will take " + distanceTravelled + " seconds.");
Output
Enter one of the following: air, water, or steel: air
Enter the distance the sound wave will travel: 4500
It will take 4.090909090909091 seconds.
Unit tests
@Test(expected=NullPointerException.class)
public void get_distance_travelled_in_seconds_null_medium () {
SpeedOfSound.getDistanceTraveledInSeconds(null, 333);
}
@Test
public void get_distance_travelled_in_seconds_air () {
double val = SpeedOfSound.getDistanceTraveledInSeconds("air", 1100);
assertEquals(1, val, 0);
}
@Test
public void get_distance_travelled_in_seconds_water () {
double val = SpeedOfSound.getDistanceTraveledInSeconds("water", 4900);
assertEquals(1, val, 0);
}
@Test
public void get_distance_travelled_in_seconds_steel () {
double val = SpeedOfSound.getDistanceTraveledInSeconds("steel", 16400);
assertEquals(1, val, 0);
}
@Test
public void get_distance_travelled_in_seconds_nothing () {
double val = SpeedOfSound.getDistanceTraveledInSeconds("", 16400);
assertEquals(0, val, 0);
}
Level Up
- Validate the users inputs for air/water/steel
- Create ENUM OR constants for air/water/steel, be sure to update the test!
- Allow the user to enter have the ability to show the feet per second in time. adjust the getDistanceTraveledInSeconds -> getDistancedTraveled