对于这个程序,我们应该计算用户输入的项目的总价格。我们正在使用获取范围double的方法和询问用户是否要继续的方法。以下是我使用的方法:
public static double getRangedDouble(Scanner src, String prompt, double lo, double hi)
{
double retVal = lo - 1;
String trash;
do
{
System.out.print(prompt + " " + lo + " - " + hi);
if(src.hasNextInt())
{
retVal = src.nextInt();
}
else
{
trash = src.nextLine();
}
}while(retVal < lo || retVal > hi);
return retVal;
}
public static Boolean getYNConfirm(Scanner src, String prompt)
{
String input = "";
boolean done=true;
System.out.println(prompt + " Y or N");
while(!done)
{
input = src.nextLine();
if(input.equalsIgnoreCase("Y"))
{
done=true;
}
else if(input.equalsIgnoreCase("N"))
{
done=false;
}
else
{
System.out.println("Y or N");
}
}
return done;
}
这是直接来自我的任务的描述:
在10美元商店,没有超过10.00美元。提示用户 使用该商品的价格(.50美分至9.99美元) getRangedDouble方法并继续输入项目,只要它们 表明他们有更多使用你的getYNConfirm方法。显示 使用printf将项目的总费用改为2位小数。
我知道如何使用程序中的方法但我不知道如何使getYNConfirm方法工作或如何在用户输入单独的价格时计算总价格。任何帮助将不胜感激。
答案 0 :(得分:1)
我不知道为什么这是一个无效的答案。我觉得代码在这里非常自我解释。我添加了一些额外的推理,但我很高兴解释它是否有任何问题
所以代码如下。
public static double getRangedDouble(Scanner src, String prompt, double lo, double hi)
{
boolean valid = false;
while( !valid ) {
System.out.print(prompt + " " + lo + " - " + hi);
if(src.hasNextInt())
retVal = src.nextInt();
else
src.nextLine();
if( retVal < 10 && retVal > 0.5 )
valid = true;
}
return retVal;
}
public static Boolean getYNConfirm(Scanner src, String prompt)
{
String input;
boolean done = false;
double total;
DecimalFormat df=new DecimalFormat("#.##");
while(!done) {
System.out.println("Y or N");
input = src.nextLine();
if(input.equalsIgnoreCase("Y"))
done=true;
else if(input.equalsIgnoreCase("N")) {
done=false;
total += getRangedDouble( file, "Specify the price between:", 0.50, 9.99);
System.out.println( "The total is:" + df.format( total ) );
}
}
return done;
}
基本上你想调用getRangedDouble来要求用户指定价格。你可以通过添加回报来做到这一点
total += getRangedDouble
您要提供的参数是扫描仪,提示,低和上限。
( file, "Specify the price between:", 0.50, 9.99);
在getRangedDouble
中,您希望在响应无效时获取用户输入。所以你是对的,继续阅读,直到有了下一个好的提示。
然后获取并检查他们的价格输入,直到您获得所需的价格范围。
retVal < 10 && retVal > 0.5
当发生这种情况时,它是有效的。将值设置为true,然后返回retVal。要格式化总数,您需要做的就是使用DecimalFormat。该行创建了带有#.##
的十进制格式,指定了2位小数位精度。
DecimalFormat df = new DecimalFormat(&#34;#。##&#34;);
然后您可以在打印时调用df.format( total )
格式化您的总数。
答案 1 :(得分:1)
好的,让我们跳进你的问题:
在10美元商店,没有超过10.00美元。使用getRangedDouble方法提示用户他们的商品价格(.50美分到9.99美元)并继续输入项目,只要他们表明他们有更多使用你的getYNConfirm方法。使用printf将项目的总成本显示为2位小数。
在这个级别上处理任何编码问题的第一件大事就是将其分解为其组成部分。对于这个问题,那些是:
对于第1步,我们会检查getRangedDouble(...)
。这里是为了方便而复制的:
public static double getRangedDouble(Scanner src, String prompt, double lo, double hi){
double retVal = lo - 1;
String trash;
do{
System.out.print(prompt + " " + lo + " - " + hi);
if(src.hasNextInt()){
retVal = src.nextInt();
} else {
trash = src.nextLine();
}
} while(retVal < lo || retVal > hi);
return retVal;
}
对于第2步,我们使用getYNConfirm(...)
方法,在此处给出:
public static Boolean getYNConfirm(Scanner src, String prompt){
String input = "";
boolean done=true;
System.out.println(prompt + " Y or N");
while(!done){
input = src.nextLine();
if(input.equalsIgnoreCase("Y")){
done=true;
} else if(input.equalsIgnoreCase("N")) {
done=false;
} else {
System.out.println("Y or N");
}
}
return done;
}
不幸的是,这有一个逻辑错误。你初始化完成为true,你的while循环超过了条件(!done)。因此第一次这是(!true) - &gt; while(false),不执行。因此永远不会输入while循环,因此每次调用方法时都返回true。要解决这个问题,请考虑一旦看到“Y”后你做了什么 - 你最终会返回true。你的方法首先通过打破循环的动作,但我们可以跳过这一步并直接跳回到返回true。因此,请考虑此版本的getYN
...方法:
public static boolean getYNConfirm(Scanner src, String prompt){
String input = "";
System.out.println(prompt + " Y or N");
while(true){ //Loops forever until a return or break statement
input = src.nextLine();
if(input.equalsIgnoreCase("Y")){
return true;
} else if(input.equalsIgnoreCase("N")) {
return false;
} else {
System.out.println("Y or N");
}
}
}
这符合原始版本方法的意图,没有逻辑错误。
所以现在我们进入了最后的结局 - 使用上述两种方法编写一个方法作为助手,循环并不断询问用户更多的价格,随时总结。让我们把这个方法写成main(String[] args)
,这样我们就可以运行它,看看会发生什么。
我们想在这里使用循环,以便允许用户继续输入价格直到完成。我们可以使用psuedocode对我们的问题进行建模,如下所示:
while(user not done inputting prices){
get next price
add price to sum of prices
ask the user if they would like to continue
}
print sum of prices
就像您可以调用内置方法并存储输出结果(例如rentVal = src.nextInt()
)一样,您也可以使用您编写的方法执行相同的操作。例如,我们可以要求用户使用getRangedDouble(...)
输入下一个价格。通过我们编写的方法标题,这会返回double
类型的值,因此当我们存储此调用的输出时,它应该位于double
变量中:double nextPrice = getRangedDouble(...);
如果伪代码有意义,后面的代码实际上相对简单:
public static void main(String[] args){
Scanner s = new Scanner(System.in); //Allow for reading user input from console
boolean looping = true; //True so long as the user isn't done inputting prices.
//Initially true so that at least one price is entered
double sum = 0.0; //The sum of prices thus far
while(looping){
double nextPrice = getRangedDouble(s, "Enter a price in the range", 0.5, 10.0);
sum = sum + nextPrice; //Add the price into the sum
looping = getYNConfirm(s, "Add another item to your cart?");
}
System.out.println(String.format("%.2f", sum)); //Prints sum, limited to 2 decimal places
}
答案 2 :(得分:0)
我只看到了getYNConfirm
方法的一种用法(这很奇怪),但其中隐藏着一个相当微妙的逻辑错误。
观察:
while(!done)
如果done
为true
,则上面的表达式为:
while(false)
...表示此循环将从不执行。
根据您向我们展示的内容,解决方案就像将done
的初始状态转换为false
一样简单:
boolean done = false;
顺便说一句,一般来说,当你绝对必须时,你想要返回基元的盒装类型。在这种情况下,我不会看到您返回Boolean
而不是boolean
的任何价值。