简体   繁体   中英

Java program producing incorrect output. (while-loop)

Here is a sample of what output should look like!!

My program for displaying an order summary for purchased laptops uses a (1)while loop to process multiple laptops, an (2)if-else to get the laptop name/price; or the error message "Invalid choice. Try again,". a (3)nested if to figure out when the choice of laptop is valid to proceed with the rest of the processing. And a (4)nested if to only print order summary when laptops are purchased.

When I input an invalid number (like 8) into choice, the if statement still executes rather than the else that is below it.
When I input a valid number into choice, it then asks for quantity, but when I input a quantity, how would I add that user input to the order summary instead of the program returning to the top of the loop?

I'm very new to Java, how should my code look to produce the correct output?

Here is the current code I have (JAVA)

public static void main(String[] args) { 
    char cont='Y';
    int qty=0;
    int trigger=0;

    double total=0;
    double subtotal=0;
    double tax=0;
    double price;
    double lineItem=0;

    String orderSummary=" ";
    String laptop=" ";
    Scanner input = new Scanner(System.in);
    Calendar dateTime = Calendar.getInstance();

    //Displays a list of laptops with prices and asked user for their choice. Prompt #1
    int choice = 0;

    while (choice >= 0) {  
        System.out.printf("%nTOP LAPTOPS OF %tY"
                        + "%n%n1. %-23s %7s $%,9.2f"
                        + "%n2. %-23s %8s %,9.2f"
                        + "%n3. %-23s %8s %,9.2f"
                        + "%n4. %-23s %8s %,9.2f"
                        + "%n5. %-23s %8s %,9.2f"
                        + "%n%nEnter your choice: ",
                      dateTime,
                      "HP Envy 13", " ", 799.99, 
                      "Asus ZenBook 13 UX333FA", " ", 849.99,
                      "Dell XPS 13", " ", 989.99,
                      "Alienware Area 51-m", " ", 1999.99,
                      "Razer Blade Stealth", " ", 1299.00);

        choice = input.nextInt();

        if (choice < 6 || choice > 0) {
          System.out.printf("Enter the quantity:");
          qty = input.nextInt();
        } else {
          System.out.printf("Invalid choice! Try again.%n%n");
          System.out.printf("Enter 'Y' to add a laptop to your purchase or 'N' to exit: ");
          cont = input.next().charAt(0);
        }
        if (cont == 'Y') {
          continue;
        }
        if (cont == 'N') {
          System.exit(0);
        }

        //The following if-else prints a $ sign for the first line item
        if (trigger == 1) {
          orderSummary += String.format("%n%, -9d %-30s %8s $%,17.2f", qty, laptop, " ", lineItem);
          trigger = 0;
        } //End else for no $ sign

        //The following statement prints the order summary of the laptops purchased.
        //This should be done when there are no more laptops to process
        if (choice > 0) {
            if (choice < 6) {
                tax = subtotal * .0825;
                total = subtotal + tax;

                orderSummary += String.format("%n%n%34s Subtotal %6s %,17.2f"
                                            + "%n%31s Tax @ 8.25%% %6s %,17.2f"
                                            + "%n%n%37s TOTAL %5s $%,17.2f%n",
                                          " ", " ", subtotal,
                                          " ", " ", tax,
                                          " ", " ", total);
                System.out.printf("%s", orderSummary);
                break;
            } //End if valid choice range ends print order summary  
        } //End if valid choice range begins
    }
} 

Because statements rules AND (&&) OR (&&) correspond to boolean algebra.

if (choice < 6 || choice > 0) corresponds to 'if choice is <8' is True OR if 'choice > 0' is true then whole expression is true

eg for 8 selected it will be TRUE so else will not happen

try if (choice > 0 && choice <6)

Then think the 'business logic', prepare to store and reuse, organise your variable for calculation, please find below example

import java.util.*;

public class Example{
public static void main(String[] args) {


String [] product = {"HP Envy 13","Asus ZenBook 13 UX333FA","Dell XPS 13","Alienware Area 51-m","Razer Blade Stealth"};
double [] unit_rate = {799.99, 849.99, 989.99, 1999.99, 1299.00};
int [] user_selectected_qty = new int [product.length]; 

double total = 0;
boolean again = true;

Scanner input = new Scanner(System.in);
int choice,qty;

while (again)
{

    System.out.println("TOP LAPTOPS");
    for(int i=1; i<product.length ; i++)
        System.out.println(""+i+".\t"+product[i]+"\t\t\t"+unit_rate[i]);

    System.out.println("Enter your choice:");
    choice = input.nextInt();

    // SELECTION PROCESS
    if (choice >0 && choice <6)
    {
    System.out.println("Enter the quantity for "+product[choice]+":");
    qty = input.nextInt();
    user_selectected_qty[choice]+=qty;  


    // ... ASK TO DO IT AGAIN...


    again=false;

    }
    else
    {
     System.out.println("Wrong choice:");
    }

}
    // BEFORE END SHOW SUMMARY  ...COMPUTE TOTAL ...
    System.out.println("LAPTOP ORDER SUMARY");

    for(int i=1; i<product.length ; i++)
        if (user_selectected_qty[i] > 0)
            System.out.println(""+user_selectected_qty[i]+"\t"+product[i]+"\t\t\t"+unit_rate[i]*user_selectected_qty[i]);





}
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM