变量恢复为默认值

时间:2017-10-19 23:32:01

标签: java while-loop instance-variables

我的程序几乎完成了三个类:一个驱动程序类,一个比萨类和一个计算订单价格的订单类。我唯一的问题是,一旦我运行我的代码,变量将通过比萨类的inputToppings方法中的while循环设置,并且当从披萨类调用toString方法时将打印正确的值订单类但在我的getToppingQuantity方法中,它传递了实例变量的默认值。我在哪里错了?

package edu.ilstu;
import java.util.Scanner;

public class Pizza
   {

//default pizza is cheese and tomato sauce only

private int alfredo = 0;
private int pesto = 0;
private int tomato = 1;
private int sausage = 0;
private int pepperoni = 0;
private int onion = 0;
private int mushroom = 0;
private int greenPepper = 0;
private int cheese=1;
private char choice;

public int getCheese() {
    return cheese;
}
public int getAlfredo()
{
    return alfredo;
}
public void setAlfredo()
{
    alfredo=1;
    pesto=0;
    tomato=0;
}
public int getPesto()
{
    return pesto;
}
public void setSausage(int sausage)
{
    this.sausage = sausage;
}
public void setPepperoni(int pepperoni)
{
    this.pepperoni = pepperoni;
}
public void setOnion(int onion)
{
    this.onion = onion;
}
public void setMushroom(int mushroom)
{
    this.mushroom = mushroom;
}
public void setGreenPepper(int greenPepper)
{
    this.greenPepper = greenPepper;
}
public void setCheese(int cheese)
{
    this.cheese = cheese;
}
public void setPesto()
{
    pesto=1;
    tomato=0;
    alfredo=0;
}
public int getTomato()
{
    return tomato;
}
public void setTomato()
{
    tomato=1;
    pesto=0;
    alfredo=0;
}
public int getSausage()
{
    return sausage;
}
public int getPepperoni()
{
    return pepperoni;
}
public int getOnion()
{
    return onion;
}
public int getMushroom()
{
    return mushroom;
}

public int getGreenPepper()
{
    return greenPepper;
}
public void inputToppings() {

    Scanner sc = new Scanner (System.in);

    while (true) {

        System.out.println("Input toppings. Enter Q to quit");
        System.out.println("1. Sausage");
        System.out.println("2. Pepperoni");
        System.out.println("3. Onion");
        System.out.println("4. Mushroom ");
        System.out.println("5. Green Pepper");
        System.out.println("6. Cheese");
        System.out.println("7. Alfredo");
        System.out.println("8. Pesto");
        System.out.println("9. Tomato");

        if (choice == 'q' || choice == 'Q') {
            break;
        }
        if (choice == '1') {
            addSausage();
        }
        if (choice == '2') {
            addPepperoni();
        }
        if (choice == '3') {
            addOnion();
        }
        if (choice == '4') {
            addMushroom();
        }
        if (choice == '5') {
            addGreenPepper();
        }
        if (choice == '6') {
            addCheese();
        }
        if (choice == '7') {

            if(alfredo != 1) {
            setAlfredo();
            }
            else 
                System.out.println("No double sauce allowed");
        }
        if (choice == '8'){
            if (pesto != 1) {
                setPesto();
            }
            else
                System.out.println("No double sauce allowed");
        }
        if (choice == '9') {
            if(tomato != 1) {
                setTomato();
            }
            else
                System.out.println("No double sauce allowed");
        }

        choice = sc.next().charAt(0);
    }//end while loop
    sc.close();
}//end of inputToppings method
public void addCheese() {
    if(cheese<2) {
        setCheese(cheese+1);
    }
    else
        System.out.println("Invalid input");
}
public void addPepperoni() {
    if (pepperoni<2) {
        setPepperoni(pepperoni+1);
    }
    else 
        System.out.println("Maximum ammount of topping exceeded");
}
public void addSausage() {
    if(sausage<2) {
        setSausage(sausage+1);
    }
    else
        System.out.println("Maximum ammount of topping exceeded");
}
public void addOnion() {
    if(onion<2) {
        setOnion(onion+1);
    }
    else
        System.out.println("Maximum ammount of topping exceeded");
}
public void addGreenPepper() {
    if(greenPepper<2) {
        setGreenPepper(greenPepper+1);
    }
    else
        System.out.println("Maximum ammount of topping exceeded");
}
public void addMushroom() {
    if(mushroom<2) {
        setMushroom(mushroom+1);
    }
    else 
        System.out.println("Maximum ammount of topping exceeded");
}
public String toString() {
    String str ="sausage = " + Integer.toString(sausage)  + " Pepperoni = " + Integer.toString(pepperoni) + "\n" + "Onion = " + Integer.toString(onion) + " Mushroom = " + Integer.toString(mushroom) +"\n" + "cheese = " + Integer.toString(cheese) +"\n" + "Tomato = " + Integer.toString(tomato) + " Pesto = " + Integer.toString(pesto) + " Alfredo = " + Integer.toString(alfredo);
    return str; 
}
public int getToppingQuantity() {
    return sausage+pepperoni+onion+mushroom+cheese;
}
}//end of class

这是订单类

