데이터 분석/파이썬

파이썬으로 간단한 자판기 만들기

쎄마비 2022. 4. 28. 10:00
728x90
반응형

파이썬에 익숙해지기 위해 연습차 클래스로 자판기를 만들어보았습니다.

R은 통계를 위한 언어인 반면 파이썬은 다양한 목적을 위해 사용될 수 있어서 프로그래밍 관련된 기본 지식이 조금 더 필요한 것 같은 인상을 받았습니다.

 

class bev:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock
        
    def __str__(self):
        return self.name + ' - ' + str(self.price) + 'won - ' + str(self.stock) + 'ea'
    
    def __repr__(self):
        return str(self)

# 관리자 기능 클래스
# 관리자용 기능을 사용하기 위해서는 자동판매기 클래스 생성시 지정하는 관리자용 비밀번호를 입력받습니다.
# 사용자 편의를 위해 표시 및 입력받는 인덱스는 1부터 시작하도록 하였습니다.

class ft_admin(object):
    
    # 음료 추가 기능
    # 이름, 가격, 재고, 비밀번호를 입력받고 추가된 상품 정보를 출력합니다.

    def add_bev(self, name, price, stock, password):
        if self.password != password:
            print('Incorrect Password')
        else:
            new_bev = bev(name, price, stock)
            self.bevs.append(new_bev)
            print(new_bev.name + ' added ' + str(new_bev.stock) + 'ea')
            
    # 음료 삭제 기능
    # 인덱스를 입력받아 해당 상품을 삭제합니다.
    # 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
    
    def remove_bev(self, password):
        if self.password != password:
            print('Incorrect Password')
        else:
            try:
                del_index = int(input('Input item number : ')) - 1
                if del_index < len(self.bevs) and del_index >= 0:
                    print(str(self.bevs[del_index]) + ' Deleted')
                    del self.bevs[del_index]
                else:
                    print('Entered Index does not exist. Check the list')
                self.view_list() 
            except(ValueError):
                print('Invalid Input')
        

    # 재고 조정 기능
    # 인덱스와 조절할 재고량을 입력받아 재고를 수정합니다.
    # 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
    
    def restock_bev(self, password):
        if self.password != password:
            print('Incorrect Password')
        else:
            try:
                selected_index = int(input('Input item index number : ')) - 1
                if selected_index < len(self.bevs) and selected_index >= 0:
                    restock_amount = int(input('How many do you restock? : '))
                    self.bevs[selected_index].stock +=  restock_amount
                    print(self.bevs[selected_index].name + ' restocked ' + str(restock_amount) + 'ea')
                else:
                    print('Entered index does not exist. Check the list')
                self.view_list()
            except(ValueError):
                print('Invalid Input')

    # 음료 정보 변경 기능(이름, 가격, 재고)
    # 인덱스와 변경할 항목명, 변경할 값을 입력받아 정보를 수정합니다.
    # 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
    # 항목명을 잘못 입력한 경우 오류 메시지를 출력합니다.
                
    def update_bev(self, password):
        if self.password != password:
            print('Incorrect Password')
        else:
            try:
                selected_index = int(input('Input item index number : ')) - 1
                if selected_index < len(self.bevs) and selected_index >= 0:
                    update_obj = input('What do you want to change? (name / price / stock): ')
                    if update_obj == 'name':
                        update_val = input( update_obj + ' to? : ')
                        print(self.bevs[selected_index].name + ' updated to ' + update_val)
                        self.bevs[selected_index].name = update_val
                    elif update_obj == 'price':
                        update_val = int(input(update_obj + ' to? : '))
                        print(str(self.bevs[selected_index].price) + ' updated to ' + str(update_val))
                        self.bevs[selected_index].price = update_val
                    elif update_obj == 'stock':
                        update_val = int(input(update_obj + ' to? : '))
                        print(str(self.bevs[selected_index].stock) + ' updated to '+ str(update_val))
                        self.bevs[selected_index].stock = update_val
                    else:
                        print('There is no such value')
                else:
                    print('Entered index does not exist. Check the list')
                self.view_list()
            except(ValueError):
                print('Invalid Input')
                
    # 순서 변경 기능
    # 서로 위치를 바꿀 항목의 인덱스를 입력 받아 변경합니다.
    
    def swap_bev(self, password):
        if self.password != password:
            print('Incorrect Password')
        else:
            try:
                self.view_list()
                first_index = int(input('Input 1st index : ')) - 1
                second_index = int(input('Input 2nd index : ')) - 1
                print(self.bevs[first_index].name + ' and ' + self.bevs[second_index].name + ' swapped')
                self.bevs[first_index], self.bevs[second_index] = self.bevs[second_index], self.bevs[first_index]
                self.view_list()
            except(ValueError):
                print('Invalid Input')
    
    # 매출 확인 기능
    # 발생한 거래 수, 매출액, 상품별 판매 내역을 출력합니다.
    # 원하는 경우 판매 내역을 초기화합니다.
    
    def sales_check(self, password):
        if self.password != password:
            print('Incorrect Password')
        else:
            print('Transaction : ' + str(self.purchases))
            print('Sales : ' + str(self.sales))
            sales_info = '\n' + '***Details***' + '\n'
            for m in self.sales_list:
                index_no = self.sales_list.index(m) + 1
                sales_info += 'No. ' + str(index_no) + ' : ' + str(m) + '\n'
            print(sales_info)
            try:
                q_init = input('Initiate sales? (Y/N) : ')
                if q_init == 'y' or q_init == 'Y':
                    self.purchases = 0
                    self.sales = 0
                    self.sales_list = []
                    print('Sales initiated')
            except(ValueError):
                print('Invalid Input')


