0

Alright, so my teacher gave me the question here:

The speed of sound depends on the material the sound is passing through. Below is the approximate speed of sound (in feet per second) for air, water and steel:

air: 1,100 feet per second
water: 4,900 feet per second
steel: 16,400 feet per second

Write a program that asks the user to enter “air”, “water”, or “steel”, and the distance that a sound wave will travel in the medium. The program should then display the amount of time it will take.

Prompts And Output . The program prompts for the medium with: "Enter one of the following: air, water, or steel: " and reads the medium. If the medium is not air, water or steel the program prints the message : "Sorry, you must enter air, water, or steel." an nothing else. Otherwise the program prompts for the distance with ("Enter the distance the sound wave will travel: " and reads it in and then prints "It will take x seconds." where x is the time calculated by your program .

and this is what I have so far.

import java.util.Scanner; //Scanner for input
//Class name
public class TheSpeedOfSound
{
 public static void main(String[] args)//main section
 {
  //varibles
  String speed;
  double distance;
        double time;
  //set scanner
  Scanner keyboard = new Scanner(System.in);
  //ask for the type of speed input
  System.out.println("Enter one of the following: air, water, or steel: ");
  speed = keyboard.nextString();
  //determine if it is a correct variable
      if (speed = "air" || speed = "water" || speed = "steel")
         //ask for the distance input
         System.out.println("Enter the distance the sound wave will travel: ");
       distance = keyboard.nextDouble();
         //set switch
         switch (speed)
         {
         //determine which speed used
            case "air":
               time = distance/1100;
               System.out.print("It will take" + time + "seconds.");
               break;
            case "water":
               time = distance/4900;
               System.out.print("It will take" + time + "seconds.");
               break;
            case "steel":
               time = distance/16400;
               System.out.print("It will take" + time + "seconds.");
               break;
         }
      else
         System.out.print("Sorry, you must enter air, water, or steel.");   
 }
}
My problem is that apparently the nested switch statement messes up the if-else statement and the program recognizes the else near the end of the program as part of a separate if-else statement. I've tried switching the if and else statements contents and that only succeeded in the program not recognizing the (period) in:
speed = keyboard.nextString
So, how might I get around this conundrum? straight up answers are not requested, but hints or similar examples would be appreciated.
Zero Piraeus
  • 56,143
  • 27
  • 150
  • 160
user3760971
  • 11
  • 1
  • 2
  • 1
    Just an FYI: the code snippets functionality only works with Javascript. – Makoto Sep 21 '14 at 05:53
  • Please replace if (speed = "air" || speed = "water" || speed = "steel") with following if (speed.equals("air") || speed.equals("water") || speed.equals("steel")) – Kumar Kailash Sep 21 '14 at 05:56
  • Also you will want to enclose all blocks of code including if blocks, in curly braces `{ }`. Your if block only affects the `System.out.println(...)` under it. If you want it associated with the else further on down, enclose all between in curly braces. Your indentation is misleading you and will not magically make your if block enclose the switch statement. – Hovercraft Full Of Eels Sep 21 '14 at 05:58
  • This is because each string is a new object. But they have the same content. == checks the equality of the object and .equals() checks the equality of the content. – shinjw Sep 21 '14 at 05:59
  • No such thing as nextString() in scanner. – shinjw Sep 21 '14 at 06:00
  • Your if condition and switch are redundant. I'd use switch. – shinjw Sep 21 '14 at 06:01
  • http://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html – shinjw Sep 21 '14 at 06:12

1 Answers1

0

Get familiar with your flow controls. Your if/else statements and switch statements are redundant and unnecessary.

Switch statements are like if-else statements.

  • if() ==> case
  • elseif() ==> case
  • elseif() ==> case
  • else() ==> default

    switch (speed) { //determine which speed used case "air": time = distance/1100; System.out.print("It will take" + time + "seconds."); break; case "water": time = distance/4900; System.out.print("It will take" + time + "seconds."); break; case "steel": time = distance/16400; System.out.print("It will take" + time + "seconds."); break; default: System.out.print("Sorry, you must enter air, water, or steel.");
    }

shinjw
  • 3,329
  • 3
  • 21
  • 42