public class Order
{
final double TAX_RATE = 0.075;
final double BASE_PRICE = 5.00;
final double TOPPING_CHARGE = 0.75;
final double DELIVERY_CHARGE = 0.10;
public char typeOfOrder;
public String storeLocation = "";
Pizza pizza1 = new Pizza();
Customer cust1 = new Customer();

public double calculateSubtotal() {
    double toppingPrice = (pizza1.getToppingQuantity()*TOPPING_CHARGE);
    return BASE_PRICE+toppingPrice;
}
public double calculateSalesTax() {
    return calculateSubtotal()*TAX_RATE;
}
public double calculateDeliveryCharge() {
    return (calculateSubtotal() + calculateSalesTax()) * DELIVERY_CHARGE;
}
public void displaySummary() {

    if (typeOfOrder=='d' || typeOfOrder=='D') {
        System.out.printf("Subtotal $%.2f\n", calculateSubtotal());
        System.out.printf("Sales Tax: $%.2f\n", calculateSalesTax());
        System.out.printf("Delivery Charge: $%.2f\n", calculateDeliveryCharge());
        System.out.printf("Total: $%.2f\n",  calculateSubtotal() + calculateSalesTax() + calculateDeliveryCharge());
        System.out.println(pizza1.getToppingQuantity());
        System.out.println("Thank you, come again!");
    }
    else if (typeOfOrder == 'p' || typeOfOrder == 'P') {
        System.out.println(storeLocation);
        System.out.printf("Subtotal $%.2f\n", calculateSubtotal());
        System.out.printf("Sales Tax: $%.2f\n", calculateSalesTax());
        System.out.printf("Total: $%.2f\n", calculateSubtotal() + calculateSalesTax());
        System.out.println("Thank you, come again!");
    }

}
public char getTypeOfOrder()
{
    return typeOfOrder;
}
public void setTypeOfOrder(char typeOfOrder)
{
    this.typeOfOrder = typeOfOrder;
}
public String getStoreLocation()
{
    return storeLocation;
}
public void setStoreLocation(String storeLocation)
{
    this.storeLocation = storeLocation;
}
}

最后是驱动程序类

public class PizzaDriver
{

public static void main(String[] args) {

    Customer cust01= new Customer();
    Order order01 = new Order();
    Pizza pizza01 = new Pizza();

    Scanner sc = new Scanner(System.in);
    System.out.println("Welcome to ILSTU Pizza");
    System.out.println("Step 1: Is this for a pickup or delivery?");
    System.out.println("1 Pickup");
    System.out.println("2 Delivery");
    int choice = sc.nextInt();
    System.out.println("Choice: " + choice);

    if (choice==1) {

        order01.setTypeOfOrder('p');
        System.out.println("1. 207 W. North St, Normal, IL");
        System.out.println("2. 208 Landmark Dr, Bloomington, IL");
        System.out.println("3. 1600 W. Market St, Bloomington, IL");
        System.out.println("Which location would you like to pickup from?");
        choice=sc.next().charAt(0);

        if (choice=='1') {
            order01.setStoreLocation("207 W. North St, Normal, IL");
        }
        else if (choice=='2') {
            order01.setStoreLocation("208 Landmark Dr, Bloomington, IL");
        }
        else if (choice=='3') {
            order01.setStoreLocation("1600 W. Market St, Bloomington, IL");
        }
        else
            System.out.println("invalid choice");

        System.out.println("At this stage would you like to quit this order entry process? \n Enter 'Y' to quit or 'N' to continue on to build your pizza.");
        choice=sc.next().charAt(0);
        if (choice=='N'|| choice == 'n') {
            pizza01.inputToppings();
            System.out.println("Your pizza contains the following toppings: \n" + pizza01.toString());
            order01.displaySummary();
        }
        else if(choice == 'Y' || choice == 'y') {
            System.out.println("Thank you, come again!");
        }
    }

    else if (choice == '2') {
        //System.out.println("Step 2: Customer Information");
        order01.setTypeOfOrder('d');
        sc.nextLine();
        System.out.println("Please enter your first and last name: \n");
        cust01.setFullName(sc.nextLine());

        System.out.println("Please enter your street address");
        cust01.setAddress(sc.nextLine());

        System.out.println("Please enter your city, state and zip code");
        cust01.setCityStateZip(sc.nextLine());

        System.out.println("Please enter your phone number (10-dights only)");
        String userNumber=sc.nextLine();
        while(true) {
            if (userNumber.length()==10) {
                cust01.setPhoneNumber(userNumber);
                break;
            }
            else if (userNumber.length()!=10) {
                System.out.println("Invalid phone number, Enter a valid one");
            }
            userNumber=sc.nextLine();
        }   
        System.out.println(cust01.toString()+"\n");

        System.out.println("At this stage would you like to quit this order entry process? \n Enter 'Y' to quit or 'N' to continue on to build your pizza.");
        choice=sc.next().charAt(0);
        if (choice=='N'|| choice == 'n') {
            pizza01.inputToppings();
            System.out.println("\n Your pizza contains the following toppings: \n" + pizza01.toString());
            order01.displaySummary();
        }
        else if(choice == 'Y' || choice == 'y') {
            System.out.println("Thank you, come again!");
        }
    }
    else 
        System.out.println("invalid choice");

}
}

就像我说我的程序正确执行了这些步骤但是在getToppingQuantity方法中为顶部变量返回了错误的值(注意:我没有包含客户类,因为它与我当前的问题无关)

2 个答案:

答案 0 :(得分:0)

inputToppings()中的while(true)块永远不会允许退出while条件(除了你提供的break退出。不是说while(true)是一种不可接受的编程习惯,但是它可以导致无限循环。最好提供一个布尔标志,然后在标志值改变后退出。

答案 1 :(得分:0)

Order课程中,您有一个Pizza实例变量,但在PizzaDriver中,您需要创建并使用其他Pizza对象。这可能是您问题的根本原因。 (你也在使用Customer类做同样的事情。)

这意味着

System.out.println("\n Your pizza contains the following toppings: \n"
+ pizza01.toString());

...和...

order01.displaySummary();

请参阅不同的Pizza个对象。