Как запросить несколько входов и остановить, когда пользователь вводит 0?

Моя программа должна получать большое количество денег и конвертировать ее для изменения, но когда она получает 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)); 
 }
 }
}

Любая помощь будет отличной.

EDIT: Кто-то сказал мне, что было бы легче сделать все это в одном классе, если так, любые предложения, делающие это таким образом, были бы превосходными. Спасибо!!! EDIT: Я забыл упомянуть, что я должен иметь возможность вводить все числа, а затем выводить вывод всех из них.

5 ответов

Вы хотите что-то вроде этого:

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
}


Вы запрашиваете у пользователя номер дважды

  • один раз в состоянии,
  • второй внутри вашего оператора 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 будет локальной переменной, доступной только внутри цикла.


Во-первых, ваши методы должны иметь более низкие имена. Во-вторых, вам нужен цикл - возможно, так

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));
 }
}


Похоже, что вы читаете только один раз, вероятно, вы должны перенести вызов 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));

}


Измените его на что-то вроде этого.

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)); 
}
</integer>

licensed under cc by-sa 3.0 with attribution.