2015-09-19 3 views
2

Я делаю программу, которая позволяет пользователю заказать еду из кафе, а затем распечатывает квитанцию ​​для еды. Я хочу напечатать на квитанции, которую заказал продукт, и только заказанный продукт, а также количество и количество цены *. Я обнаружил, что использование массива - единственный способ получить упорядоченные элементы в формате списка. Проблема заключается в том, что он показывает элементы, не упорядоченные как нулевые значения, с помощью $ 0. Я хочу, чтобы он отображал только упорядоченные предметы. Кроме того, я не могу понять, как отображать количество каждого элемента рядом с заказом предмета.Распечатать квитанцию ​​о заказе?

Класс продукта

import java.util.Scanner; //program uses class Scanner 

    public void displayMenu() { 
     System.out.printf("%-12s%12s%12s%n", "======", getBelliFreschiName(), "======"); 
     System.out.printf("%-12s%12s%14s%n", "1 ", getStarbucksName(), " $" + getStarbucksPrice()); 
     System.out.printf("%-8s%12s%22s%n", "2 ", getTazoName(), " $" + getTazoPrice()); 
     System.out.printf("%-12s%12s%16s%n", "3 ", getEinsteinName(), " $" + getEinsteinPrice()); 
     System.out.printf("%-12s%12s%15s%n", "4 ", getKrusteazName(), " $" + getKrusteazPrice()); 
     System.out.printf("%-12s%12s%12s%n", "======", "==================", "======"); 
    } 

    public void orderProduct() { 
     do { 
      System.out.println("Please Enter A Product Number Between 1-4 or Press 0 to Exit"); 
      product = input.nextInt(); 

      if (product == 0) { 
       break; 
      } 

      System.out.println("Please Enter Quantity"); 
      quantity = input.nextInt(); 

      switch (product) { 
       case 1: 
        coffeePrice = 2.11; 
        subTotal += (2.11 * quantity); 
        selectedValue[1] = 2.11 * quantity; 
        nameProduct[1] = "Starbucks Coffee"; 
        break; 
       case 2: 
        teaPrice = 2.51; 
        subTotal += (2.51 * quantity); 
        selectedValue[2] = 2.51 * quantity; 
        nameProduct[2] = "Tazo Tea"; 
        break; 
       case 3: 
        bagelPrice = 3.14; 
        subTotal += (3.14 * quantity); 
        selectedValue[3] = 3.14 * quantity; 
        nameProduct[3] = "Einstein Bagel"; 
        break; 
       case 4: 
        muffinPrice = 3.54; 
        subTotal += (3.54 * quantity); 
        selectedValue[4] = 3.54 * quantity; 
        nameProduct[4] = "Krusteaz Muffin"; 
        break; 

       default: 
        System.out.println("Please enter a valid product No."); 
      } 
     } 
     while (product != 0); 
     for (int i = 1; i < 5; i++) { 
      System.out.println(nameProduct[i] + " " + " $" + selectedValue[i]); 
     } 
     System.out.printf("%s%.2f", "\nSubtotal: $", subTotal); 
     System.out.printf("%5s%.2f", "\nTax: $", (subTotal * tax)); 
     System.out.printf("%4s%.2f", "\nTotal: $", (subTotal + (subTotal * tax))); 
    } 
} 
+3

Сторона примечания: кажется, что вы начинаете учиться программировать. Я всем сердцем рекомендую также начать изучать ** хороший ** стиль программирования. Смысл - потратить некоторое время на чтение книги типа «Чистый код» от Мартина Фаулера. – GhostCat

+1

