2014-02-12 4 views
0

Я участвую в классе программирования в старшей школе, и мне дали задание сделать основной субтотальный и верхний калькулятор, но я работаю в ресторане, поэтому было немного бессмысленно делать калькулятор, который позволял вам читать в одном блюде. Поэтому я попытался сделать его способным принимать несколько продуктов питания и добавить их к одной переменной цены. Извините, если некоторые из этого кода могут показаться неэффективными или избыточными. Конечно, это только средняя школа.Запись для петель/петель?

Вопрос:, когда я запустил его, он встал на вопрос, есть ли еще один пищевой продукт, который пользователь хотел бы добавить, и когда я набираю «Да» или «Нет», программа делает ничего. Продолжает работать, но не идет дальше. Любые объяснения?

import java.text.NumberFormat; 
import java.util.Scanner; 

public class Price { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     final double taxRate = .0887; //8.87% Tax Rate 
     double tipRate; 
     int quantity1; 
     Scanner kb = new Scanner(System.in); 
     double subtotal, tax, tip, totalCost1, unitPrice1 = 0; 
     String done; 

     System.out.println ("How many of the first item did you get?: "); 
     quantity1 = kb.nextInt(); 

     for (int i = 0; i < quantity1; i++) 
     { 
     System.out.println ("What was the price of that single item "+(i+1) + ": "); 
     unitPrice1 = kb.nextDouble(); 

     System.out.println ("Was there another food item you'd like to add?: "); 
     done=kb.next(); 
     while (done.equalsIgnoreCase("Yes")); 
     } 

     System.out.println ("What percent would you like to tip? (Formatted like 0.10 for 10%, 0.20 for 20%, etc.): "); 
     tipRate = kb.nextDouble(); 

     subtotal= quantity1 * unitPrice1; 
     tax = subtotal * taxRate; 
     totalCost1 = subtotal + tax; 
     tip = totalCost1 * tipRate; 
     totalCost1 = totalCost1 + tip; 


     //Formatting 
     NumberFormat money = NumberFormat.getCurrencyInstance(); 
     NumberFormat tipMoney = NumberFormat.getCurrencyInstance(); 
     NumberFormat taxPercent = NumberFormat.getPercentInstance(); 
     NumberFormat tipPercent = NumberFormat.getPercentInstance(); 


     System.out.println ("Your total before tax is: " + money.format(subtotal)); 
     System.out.println ("The tax is " + money.format(tax) + " at " + tipPercent.format(taxRate)); 
     System.out.println ("The tip at " + tipPercent.format(tipRate) + " is " + tipMoney.format(tip)); 

    } 

} 

ответ

3

У вас есть бесконечный цикл здесь:

while (done.equalsIgnoreCase("Yes")); 

После ввода Yes, он будет держать сидеть и ничего не делать, потому что значение done не Yes и никогда не меняется.

Также ваша структура цикла немного нечетна. Ваш внешний цикл for выполняется столько же раз, сколько и количество первого элемента. Но разве вы не должны умножать это число на стоимость? Поскольку вы либо выполняете цикл до тех пор, пока количество элементов, которые пользователь вводил (спрашивая их перед собой), либо вы не задаете им общее количество элементов и просто просите их ввести Yes, если они хотят добавить еще Предметы; вы не можете действительно сделать то и другое.

Ваш цикл, вероятно, следует искать что-то вроде этого:

String input = "Yes"; 
while(input.equalsIgnoreCase("Yes")) { 
    System.out.println ("How many of the first item did you get? "); 
    quantity1 = kb.nextInt(); 

    System.out.println ("What was the price of that single item? "); 
    unitPrice1 = kb.nextDouble(); 

    //total += unitPrice1 * quantity1 - you don't have this in your code, but this is where you would be calculating the running total 

    System.out.println("Was there another food item you'd like to add? "); 
    input = kb.next(); 
} 
+0

