2015-04-19 4 views
3

Для этой программы мы должны рассчитать общую цену предметов, введенных пользователем. Мы используем методы для получения двойного диапазона и метод, который запрашивает у пользователя, хотят ли они продолжить. Вот методы, которые я использую:Расчет стоимости выезда

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. Подскажите пользователю по цене по цене их товара (0,50 цента до 9,99 долларов США), используя метод getRangedDouble и продолжайте вводить элементы, пока они указывают, что они имеют больше, используя метод getYNConfirm. Дисплей общая стоимость объекта (ов) до 2 знаков после запятой с печатью.

Я знаю, как использовать методы в программе, но я понятия не имею, как получить метод getYNConfirm или как рассчитать общую цену по мере того, как пользователь вводит отдельные цены. Любая помощь будет принята с благодарностью.

+0

Хорошо, сначала убедитесь, что одна попытка захватить значение и аккумулировать его для общего количества работ. После этого только один раз, сумма должна быть такой же, как и первое значение. Затем рассмотрите, как включить захват значения и захват Y/N в цикл. –

+0

Итак, пользователь вводит элемент, скажем мыло, вам нужно посмотреть цену мыла с вашей прогамы? И когда он ударяет Y, он получает возможность добавить еще один предмет? и когда он набирает N, вы суммируете суммарные предметы, которые он ввел до сих пор, и рассчитать цену? Мой вопрос в том, откуда можно посмотреть цену? Есть ли какое-то случайное число от 0,5 до 9,99? или у вас есть фиксированный список товаров с ценами? Если и скажите это, это будет простой проблемой. –

+0

@PrasaanthNeelakandan, проблема, которую вы должны *** не решить для нее. –

ответ

1

Alrighty, поэтому давайте перейдем к вашему вопросу:

В 10 $ магазине ничего более чем $ 10,00. Подскажите пользователю цену своего товара (0,50 цента до 9,99 долларов США), используя метод getRangedDouble и продолжайте вводить элементы, пока они указывают, что они больше используют метод getYNConfirm. Покажите общую стоимость предмета (ов) до 2 десятичных знаков с помощью printf.

Первое большое дело, связанное с любым вопросом кодирования на этом уровне, разбивает его на составляющие его части. Для этого вопроса, те:

  1. Уметь попросить пользователя за цену предмета (чек)
  2. Уметь спросить пользователя, если у них есть еще один пункт, чтобы войти (чек-иш .. см. ниже)
  3. Loop вышеупомянутые 2 шага до тех пор, как второй верно (TODO)
  4. быть в состоянии суммировать значения, приведенные в каждой ценовой шаге цикла (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 
} 
0

Я вижу только одно использование вашего метода getYNConfirm (что странно), но в нем есть довольно тонкая логическая ошибка.

Наблюдайте:

while(!done) 

Если done является true, то приведенное выше выражение гласит:

while(false) 

... что указывает на то, что этот цикл будет никогда выполняться.

Из того, что вы показали нам до сих пор, решение так же просто, как преобразование исходного состояния done в false:

boolean done = false; 

Как и в сторону, как правило, вы хотите, чтобы вернуть штучной типы для примитивов когда вы абсолютно должны. В этом случае я не вижу в вас значения, возвращающего Boolean, а не boolean.

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. Эта строка создает десятичный formate с #.##, указав точность в 2 десятичных знака.

DecimalFormat df = new DecimalFormat ("#. ##");

, то вы можете позвонить df.format(total), чтобы отформатировать ваше общее количество при его печати.

+0

Зачем ты удалял тот, который у тебя был раньше? Вы даже отредактировали его, чтобы соответствовать этому. Учитывая, что вы пересмотрели свой ответ, я бы с радостью отменил свой голос. – Makoto

+0

Я этого не делал, голоса подтолкнули его настолько низко, что было невидимо – krisdestruction

+0

Да, это результат получения 3 или менее downvotes. Если бы у вас было -2, было бы легче читать снова. – Makoto

Смежные вопросы