Не размещайте весь ваш код, так как он содержит части, которые не связаны с вашей проблемой. Вместо этого потратьте некоторое время на создание [минимального примера, воспроизводящего вашу проблему] (http://stackoverflow.com/help/mcve) (также известный как [SSCCE] (http://sscce.org/)). – Pshemo

+1

Продукт не меню. Таким образом, класс продукта должен представлять только один продукт. Он может иметь имя и цену. У него не должно быть отдельного имени и отдельной цены для каждого возможного продукта, потому что тогда ресторан должен будет перекомпилировать программу каждый раз, когда они добавят в меню. Поэтому меню должно быть чем-то другим. И тогда, возможно, вы сможете переосмыслить массив. – RealSkeptic

ответ

0

Как насчет второго вопроса в первую очередь.

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

Один из способов сделать это без внесения существенных изменений в вашу программу - создать еще один массив. Вы можете объявить его прямо рядом с другими, например, так:

double[] selectedValue = new double[5]; 
String[] nameProduct = new String[5]; 
int[] quantityOrdered = new int[5]; 

В цикле Do-While, где записать выбранное значение, вы можете изменить этот код так:

case 1: 
    coffeePrice = 2.11; 
    subTotal += (2.11 * quantity); 
    selectedValue[1] = 2.11 * quantity; 
    quantityOrdered[1] = quantity; 
    nameProduct[1] = "Starbucks Coffee"; 

И где вы печатаете вещи, вы можете написать:

System.out.println("Product: " + nameProduct[i] 
    + " Quantity: " + quantityOrdered[i] 
    + " $"+selectedValue[i]); 

Там проблема решена.

И это делает первую проблему тривиальной. Перед печатью поставьте отметку quantityOrdered[i] != 0.

if (quantityOrdered[i] != 0) 
    System.out.println("Product: " + nameProduct[i] 
     + " Quantity: " + quantityOrdered[i] 
     + " $"+selectedValue[i]); 

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

+0

Я как раз собирался это сделать! Это было на кончике моего языка, но я не мог точно понять это. Спасибо. – CodeMajic

0

Кажется, что у вас есть что-то против использования индекса [0] в массивах, вы должны воздействовать на свои эмоции и преодолевать его - иначе это приведет вас к ошибкам «в отдельности» в будущем!

Далее, причина «нулям» является то, что вы печатаете все записи в массивах продукта, независимо от того, пользователь выбрал их или нет, для того, чтобы избежать печати на аннулирует вы можете обернуть печать с проверьте:

if (nameProduct[i] != null) { 
    System.out.println(nameProduct[i] + " " + " $" + selectedValue[i]); 
} 

Если вы хотите напечатать всех продуктов, в том числе и те, которые не были куплены, вы должны инициализировать nameProduct заранее провести все имена, и selectedValue также должна быть инициализированы нулями.

Как для отображения количества, прямо сейчас вы используете один и тот же параметр и опрокинув его с любой итерации внутри цикла while, если вы хотите, чтобы сохраняться как хорошо, вы можете создать массив productQuantity и сохранить количество в нем для каждого продукта, как и для selectedValue.


Все, что сказал ... Лучший подход объектно-ориентированному будет иметь «корзину» объект, который будет иметь «Список товаров» и «общий». Продукт также должен быть объектом, с полями: именем, ценой, количеством и суммой. У вас может быть метод toString(), который будет печатать эти поля с уважением. Что-то вроде следующего:

class Cart { 
    double total = 0; 
    List<Product> products = new ArrayList<>(); 

    void addProductToCart(Product p) { 
     products.add(p); 
     total += p.total; 
    } 

    void displayCart() { 
     for (Product p: products) 
      System.out.println(p); 

     System.out.println("Total cart value: " + total); 
    } 
} 

class Product { 
    String name; 
    double price; 
    int quantity; 
    double total; 

    Product(String name, double price, int quantity) { 
     this.name = name; 
     this.price = price; 
     this.quantity = quantity; 
     this.total = price * quantity; 
    } 

    @Override 
    public String toString() { 
     return name + " $" + price + " Q: " + quantity + " $" + total; 
    } 
} 
+1

Ха-ха мои эмоции. Я только начал массив в 1, потому что он печатал нулевое значение как нуль. Большое вам спасибо за ваш вклад. Я применим это к коду. – CodeMajic

+0

@CodeMajic, пожалуйста, ознакомьтесь с добавлением, которое я добавил к ответу! – Tali

+0

Это потрясающе. В любом случае, я должен использовать объект объектно-ориентированный подход. Это определенно имеет больше смысла. Благодарю. – CodeMajic

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