# 고객용 기능 클래스
            
class ft_customer(object):

    # 판매 중인 목록 표시 기능
    
    def view_list(self):
        info = '\n' + '***Beverage List***' + '\n'
        for i in self.bevs:
            index_no = self.bevs.index(i) + 1
            info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
        print(info)
    
    # 음료 선택하여 장바구니로 보내는 기능
    # 인덱스와 수량을 입력받아 장바구니에 해당 상품과 수량를 추가한 후 장바구니를 출력합니다.
    # 상품 리스트의 상품 종류보다 큰 수의 인덱스 또는 음수를 입력한 경우 오류 메시지를 출력합니다.
    # 보유한 재고보다 큰 수량을 입력한 경우 오류 메시지를 출력합니다.
    # 이미 장바구니에 있는 상품을 추가로 선택한 경우 장바구니에 재고만 추가합니다.

    def select_bev(self):
        global bev
        try:
            selected_index = int(input('Input item index number : ')) - 1
            if selected_index < len(self.bevs) and selected_index >= 0:
                cart_amount = int(input('How many do you need? : '))
                if cart_amount <= self.bevs[selected_index].stock:
                    print('\n' + str(self.bevs[selected_index].name) + ' Added to cart ' + str(cart_amount) + 'ea')
                    self.bevs[selected_index].stock -= cart_amount                    
                    if self.cart == []:
                        cart_bev = bev(self.bevs[selected_index].name, self.bevs[selected_index].price, cart_amount)
                        self.cart.append(cart_bev)
                    else:
                        for i in self.cart:
                            self.name_list.append(i.name)
                        if self.bevs[selected_index].name in self.name_list:
                            for i in self.cart:
                                if i.name == self.bevs[selected_index].name:
                                    i.stock += cart_amount
                        else:
                            cart_bev = bev(self.bevs[selected_index].name, self.bevs[selected_index].price, cart_amount)
                            self.cart.append(cart_bev)
                        self.name_list = []
                    cart_info = '\n' + '***Your cart***' + '\n'
                    self.total_amount = 0
                    for i in self.cart:
                        index_no = self.cart.index(i) + 1
                        cart_info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
                        self.total_amount += i.price * i.stock
                    print(cart_info)
                    print('Your Total amount : ' + str(self.total_amount) + 'won')
                    q_next = input('Proceed to payment or select more?(P:payment, S:select, Q: quit) : ')
                    if q_next == 'P' or q_next == 'p':
                        self.payment()
                    elif q_next == 'S' or q_next == 's':
                        self.select_bev()
                    else:
                        print('End Selecting')
                else:
                    print('We do not have enough stock. Check the list')
                    self.view_list()
            else:
                print('Entered Index does not exist')
        except(ValueError):
            print('Invalid Input')

    # 결제 기능
    # 결제를 위해 우선 장바구니 내역을 보여주고 지불액을 입력받습니다.
    # 총 결제 금액 이상으로 지불한 경우 영수증, 거스름돈을 출력하고 거래 수, 매출, 판매 내역을 추가하고 장바구니를 비웁니다.
    # 총 결제 금액 미만으로 지불한 경우 입력받은 결제액 값을 0으로 되돌리고 오류 문구를 출력합니다.
            
    def payment(self):
            self.view_cart()
            try:
                paid = input('Please input the cash : ')
                if int(paid) >= self.total_amount:
                    receipt_info = '\n' + '***Your receipe***' + '\n'
                    for i in self.cart:
                        index_no = self.cart.index(i) + 1
                        receipt_info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
                    print(receipt_info)
                    print('You paid ' + str(paid) + 'won')
                    print('Your Total amount : ' + str(self.total_amount) + 'won')
                    print('Your change : ' + str(int(paid) - self.total_amount) + 'won')
                    print('Have a nice day!')
                    self.sales += self.total_amount
                    self.purchases += 1
                    for j in self.sales_list:
                        self.name_list.append(j.name)
                    for k in self.cart:
                        if k.name in self.name_list:
                            for l in self.sales_list:
                                if k.name == j.name:
                                    j.stock += k.stock
                        else:
                            self.sales_list.append(k)
                    name_list = []
                    paid = 0
                    self.cart = []
                    self.total_amount = 0
                else:
                    print('You have to pay more. Try again.')
                    paid = 0
            except(ValueError):
                print('Invalid Input')

    # 장바구니 확인
    
    def view_cart(self):
        cart_info = '\n' + '***Your cart***' + '\n'
        for i in self.cart:
            index_no = self.cart.index(i) + 1
            cart_info += 'No. ' + str(index_no) + ' : ' + str(i) + '\n'
        print(cart_info)
        print('Your Total amount : ' + str(self.total_amount) + 'won')
                
    # 장바구니 비우기
    
    def cart_init(self):
        for i in self.cart:
            for j in self.bevs:
                if i.name == j.name:
                    j.stock += i.stock
                    
        self.cart = []
        self.total_amount = 0
        print('Cart is empty now')

