显示更改java
我试着取一个零钱,少于1美元,但多于零,并显示需要零钱的25美分、10美分、5美分和1美分。输出必须以类似于英语的描述性方式呈现,并遵循以下语法规则: 如果金额为零,则应使用“否”一词。 如果金额为1,则单位必须为单数。 如果金额不是1,则单位必须是复数 此外,当输入0以下或1以上的任何内容时,程序应捕获用户错误,并进入数据验证循环以显示提示并要求用户重新输入金额。此循环将继续,直到用户输入的金额小于1.00美元,但大于零 当我运行代码时,我不断重复得到4。 谢谢您抽出时间!非常感谢您的帮助强> 到目前为止我的代码:显示更改java,java,Java,我试着取一个零钱,少于1美元,但多于零,并显示需要零钱的25美分、10美分、5美分和1美分。输出必须以类似于英语的描述性方式呈现,并遵循以下语法规则: 如果金额为零,则应使用“否”一词。 如果金额为1,则单位必须为单数。 如果金额不是1,则单位必须是复数 此外,当输入0以下或1以上的任何内容时,程序应捕获用户错误,并进入数据验证循环以显示提示并要求用户重新输入金额。此循环将继续,直到用户输入的金额小于1.00美元,但大于零 当我运行代码时,我不断重复得到4。 谢谢您抽出时间!非常感谢您的帮助 到
import java.util.Scanner;
public class CoinChange
{
public static void main(String[] args)
{
double amt;
int cents, quarter, dime, nickle, penny;
Scanner keyboard = new Scanner(System.in);
System.out.print("Change in Coins\n" +
"----------------\n\n");
System.out.println("Enter the amount less than $1.00, but\n" +
"more than zero.");
System.out.print("\nEnter amount: ");
amt = keyboard.nextInt();
// ----------------------------------------------
cents = (int)(amt*100 + .1);
quarter = cents/25;
cents %= 25;
dime = cents/10;
cents %= 10;
nickle = cents/5;
cents %= 5;
penny = cents;
// -----------------------------------------
while(amt > 0 && amt <= 1)
{
// -----------------------------------------
if(quarter == 0)
{
System.out.print("no ");
}
else
System.out.print(quarter);
}
if(quarter == 1)
{
System.out.print("quarter");
}
else
{
System.out.print("quarters");
}
}
}
import java.util.Scanner;
公共阶级变革
{
公共静态void main(字符串[]args)
{
双金额;
一分、二角五分、一角、五分、一便士;
扫描仪键盘=新扫描仪(System.in);
System.out.print(“硬币兑换\n”+
“--------------------\n\n”);
System.out.println(“输入少于$1.00的金额,但\n”+
“超过零。”);
系统输出打印(“\n输入金额:”);
amt=键盘.nextInt();
// ----------------------------------------------
美分=(整数)(金额*100+1);
季度=美分/25;
美分%=25;
一角硬币=美分/10;
美分%=10;
镍币=美分/5;
美分%=5;
便士=美分;
// -----------------------------------------
虽然(amt>0&&amt我猜您输入的是数字,如1.05、1.15等。如果您输入该数字作为amt,您将乘以100(得到总美分)并加上.1(不确定您为什么这样做)。然后当你真的想要一个双精度的时候,再转换成一个整数。由于你转换成整数,美分/25通常是4,例如,115/25除以四次,余数被抛出,因此你一直得到四作为答案。你已经声明amt
为int
而使用float
float amt = 0.0;
int cents, quarter, dime, nickle, penny;
// Get amt from user between 0.0 and 1.0
cents = (int)amt*100;
quarter = cents/25;
cents -= quarter*25;
dime = cents/10;
cents -= dime*10;
nickel = cents/5;
cents -= nickel*5;
penny = cents;
// Then print out the numbers of each
/*
if amt = 0.91
cents = 91
quarter = 3
cents = 16
dime = 1
cents = 6
nickel = 1
cents = 1
penny = 1
*/
使用模%
float amt = 0.0;
int cents, quarter, dime, nickle, penny;
// Get amt from user between 0.0 and 1.0
cents = (int)amt*100;
quarter = cents/25;
cents = cents % 25;
dime = cents/10;
cents = cents % 10;
nickel = cents/5;
cents %= 5;
penny = cents;
// Then print out the numbers of each
完整程序
import java.util.Scanner;
public class CoinChange {
public static void main(String[] args) {
float amt;
int cents, quarter, dime, nickle, penny;
Scanner keyboard = new Scanner(System.in);
System.out.print("Change in Coins\n" + "----------------\n\n");
System.out.println("Enter the amount less than $1.00, but\n"
+ "more than zero.");
System.out.print("\nEnter amount: ");
amt = keyboard.nextFloat();
keyboard.close();
cents = (int) (amt * 100);
quarter = cents / 25;
cents = cents % 25;
dime = cents / 10;
cents = cents % 10;
nickle = cents / 5;
cents %= 5;
penny = cents;
System.out.println("$" + amt + " = " + quarter + " quarters, " + dime
+ " dimes, " + nickle + " nickles and " + penny + " pennies");
}
}
测试它:您的代码工作正常。唯一的问题是您在最后陷入了一个循环,因为amt始终是原始金额,所以它会永远打印输出
例如,如果要输出
四分之一
一刻钟
一角硬币
便士
便士
然后你需要在前进的过程中减少金额
编辑**嗯……看起来很奇怪,好像你只是在计算使用的25美分硬币的数量。但问题是一样的。我不知道你为什么需要一个循环。Scanner.nextInt()
返回一个整数。如果您希望用户输入一个整数,从1到99,那么您应该将其分配给美分。您将自己与金额混为一谈,您可以使用键盘.nextDouble()。您应该使用bigdecime进行货币比较。请尝试以下代码:
public class CoinChange {
public static void main(String[] args) {
double amt = getValidInputFromUser();
int remainingCents = (int) (amt * 100);
int quarters = remainingCents / 25;
remainingCents %= 25;
int dimes = remainingCents / 10;
remainingCents %= 10;
int nickles = remainingCents / 5;
remainingCents %= 5;
int pennies = remainingCents;
System.out.println(String.format(
"Quarters %d, Dimes %d, Nickles %d, Cents %d", quarters,
dimes, nickles, pennies));
}
private static double getValidInputFromUser() {
double amt = BigDecimal.ZERO.doubleValue();
do {
Scanner keyboard = new Scanner(System.in);
System.out.print("Change in Coins\n" + "----------------\n\n");
System.out.println("Enter the amount less than $1.00, but\n"
+ "more than zero.");
System.out.print("\nEnter amount: ");
amt = keyboard.nextDouble();
} while (amountGreaterThanOne(amt) || amountIsZero(amt));
return amt;
}
private static boolean amountIsZero(double amt) {
return (BigDecimal.valueOf(amt).compareTo(BigDecimal.ZERO) == 0);
}
private static boolean amountGreaterThanOne(double amt) {
return BigDecimal.valueOf(amt).compareTo(BigDecimal.ONE) > 0;
}
}
您希望这行代码能做什么:while(amt>0&&amt下一个问题:您希望amt
是什么类型的值?您如何声明amt
?接受一个小于1.00美元但大于零的更改量@ajb类型int
的值大于零但小于1.00?int
只能保存整数值。amt
是用户输入。我将它声明为一个int
,带有25美分、10美分等@ajbIm试图只输入0到1美元之间的数字。00@Smith无论哪种方法,你都需要转换成一个双精度来正确地划分数字。他只需要整数,这就是为什么他要乘以100。他加0.1试图使其作为输入大于零。这表示失去pr如果我只留下一个0,它仍然会重复4多次times@Smith现在检查。我必须使用模运算符来获取剩余的美分,它是规范的一部分。cents%=10
是cents=cents%10
的简写,我已经有了。@Smith别把问题留着不谈。这是我的错,我还没有回答过这是另一部分。但循环用于在用户输入高于1.00的任何内容时捕捉错误,它应该进入数据验证循环以显示提示并要求用户重新输入金额。此循环将继续,直到用户输入的金额小于1.00美元,但大于零。我在调试模式下运行了您的代码,它计算了up四分之一镍币一角硬币,等等。然后它就卡在循环中,打印出22222222…等等,因为当我输入0.68时有两个四分之一,那么在代码的这一部分中,我应该为amt
放些什么呢cents=(int)amt*100;