[英]How can I get my output to only display a certain message when the users input is not 1 of 2 certain strings (options)?
[英]How to prompt the user to only enter one of three options they can choose from and display an error message for wrong input
该程序将提示用户输入介质(空气,水或钢)和距离。 然后计算声波通过介质的距离。
我写了整个程序,但我没有读到我的教授在家庭作业中添加的最后一点,这是以下段落。 现在我被卡住了,因为我不太确定如何将它添加到我的程序中。 我正在使用if语句,但也许我可以将其添加到一个?
程序提示介质:“输入以下其中一项:空气,水或钢:”并读取介质。 如果介质不是空气,水或钢,则程序会打印消息:“抱歉,您必须输入空气,水或钢”,而不是其他任何内容。 否则,程序会提示输入以下距离。
我尝试了一个while
循环并添加了另一个if
语句,但实际上我的问题是语法。 因为我从来没有命令用户输入特定的字符串。
public class SpeedOfSound {
public static void main(String[] args) {
double distance;
double time;
Scanner keyboard = new Scanner(System.in);
//prompt the user to enter the medium through which sound will
System.out.print("Enter one of the following: air, water, or steel:");
String input;
input = keyboard.nextLine();
// prompt the user to enter a distance
System.out.print("Enter distance in feet: ");
distance = keyboard.nextDouble();
// determine if medium is air, water, steele and calculate
if (input.equals("air")) {
time = (distance / 1100);
System.out.println("The total time traveled is " + time + " feet per second.");
}
else if (input.equals("water"))
{
time = (distance / 4900);
System.out.println("The total time traveled is " + time + " feet per second.");
}
else if (input.equals("steel"))
{
time = (distance / 16400);
System.out.println("The total time traveled is " + time + " feet per second.");
}
}
}
我的预期结果是让用户只输入空气,水或钢。
你的代码有几个问题,我冒昧地纠正它们。 阅读注释以更好地理解代码的每个部分。
public class SpeedOfSound
{
/* Best to declare it here so other methods have access to it. */
private static final Scanner keyboard = new Scanner(System.in);
/*
* Declared as a class field so you can use it if you
* have a need for it in addition to time calculated in main.
*/
private static double distance;
/**
* Blocks program execution until a number has been detected as user input.
* @return numeric representation of user input.
*/
public static double getDistance()
{
System.out.println("Enter distance in feet: ");
// CAREFUL: This will throw an exception if the user enters a String
// return keyboard.nextDouble();
while (keyboard.hasNext())
{
/*
* Check if the user input is actually a number
* and if it isn't print an error and get next token
*/
String input = keyboard.nextLine();
try {
return Double.valueOf(input);
}
catch (NumberFormatException e) {
System.out.println("Incorrect input, try again.");
}
}
throw new IllegalStateException("Scanner doesn't have any more tokens.");
}
/**
* Calculate the speed of sound for user input which is limited to:
* <ul>
* <li>Air</li>
* <li>Water</li>
* <li>Steel</li>
* </ul>
* @return total time traveled in feet per second.
*/
public static Double calculate()
{
Double time = null;
//prompt the user to enter the medium through which sound will travel through
System.out.println("Enter one of the following: air, water, or steel:");
// The loop will break the moment time is calculated
while (time == null && keyboard.hasNext())
{
double distance;
String input = keyboard.nextLine();
//determine if medium is air, water, steele and calculate
if (input.equals("air"))
{
distance = getDistance();
time = (distance / 1100);
}
else if (input.equals("water"))
{
distance = getDistance();
time = (distance / 4900);
}
else if (input.equals("steel"))
{
distance = getDistance();
time = (distance / 16400);
}
else System.out.println("Incorrect input, try again.");
}
return time;
}
public static void main(String[ ] args)
{
Double time = calculate();
System.out.println("The total time traveled is " + time + " feet per second.");
}
}
但是我解决这个任务的方法是在排序enum
中实现元素并在那里移动大部分calculate()
方法。 这将允许您快速创建更多元素,如air
, water
和steel
而无需创建额外的if
块来处理它们。
元素枚举器
public enum Element {
AIR("air", 1100),
WATER("water", 4900),
STEEL("steel", 16400);
private final String name;
private final int factor;
Element(String name, int factor) {
this.name = name;
this.factor = factor;
}
/**
* @param element name of the element to calculate time for
* @return total time traveled in feet per second for given element or
* {@code null} if no element matched the given name.
*/
public static Double getTimeTraveledFor(String element)
{
/* Find an element that matches the given name */
for (Element e : Element.values()) {
/*
* Validate the parameter without case consideration.
* This might be a better way of validating input unless
* for some reason you really want a case-sensitive input
*/
if (e.name.equalsIgnoreCase(element)) {
return SpeedOfSound.getDistance() / e.factor;
}
}
return null;
}
}
修改方法
public static Double calculate()
{
Double time = null;
//prompt the user to enter the medium through which sound will travel through
System.out.println("Enter one of the following: air, water, or steel:");
// The loop will break the moment time is calculated
while (time == null && keyboard.hasNext())
{
String input = keyboard.nextLine();
time = Element.getTimeTraveledFor(input);
if (time == null) {
System.out.printf("%s is not a recognized element, try again.", input);
}
}
return time;
}
while(true){
System.out.print("Enter distance in feet: ");
String input;
input = keyboard.nextLine();
//prompt the user to enter a distance
System.out.print("Enter distance in feet: ");
distance = keyboard.nextDouble();
//determine if medium is air, water, steele and calculate
if (input.equals("air"))
{
time = (distance / 1100);
System.out.println("The total time traveled is " + time + "
feet per second.");
break;
}
else if (input.equals("water"))
{
time = (distance / 4900);
System.out.println("The total time traveled is " + time + "
feet per second.");
break;
}
else if (input.equals("steel"))
{
time = (distance / 16400);
System.out.println("The total time traveled is " + time + "
feet per second.");
break;
}
else
System.out.println("wrong choice");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.