Dev

[Python] 1. 기본 개발 프로그래밍 (feat. 커피머신 프로젝트)

mlslly 2024. 5. 2. 15:54

* Udemy의 PythonBootcamp 수업 내용을 참고하여 작성

 

개발의 핵심은 원하는 기능을 프로그래밍으로 구현하는 데에 있다. 

 

커피머신을 디지털 버전으로 코드로 구축해보자. 

주어진건 두가지. 커피머신의 기능을 설명하는 pdf 파일, 그리고 완성된 형태의 커피머신이다. 

설계도와 완성본을 보면서, 커피머신을 만드는 코드를 짜보도록 하자.

 

커피머신 기능 설명 pdf : 

Coffee+Machine+Program+Requirements.pdf
0.07MB


코드 순서

한줄씩 따라하면서 짜보자.

 

1. Prompt user by asking “​What would you like? (espresso/latte/cappuccino):”

 

a. 무엇을 주문하고 싶은지 묻고 input으로 주문을 받는다 

b. 이 프롬프트는 모든 action 이후에 뜨도록 한다. 한 음료 서빙 이후, 한 손님 이후 다른 손님에게도 물어보도록.

while True : 
	drink = input('What would you like? (espresso/latte/cappucino): ')

 

 

2. Turn off the Coffee Machine by entering “offto the prompt.

 

a. off라는 input이 들어오면 커피 머신을 종료한다. (더이상 이후 프롬프트도 나오지 않음)  

is_on = True 

while is_on : 
    choice = input('What would you like? (espresso/latte/cappuccino) : ')
    if choice == 'off' : # 머신 off
        is_on = False

 

3. Print report.

 

a.report 라는 input이 들어오면, 현재 남아있는 모든 재료(resource)의 종류 및 양을 알려준다

- ex. Water: 100ml / Milk: 50ml

is_on = True 

while is_on : 
    choice = input('What would you like? (espresso/latte/cappuccino) : ')
    if choice == 'off' : # 머신 off
        is_on = False
    elif choice == 'report': # 보고 요청 
            print(f'water : {resources['water']}ml')
            print(f'milk : {resources['milk']}ml')
            print(f'coffee : {resources['coffee']}ml')

 

 

4. Check resources sufficient?

 

a.사용자가 메뉴를 선정하면, 그 음료를 만들 재료(resource)가 충분한지를 확인한지 확인한다. 

ex. 만약 라떼에 200ml의 물이 필요한데, 기계에 100ml밖에 남아있지 않다면, 음료를 제조할 수 없고, 'Sorry there is not enough water' 라고 알려야 한다.

def is_resource_sufficient(order_ingredients):
    '''재료 충분시 True, 부족시 False 반환'''
    for item in order_ingredients : 
        if order_ingredients[item] > resources[item]:
            print(f'Sorry there is not enough {item}')
            return False
    return True

 

5. Process coins.

 

a. 음료를 만들 충분한 재료가 있을 경우에, 프로그램은 사용자에게 'insert coins'를 요청한다 

b. 동전별 달러 액수는 다음과 같다 : quarters = $0.25, dimes = $0.10, nickles = $0.05, pennies = $0.01

c. 동전별로 지불된 개수와 액수를 계산하여 총 지불액을 반환 한다.

ex. pennies = 0.25 + 0.1 x 2 + 0.05 + 0.01 x 2 = $0.52

def process_coins():
     ''' 코인을 입력받고 총 지불된 액수를 계산한다 '''
     print('Please insert coins')
     total = int(input('how many quarters?: ')) * 0.25 
     total += int(input('how many dimes?: ')) * 0.1
     total += int(input('how many nickles?: ')) * 0.05
     total += int(input('how many pennies?: ')) * 0.01
     return total

 

6.  Check transaction successful?

 

a. 사용자가 음료를 구매하기 위해 충분한 돈을 지불했는지를 확인한다.

b. 돈이 충분하지 않다면 Sorry that's not enough money. Money refunded.​”.를 출력한다.

c. 돈이 충분히 지불되었다면, 기계의 profit에 음료의 가격만큼의 수익을 더하고, 이는 다음 'report'에 반영되어 출력되도록 한다.

