【问题标题】:How to ask for multiple inputs and stop when user enters 0?当用户输入0时如何要求多个输入并停止?
【发布时间】:2014-01-17 01:23:27
【问题描述】:

我的程序应该收到大量的钱,并将其转换为找零,但是当它收到0时,它应该停止请求输入并停止程序。

我所有的数学都是正确的,我只是在重复询问数字时遇到了问题。这是我目前拥有的:

public class Coins {

    public static int quarters;
public static int dimes;
public static int nickels;
public static int pennies;

    public static int Quarters(int TotalCoins) {
        quarters = (int) (TotalCoins / 25);
        TotalCoins %= 25;
        return quarters;
    }
    public static int Dimes(int TotalCoins){
        TotalCoins -= (quarters * 25);
        dimes = (int) (TotalCoins / 10);
        TotalCoins %= 10;
        return dimes;
}
    public static int Nickels(int TotalCoins){
        TotalCoins -= (dimes * 10) + (quarters * 25);
        nickels = (int) (TotalCoins / 5);
        TotalCoins %= 5;
        return nickels;
    }
    public static int Pennies(int TotalCoins){
        TotalCoins -= (nickels * 5 ) + (dimes * 10 ) + (quarters * 25);
        pennies = (int) (TotalCoins / 1);
        TotalCoins %= 1;
        return pennies;
    }
}

这是我的测试类(我很确定我的主要问题是):

public class CoinsTester {
    public static void main(String[] args) {           
        Scanner kybd = new Scanner(System.in);

        if (kybd.nextInt() != 0){
            int changeMoney = kybd.nextInt();
            System.out.println("Quarters = " + Coins.Quarters(changeMoney) + "\nDimes = " + Coins.Dimes(changeMoney) + "\nNickels = " + Coins.Nickels(changeMoney) + "\nPennies = " + Coins.Pennies(changeMoney));              
        }
    }
}

任何帮助都会很棒。

编辑:有人告诉我,在一堂课上做整件事可能会更容易,如果是这样,那么任何这样做的建议也会很好。谢谢!!!
编辑:我忘了提到我应该能够输入所有数字,然后显示所有数字的输出。

【问题讨论】:

    标签: java loops input


    【解决方案1】:

    你想要这样的东西:

    Scanner kybd = new Scanner(System.in);
    
    while (true) { 
        int changeMoney = kybd.nextInt();
        if (changeMoney == 0)
            break;
    
        // do stuff with changeMoney
    }
    

    也可以表示为for循环:

    Scanner kybd = new Scanner(System.in);
    for (int changeMoney = kybd.nextInt(); changeMoney != 0; changeMoney = kybd.nextInt()) {
        // do stuff with changeMoney 
    }
    

    虽然行数更少,但它使 for 循环行很长,但这可以通过使用更短的变量名来缓解:

    Scanner in = new Scanner(System.in);
    for (int i = in.nextInt(); i != 0; i = in.nextInt()) {
        // do stuff with i
    }
    

    【讨论】:

    • 很棒的代码。我的错忘记提及(对此感到抱歉)我应该能够一次输入所有输入数字,你说我该怎么做?
    • 在 while 循环内创建一个循环,收集多个输入,然后使用所有输入。如果 一个 输入为零,则可能会中断
    • @SplattColor 我为可能的解决方案编辑我的答案,将输入存储在List
    【解决方案2】:

    您向用户询问了两次号码

    • 一旦处于状态,
    • 在您的if 语句中的第二个。

    如果您想让用户再次写入另一个数字,您的if 似乎应该替换为循环。在这种情况下,您可以使用类似

    Scanner kybd = new Scanner(System.in);
    for (int changeMoney = -1; (changeMoney = kybd.nextInt()) != 0;){
        System.out.println("Quarters = " + Coins.Quarters(changeMoney) + "\nDimes = " + Coins.Dimes(changeMoney) + "\nNickels = " + Coins.Nickels(changeMoney) + "\nPennies = " + Coins.Pennies(changeMoney));
    }
    

    这种方法的优点是它很短,changeMoney 将是仅在循环内可用的局部变量。

    【讨论】:

    • +1 不错的在线功夫来干燥nextInt(),但有些人认为这样分配和测试的风格很差。
    • @Bohemian 谢谢。修复了一点:)
    • @Bohemian 该死的。现在我意识到这与您的答案相同。为您 +1,然后会回到我以前的版本。
    【解决方案3】:

    首先,您的方法名称应该小写。其次,你需要一个循环——也许像这样

    public static void main(String[] args) {
      Scanner kybd = new Scanner(System.in);
    
      while (kybd.hasNextInt()){ // will stop if the next input is not an int.
        int changeMoney = kybd.nextInt();
        if (changeMoney == 0) {
          break;
        }
        // Assuming you just rename them to "get" methods.
        System.out.println("Quarters = "
            + Coins.getQuarters(changeMoney) + "\nDimes = "
            + Coins.getDimes(changeMoney) + "\nNickels = "
            + Coins.getNickels(changeMoney)
            + "\nPennies = "
            + Coins.getPennies(changeMoney));
      }
    }
    

    【讨论】:

    • +1 不错的建议,我喜欢答案中的 3 种不同方式 :)
    【解决方案4】:

    把它改成这样。

     int changeMoney=0;
     while ( (changeMoney =kybd.nextInt()) != 0){           
         System.out.println("Quarters = " + Coins.Quarters(changeMoney) + "\nDimes = " + Coins.Dimes(changeMoney) + "\nNickels = " + Coins.Nickels(changeMoney) + "\nPennies = " + Coins.Pennies(changeMoney));    
     }
    

    在@Bohemian 回答:很棒的代码。我的错忘记提及(对此感到抱歉)我 应该可以一次输入所有输入的数字,我该怎么做 你会说这个吗?

    将输入存储在一个集合中,例如 List

    代码示例:

    List<Integer> list = new ArrayList<>();          
    while ( (int i =kybd.nextInt()) != 0){           
         list.add(i);
    }
    // Then loop again
    for(Integer changeMoney : list){
         System.out.println("Quarters = " + Coins.Quarters(changeMoney) + "\nDimes = " + Coins.Dimes(changeMoney) + "\nNickels = " + Coins.Nickels(changeMoney) + "\nPennies = " +      Coins.Pennies(changeMoney)); 
    }
    

    【讨论】:

    • @SplattColor +1 实际上是您投票赞成答案 xD.. 考虑接受提供的答案之一以完成此问题并投票赞成您认为回答有助于解决您的问题的人 :)跨度>
    【解决方案5】:

    看起来你只读了一次,你应该将scanner.nextInt()调用包装在一个while循环中,如果值为0则中断

    while (kybd.hasNextInt()){
       int changeMoney = kybd.nextInt();
       if(changeMoney == 0)break;
    
       System.out.println("Quarters = " + Coins.Quarters(changeMoney) + "\nDimes = " + Coins.Dimes(changeMoney) + "\nNickels = " + Coins.Nickels(changeMoney) + "\nPennies = " + Coins.Pennies(changeMoney));
    
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2013-05-24
      • 1970-01-01
      • 2015-12-16
      • 2020-06-05
      • 2021-05-29
      • 2017-07-02
      相关资源
      最近更新 更多