Спасибо! Я исправил это, но теперь моя проблема в том, что он не добавляет несколько итогов вместе. Если я добавлю два элемента за 10 долларов, в промежуточном итоговом счете все равно выйдет всего 10 долларов. Извините за тему jump, но вы видите, в чем проблема? – jacobl

+0

Ну, из вашего текущего кода в его нынешнем виде вы в конечном итоге получаете последнюю введенную стоимость ('unitPrice1'). Вместо этого вы должны вычислять и поддерживать промежуточный итог в цикле (как я показал выше). –

+0

Редактировать - Еще раз спасибо! Я добавил это как комментарий, чтобы поговорить с моим учителем. Но это имеет смысл. Благодаря! – jacobl

0

вам нужно выйти цикл, когда пользователь вводит да, так что вы можете использовать ярлык здесь, как показано ниже:

outerloop: 
    for (int i = 0; i < quantity1; i++) 
      { 
      System.out.println ("What was the price of that single item "+(i+1) + ": "); 
      unitPrice1 = kb.nextDouble(); 

      System.out.println ("Was there another food item you'd like to add?: "); 
      done=kb.next(); 
      while (done.equalsIgnoreCase("Yes")){ 
        break outerloop; 
       } 
      } 

текущий код ничего не делает внутри цикла while, если вы не вводите «да». И если вы введете yes, он будет застревать в бесконечном цикле из-за вашего цикла while. Это не эффективный способ циклирования, но этот код будет иметь наименьшее изменение в вашем текущем коде.

+0

Я завернул его в оператор do. Может и не быть эффективным. Но мой учитель вернется через день или два, так что она сможет помочь мне немного больше. Спасибо хоть! – jacobl

0

Вы в цикле ничего не делаете, вы дали ему условие, но у него нет инструкции.

Попробуйте что-то вроде этого .. (извините за мой ржавый Java)

'public static void main(String[] args) { 

//variable declaration 
bool running = true 

final double taxRate = .0887; //8.87% Tax Rate 
double tipRate; 
int quantity1; 
Scanner kb = new Scanner(System.in); 
double subtotal, tax, tip, totalCost1, unitPrice1 = 0; 
String done; 

while(running = true){ 
    System.out.println ("How many of the first item did you get?: "); 
    quantity1 = kb.nextInt(); 

    for (int i = 0; i < quantity1; i++) 
    { 
    System.out.println ("What was the price of that single item "+(i+1) + ": "); 
    unitPrice1 = kb.nextDouble(); 

    System.out.println ("Was there another food item you'd like to add?: "); 
    done=kb.next(); 

     if(done.equalsIgnoreCase("No")){ 
      running = false 
     //Allows you to break out of the while loop if the user does not want to add anything else 
     //DO NOT USE BREAK STATMENTS, IT IS A POOR PROGRAMMING PRACTICE. 
     };//end if 
    }//end for 
}//end while 

    System.out.println ("What percent would you like to tip? (Formatted like 0.10 for 10%, 0.20 for 20%, etc.): "); 
    tipRate = kb.nextDouble(); 

    //You should comment whats going on here 
    subtotal= quantity1 * unitPrice1; 
    tax = subtotal * taxRate; 
    totalCost1 = subtotal + tax; 
    tip = totalCost1 * tipRate; 
    totalCost1 = totalCost1 + tip; 

    //Formatting 
    NumberFormat money = NumberFormat.getCurrencyInstance(); 
    NumberFormat tipMoney = NumberFormat.getCurrencyInstance(); 
    NumberFormat taxPercent = NumberFormat.getPercentInstance(); 
    NumberFormat tipPercent = NumberFormat.getPercentInstance(); 

    //Output 
    System.out.println ("Your total before tax is: " + money.format(subtotal)); 
    System.out.println ("The tax is " + money.format(tax) + " at " + tipPercent.format(taxRate)); 
    System.out.println ("The tip at " + tipPercent.format(tipRate) + " is " + tipMoney.format(tip)); 

}//end main 
Смежные вопросы