0

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
    }
} 
Anil
  • 655
  • 1
  • 11
  • 25

1 Answers1

0

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]);





}
}
Chronoslog
  • 107
  • 8
  • When user input is put into choice and quantity, how do I get those choices from the print statement? i.e HP Envy 13 799.99 when user inputs 1 and 1, and how do I get that into the order summary in the output? After I enter a quantity the while retarts, I want it to calculate the order summary instead @Chronoslog –  Oct 05 '19 at 21:43
  • Also the prompt "Enter 'Y' to add a laptop to your purchase or 'N' to exit: " should be displayed at the end of each repetition. Right now it is just displaying it when the error message shows. –  Oct 05 '19 at 21:48
  • For related print function I suggest to read https://stackoverflow.com/questions/6278405/connecting-and-printing-to-a-printer-in-java – Chronoslog Oct 05 '19 at 21:50
  • I don't need to use a printer? I need to somehow extract "HP Envy 13" when user inputs 1 into choice and "799.99*1" when user inputs 1 into quantity. So that they get shown on the order summary. @Chronoslog –  Oct 05 '19 at 22:10
  • As complement: Review your code to store units labels , unit price, user selected quantity in arrays for instance. Then you could output it with calculation. – Chronoslog Oct 05 '19 at 22:30
  • Could you give me an example, I am not sure where to start. @Chronoslog –  Oct 05 '19 at 23:00
  • I edited again , I show with different arrays to make you feel approach (but generally better to design more complex dedicated classes) . hope this will help – Chronoslog Oct 05 '19 at 23:05
  • is it possible to do this without an array without the code I have? –  Oct 05 '19 at 23:26
  • please be more specific , there is many ways to do same thing – Chronoslog Oct 05 '19 at 23:34
  • The code I already had written cannot change, so how could I keep the three prompts that ask for user input the same while getting whatever the user chose and how much and to put those into variables. So that the output looks like the picture I uploaded. @Chronoslog –  Oct 05 '19 at 23:38
  • When I enter 1 for choice, scanner asks the user for quantity, then entered 1 as well. After that, the loop jumps back to the first prompt when it should then ask AGAIN the "Enter 'Y'" prompt. If N then it would go straight to the order summary and print it. The sample output I provided makes what I am saying more clear. –  Oct 05 '19 at 23:41
  • In other terms, your code logic is wrong: As, for instance, you exit(0) instead of display summary. Moreover you can't compute things you don't store. Thus your code must change. Please re-check example I re-edited – Chronoslog Oct 05 '19 at 23:51
  • Could you help me edit my code to do this without me having to change the whole thing? I'm having trouble wrapping my head around this. @Chronoslog –  Oct 05 '19 at 23:56
  • You should be able to complete your job with example I gave. Hint: extract summary part after } of your while you don't have to enclose everything in same loop – Chronoslog Oct 06 '19 at 00:01