我有一个使用Scanner读取数据的类分配。
import java.util.Scanner;
public class Project23
{
public static void main(String[] args)
{
// Declarations and instantiations.
Scanner scan = new Scanner(System.in);
String any = "";
boolean more = false;
double purchase = 0.0;
// Ask if user would like to run program?
System.out.print("Do you have any purchases? Y/N?: ");
// Ready value into string.
any = scan.nextLine();
System.out.println();
// If any is equal to y or Y it will set the value of more to true
// this runs the while statement below.
more = any.toUpperCase().equals("Y");
// While more is still true continue to run the code within the brackets.
while (more)
{
System.out.print("Please input purchase amount: ");
purchase += scan.nextDouble();
System.out.println();
System.out.print("Do you have any more purchases Y/N?: ");
any = scan.nextLine();
System.out.println();
more = any.toUpperCase().equals("Y");
}
if (purchase >= 2500)
System.out.println("Purchase >= 2500");
else
System.out.println("Purchase < 2500");
}
}
底部是我的测试,以确定每个标志是否正常运行。然而我设置的while循环似乎不想继续运行多次。它将采用一个值,然后如果我说是,我有更多的值(y或Y)它将退出并打印两个鲣鸟
答案 0 :(得分:7)
基本上发生的事情是, 当您正在读取double.inxtDouble()时,您只读取double,但是当您在scan.nextDouble()未读取的流上按Enter键时会出现ENDLINE字符。 因此,当您到达any1 = scan.nextLine()时,它会读取不等于Y或y的结束字符。结果它退出while循环。 像这样纠正你的代码,只需在你读正文的地方换一行:
while(more){
System.out.print("Please input purchase amount: ");
purchase+=Double.parseDouble(scan.nextLine());
System.out.println();
System.out.print("Do you have any more purchases Y/N?: ");
// scan.nextLine();
String any1=scan.nextLine();
System.out.println();
more = any1.equals("y") || any1.equals("Y");//Shortened :)
}
答案 1 :(得分:2)
你应该能够通过在调试器下运行应用程序或添加一些诊断跟踪打印来自己解决这个问题。例如在适当的时候这样的事情。
System.out.println("any is ==>'" + any + "'<==");
(我敢打赌,这表明any
不包含您期望的内容......)
我强烈建议您学习调试自己的代码,而不是要求其他人提供帮助。这对于专业软件工程师来说是一项关键技能。
答案 2 :(得分:1)
这似乎对我来说很好......
boolean more = true;
while (more) {
System.out.print("Do you have any more purchases Y/N?: ");
String any1 = scan.nextLine();
System.out.println();
if (any1.equalsIgnoreCase("y")) {
more = true;
} else {
more = false;
}
System.out.println(more);
}
由于我确定没有那么大的差异
while(more==true)
不是必需的while(more)
说同样的事情。
if(any1.equals("y") || any1.equals("Y"))
不是必需的,if (any1.equalsIgnoreCase("y"))
会做同样的事情
答案 3 :(得分:1)
为了获得更清晰,更易读的代码,在这种情况下更喜欢do..while
块,因为现在不需要more
变量:
public static void main(String[] args) {
double purchase = 0.0;
Scanner scan = new Scanner(System.in);
System.out.print("Do you have any more purchases Y/N?: ");
if (!scan.nextLine().equalsIgnoreCase("y")) {
return;
}
do {
System.out.print("Please input purchase amount: ");
purchase += Double.parseDouble(scan.nextLine());
System.out.print("Do you have any more purchases Y/N?: ");
}
while (scan.nextLine().equalsIgnoreCase("y"));
System.out.println("Your purchase amount is: " + purchase + " and so is " + (purchase >= 2500 ? ">= 2500" : "< 2500"));
}
对于家庭作业,我觉得这很好。对于项目中的实际工作,您应该使用许多有意义的小方法进行重构,并避免大部分冗余。这可能是你的第二个功课:优化它:)