본문으로 바로가기

Java :: 음료 주문 처리 프로그램

category Programing/Java 2018. 9. 12. 23:35

음료 주문을 처리하는 프로그램을 작성했다



입력은 위와 같다. 메뉴의 순번, 이름, 가격, 재고 순으로 입력한 후, 0으로 입력을 마친다.


메뉴의 입력이 끝나면 손님의 주문 내역을 순번, 아이디, 주문개수, 주문 음료 번호 순으로 입력한 후, 0으로 입력을 마친다.





출력은 메뉴를 정리하고 주문 내용들을 정리한다. 또한, 총 매출과 재고 결산 내역을 출력한다.


총 매출과 재고 결산 내역은 아래 사진과 같이 출력된다.








code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import java.util.Scanner;
import java.util.ArrayList;
 
/**
* <strong>Developer</strong>
* <ul>
* <li>NAME   : Lee Jae Seung (g0pher)
* <li>E-MAIL : g0pher@tistory.com
* <li>SITE   : https://g0pher.tistory.com
* </ul>
* <strong>History</strong>
* <ul>
* <li>[create] 2018.09.10 - Lee Jae Seung (g0pher)
* <li>[modify] 2018.09.12 - Lee Jae Seung (g0pher)
* </ul>
* @author Lee Jae Seung (g0pher)
*/
public class DrinkOrder {
    static ArrayList<DrinkInfo> drinkInfo = new ArrayList<>();
    static ArrayList<DrinkBill> drinkBill = new ArrayList<>();
    public static void main(String [] args) {
        DrinkOrder drinkOrder = new DrinkOrder();
        drinkOrder.process();
    }
    void process() {
        int i = 0, total = 0;
        do drinkInfo.add(new DrinkInfo()); while (drinkInfo.get(i++).inputMenu());
        drinkInfo.remove(i-1);
        i=0;
        do drinkBill.add(new DrinkBill()); while (drinkBill.get(i++).inputOrder(drinkInfo.size()));
        drinkBill.remove(i-1);
        for (DrinkInfo j : drinkInfo) j.printMenu();
        System.out.println();
        for (DrinkBill j : drinkBill) total += j.printOrder(drinkInfo.size());
        System.out.printf("\n\n---총 매출---\n\\%d", total);
        System.out.println("\n\n---재고 결산---");
        for (DrinkInfo j : drinkInfo) System.out.printf("%s %d개 판매 [재고 %d개]\n", j.name, j.sell, j.stock);
    }
}
 
class DrinkInfo {
    int id, price, stock, sell;
    String name;
    boolean inputMenu() {
        Scanner sc = new Scanner(System.in);
        id = sc.nextInt();
        if (id == 0return false;
        name = sc.next();
        price = sc.nextInt();
        stock = sc.nextInt();
        return true;
    }
    void printMenu() {
        System.out.printf("[%d] %s %d원 %d개\n", id, name, price, stock);
    }
    
}
 
class DrinkBill {
    int num, count, point=0;
    String id;
    short [] drinkList;
    boolean inputOrder(int drinkCount) {
        drinkList = new short[drinkCount];
        Scanner sc = new Scanner(System.in);
        num = sc.nextInt();
        if (num == 0return false;
        id = sc.next();
        count = sc.nextInt();
        for (int i = 0; i < count; i++) drinkList[sc.nextInt()-1]++;
        return true;
    }
    
    int printOrder(int drinkCount) {
        int sum=0;
        System.out.printf("[%d] %s\n", num, id);
        for (int i = 0; i < drinkCount; i++) {
            if (drinkList[i] != 0){
                DrinkInfo drink = DrinkOrder.drinkInfo.get(i);
                System.out.printf("\t%s * %d = %d\n", drink.name, drinkList[i], drink.price * drinkList[i]);
                drink.sell += drinkList[i];
                drink.stock -= drinkList[i];
                sum += drink.price * drinkList[i];
            }
        }
        for (int i = DrinkOrder.drinkBill.size()-1; i > 0; i--) {
            if (id.equals(DrinkOrder.drinkBill.get(i).id) && DrinkOrder.drinkBill.get(i).point != 0) {
                point += DrinkOrder.drinkBill.get(i).point;
                break;
            }
        }
        point += (int) (sum * 0.05);
        System.out.printf("  합계 : %d원 (%d Point)\n", sum, point);
        return sum;
    }
}
cs




부족한 점


- 숏코딩의 습관이 들어서 가독성이 떨어지는 부분이 많았다

    -> do while 한줄에 쓰지 않기

- 객체지향적인 코딩이 어떤것인지 아직 잘 파악하지 못하는것 같다