# 자동판매기 클래스
# 관리자용 기능과 고객용 기능 클래스를 상속받습니다.
        
class vm(ft_admin, ft_customer):
    def __init__(self, password):
        self.sales = 0
        self.password = password
        self.bevs = []  
        self.cart = []
        self.total_amount = 0
        self.purchases = 0
        self.sales_list = []
        self.name_list = []
    
    # 기능 목록 확인하기
    # 관리자 혹은 고객 값을 입력받아 관련 메뉴를 출력합니다.
    # 다른 값을 입력한 경우 오류메시지를 출력합니다.
    
    def how_to(self):
            user = input('Are you an admin or a customer? (Type admin or customer) : ')
            if user == 'admin':
                print('\n' + '***Functions***' + '\n')
                print('Use .add_bev(name, price, stock, password) to add an item')
                print('Use .view_list() to check Item list')
                print('Use .remove_bev(password) to remove an item')
                print('Use .restock_bev(password) to adjust stock')
                print('Use .update_bev(password) to update info of an item')
                print('Use .swap_bev(password) to swap position')
                print('Use .sales_check(password) to check sales status')
            elif user == 'customer':
                print('\n' + '***Functions***' + '\n')            
                print('Use .view_list() to check Item list')
                print('Use .select_bev() to select an Item')
                print('Use .view_cart() to check selected Item list')
                print('Use .payment() to pay a bill')
                print('Use .cart_init() to empty your cart')
            else:
                print('You can type only [admin] or [customer]')
728x90
반응형

'데이터 분석 > 파이썬' 카테고리의 다른 글

롤 API 활용 예시(LEAGUE-V4, MATCH-V5)  (2) 2022.06.29
파이썬으로 영단어 공부하기  (0) 2022.05.04