ex. Water: 100ml Milk: 50ml Money: $2.5  Coffee: 76g

d.만약 돈이 음료 가격보다 더 많이 지불되면, 거스름돈을 사용자에게 돌려준다. 

ex. “Here is $2.45 dollars in change.” The change should be rounded to 2 decimal places.

def is_transaction_successful(money_received, drink_cost) : 
     ''' 지불된 금액이 충분하다면 True를, 불충분하다면 False를 반환한다 '''
     if money_received >= drink_cost : 
          change = round(money_received - drink_cost, 2)
          print(f'Here is ${change} in change')
          global profit 
          profit += drink_cost
          return True
     else : 
          print('Sorry that\'s not enough money. Money refunded')
          return False

 

7. Make Coffee.

 

a. 만약 거래가 성공적으로 성사되고 사용자가 선택한 음료를 만들 충분한 재료가 있다면, 음료를 제조한다. 제조 뒤에는 커피 머신 재료에서 제조된 양만큼의 재료들이 차감된다. 

b. 재료를 차감한 이후에, 사용자에게 메뉴에 따른 멘트를 한다 : “Here is your latte. Enjoy!”.

def make_coffee(drink_name, order_ingredients):
    ''' 커피를 만들어 사용된 재료들을 자원에서 차감하고 메뉴 완료를 알린다 '''
    for item in order_ingredients  : 
          resources[item] -= order_ingredients[item]
    print(f'Here is your {drink_name}, Enjoy!')

 


최종 코드 

# 변수부

MENU = {
    "espresso": {
        "ingredients": {
            "water": 50,
            "coffee": 18,
        },
        "cost": 1.5,
    },
    "latte": {
        "ingredients": {
            "water": 200,
            "milk": 150,
            "coffee": 24,
        },
        "cost": 2.5,
    },
    "cappuccino": {
        "ingredients": {
            "water": 250,
            "milk": 100,
            "coffee": 24,
        },
        "cost": 3.0,
    }
}

profit = 0
resources = {
    "water": 300,
    "milk": 200,
    "coffee": 100,
}


# 함수부

def is_resource_sufficient(order_ingredients):
    '''재료 충분시 True, 부족시 False 반환'''
    for item in order_ingredients : 
        if order_ingredients[item] > resources[item]:
            print(f'Sorry there is not enough {item}')
            return False
    return True


def is_transaction_successful(money_received, drink_cost) : 
     ''' 지불된 금액이 충분하다면 True를, 불충분하다면 False를 반환한다 '''
     if money_received >= drink_cost : 
          change = round(money_received - drink_cost, 2)
          print(f'Here is ${change} in change')
          global profit 
          profit += drink_cost
          return True
     else : 
          print('Sorry that\'s not enough money. Money refunded')
          return False
          

def process_coins():
     ''' 코인을 입력받고 총 지불된 액수를 계산한다 '''
     print('Please insert coins')
     total = int(input('how many quarters?: ')) * 0.25 
     total += int(input('how many dimes?: ')) * 0.1
     total += int(input('how many nickles?: ')) * 0.05
     total += int(input('how many pennies?: ')) * 0.01
     return total


def make_coffee(drink_name, order_ingredients):
    ''' 커피를 만들어 사용된 재료들을 자원에서 차감하고 메뉴 완료를 알린다 '''
    for item in order_ingredients  : 
          resources[item] -= order_ingredients[item]
    print(f'Here is your {drink_name}, Enjoy!')


# 출력부 

is_on = True 

while is_on : 
    choice = input('What would you like? (espresso/latte/cappuccino) : ')
    if choice == 'off' : # 머신 off
        is_on = False
    elif choice == 'report': # 보고 요청 
            print(f'water : {resources['water']}ml')
            print(f'milk : {resources['milk']}ml')
            print(f'coffee : {resources['coffee']}ml')
    else :  # 메뉴 주문
        drink = MENU[choice] 
        if is_resource_sufficient(drink['ingredients']) : 
            payment = process_coins()
            if is_transaction_successful(payment, drink['cost']) :
                 make_coffee(choice, drink['ingredients'])