Alrighty, поэтому давайте перейдем к вашему вопросу:
В 10 $ магазине ничего более чем $ 10,00. Подскажите пользователю цену своего товара (0,50 цента до 9,99 долларов США), используя метод getRangedDouble и продолжайте вводить элементы, пока они указывают, что они больше используют метод getYNConfirm. Покажите общую стоимость предмета (ов) до 2 десятичных знаков с помощью printf.
Первое большое дело, связанное с любым вопросом кодирования на этом уровне, разбивает его на составляющие его части. Для этого вопроса, те:
- Уметь попросить пользователя за цену предмета (чек)
- Уметь спросить пользователя, если у них есть еще один пункт, чтобы войти (чек-иш .. см. ниже)
- Loop вышеупомянутые 2 шага до тех пор, как второй верно (TODO)
- быть в состоянии суммировать значения, приведенные в каждой ценовой шаге цикла (TODO)
на шаге 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 превысил условие while (! Done). Таким образом, в первый раз это время (! True) -> while (false), которое не выполняется. Таким образом, цикл while никогда не будет введен, поэтому мы возвращаем true каждый раз, когда вы вызываете метод. Чтобы исправить это, рассмотрите, что вы делаете, когда видите «Y» - вы в конечном итоге возвращаете 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(...);
Если psuedocode имеет смысл, код, который следует на самом деле относительно Простой:
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
}
Хорошо, сначала убедитесь, что одна попытка захватить значение и аккумулировать его для общего количества работ. После этого только один раз, сумма должна быть такой же, как и первое значение. Затем рассмотрите, как включить захват значения и захват Y/N в цикл. –
Итак, пользователь вводит элемент, скажем мыло, вам нужно посмотреть цену мыла с вашей прогамы? И когда он ударяет Y, он получает возможность добавить еще один предмет? и когда он набирает N, вы суммируете суммарные предметы, которые он ввел до сих пор, и рассчитать цену? Мой вопрос в том, откуда можно посмотреть цену? Есть ли какое-то случайное число от 0,5 до 9,99? или у вас есть фиксированный список товаров с ценами? Если и скажите это, это будет простой проблемой. –
@PrasaanthNeelakandan, проблема, которую вы должны *** не решить для нее. –