반응형
이번엔 커피 머신을 생성해 보았다.
개인적으로 아직 함수화 해서 return 받는 게 익숙 치 않아 코드가 굉장히 많이 더러운 것 같다.
그래도 로직을 완성하는 데 의의를 두고 있다.
로직
- 마시고자하는 커피의 종류를 고른다
- 커피의 종류를 고를 때 'report'를 입력하면 현재 남아있는 재료를 출력해준다
- 남아있는 재료가 충분하지 않다면 충분하지 않음을 알려준다
- 커피를 고르고 동전을 넣는다.
- 동전을 제조 비용보다 많이 넣을 시 (총 동전 - 제조 비용) 을 반환 해준다
- 동전이 부족할 경우 만들어 주지 못한다고 출력한다.
- 재료와 동전이 충족될 시 커피를 만들어 주고 거스름 돈이 있을 시 거스름 돈을 거슬러준다
로직은 이렇게 정리된다.
더보기
지금 정리하고 보니까 굉장히 간단한 듯 함...
코드
init 시에 로직을 정리하여 집어 넣었다.
## 정의
# 뜨거운 커피를 뽑는 기계를 디지털로 만들자
# 커피의 종류 별로 가격, 재료가 다르다
# 커피 머신에 들어가는 원재료는 수시로 채워줘야한다.
# 커피 머신을 동작하기 위해 동전이 필요한데 Penny : 1 cent ($0.01) Dime : 10 cents ($0.10) Nickel : 5 cents ($0.05) Quagrter : 25 cents ($0.25) 이다.
## 로직
# 필요한 것
# 1. 보고서를 출력할 수 있어야 한다.
# -> 어떤 재료가 얼마나 남았는 지 , 물은 얼마나 있고, 우유는 얼마나 남았는 지를 알 수 있어야 한다.
# -> input에 report 를 입력하면 Water, Milk, Coffee, Money 를 출력하고 인풋 다시 받기
# 2. 사용자가 커피를 주문할 때 재료가 충분한지 확인하는 기능도 필요하다.
# -> 사용자가 라떼를 주문했다고 가정했을 때 동전을 넣으면 거스름돈이 나오고 라떼도 나온다. 보고서를 확인하면 물이 100ml 밖에 없는 것 확인 가능
# -> 이런 경우에서 물이 필요한데 채워 넣지 않고 주문을 하면 죄송합니다 문구 출력
# 3. 동전을 처리할 수 있어야 한다.
# -> 동전을 종류별로 넣어서
#
#
#
input("What would you like? (espresso/latte/cappuccino): ")
총 남아있는 재료와 cost 의 딕셔너리를 만들고, 비용체크를 하는 함수와 반복문을 생성해 받아야 할 input 들을 집어 넣었다.
## 정의
# 뜨거운 커피를 뽑는 기계를 디지털로 만들자
# 커피의 종류 별로 가격, 재료가 다르다
# 커피 머신에 들어가는 원재료는 수시로 채워줘야한다.
# 커피 머신을 동작하기 위해 동전이 필요한데 Penny : 1 cent ($0.01) Dime : 10 cents ($0.10) Nickel : 5 cents ($0.05) Quagrter : 25 cents ($0.25) 이다.
## 로직
# 필요한 것
# 1. 보고서를 출력할 수 있어야 한다.
# -> 어떤 재료가 얼마나 남았는 지 , 물은 얼마나 있고, 우유는 얼마나 남았는 지를 알 수 있어야 한다.
# -> input에 report 를 입력하면 Water, Milk, Coffee, Money 를 출력하고 인풋 다시 받기 # espresso/latte/cappuccino
# 2. 사용자가 커피를 주문할 때 재료가 충분한지 확인하는 기능도 필요하다.
# -> 사용자가 라떼를 주문했다고 가정했을 때 동전을 넣으면 거스름돈이 나오고 라떼도 나온다. 보고서를 확인하면 물이 100ml 밖에 없는 것 확인 가능
# -> 이런 경우에서 물이 필요한데 채워 넣지 않고 주문을 하면 죄송합니다 문구 출력
# 3. 동전을 처리할 수 있어야 한다.
# -> 동전을 종류별로 넣어서 커피의 가격보다 낮은 가격의 동전을 넣게 되면 커피는 나오지 않고 동전은 반환 된다. # Sorry that's not enough money. Money refunded.
# -> 커피의 가격보다 높은 가격의 동전을 넣게 되면 커피 가격을 기준으로 거스름돈을 주게 된다.
import data
resources = {
"water": 300, # ml
"milk": 200, # ml
"coffee": 100, # g
}
cost = {
"cent": 1,
"dime": 10,
"nickel": 5,
"quarter": 25
}
today_take = 0
def check_cost(quaters_input, dimes_input, nickels_input, cents_input) :
quaters_input
dimes_input
nickels_input
cents_input
return
while True :
user_input = input("What would you like? (espresso/latte/cappuccino): ")
print("Please insert coins.")
quaters_input = input("how many quarters?: ")
dimes_input = input("how many dimes?: ")
nickels_input = input("how many nickels?: ")
cents_input = input("how many cents?: ")
check_cost(quaters_input, dimes_input, nickels_input, cents_input)
print(f"Here is ${} in change.")
print(f"Here is your espresso ☕. Enjoy!")
머신으로 번 돈의 총량을 선언하고
커피를 만드는 로직을 재 정립했다 -> 머리속에 잘 안들어와서
커피를 만드는 함수를 다시 작성하고 비용 계산을 dict 로 안하고 함수화 시켰다.
## 정의
# 뜨거운 커피를 뽑는 기계를 디지털로 만들자
# 커피의 종류 별로 가격, 재료가 다르다
# 커피 머신에 들어가는 원재료는 수시로 채워줘야한다.
# 커피 머신을 동작하기 위해 동전이 필요한데 Penny : 1 cent ($0.01) Dime : 10 cents ($0.10) Nickel : 5 cents ($0.05) Quagrter : 25 cents ($0.25) 이다.
## 로직
# 필요한 것
# 1. 보고서를 출력할 수 있어야 한다.
# -> 어떤 재료가 얼마나 남았는 지 , 물은 얼마나 있고, 우유는 얼마나 남았는 지를 알 수 있어야 한다.
# -> input에 report 를 입력하면 Water, Milk, Coffee, Money 를 출력하고 인풋 다시 받기 # espresso/latte/cappuccino
# 2. 사용자가 커피를 주문할 때 재료가 충분한지 확인하는 기능도 필요하다.
# -> 사용자가 라떼를 주문했다고 가정했을 때 동전을 넣으면 거스름돈이 나오고 라떼도 나온다. 보고서를 확인하면 물이 100ml 밖에 없는 것 확인 가능
# -> 이런 경우에서 물이 필요한데 채워 넣지 않고 주문을 하면 죄송합니다 문구 출력
# 3. 동전을 처리할 수 있어야 한다.
# -> 동전을 종류별로 넣어서 커피의 가격보다 낮은 가격의 동전을 넣게 되면 커피는 나오지 않고 동전은 반환 된다.
# -> 커피의 가격보다 높은 가격의 동전을 넣게 되면 커피 가격을 기준으로 거스름돈을 주게 된다.
from data import menu
# 현재 남은 리소스 선언
resources = {
"water": 300, # ml
"milk": 200, # ml
"coffee": 100, # g
}
today_take = 0
## 커피 만드는 로직 재 정리
# 1. 어떤 커피인지 알아야 함 -> 함수 선언 시 input 값 파라미터로 받아서 함수 안에서 체크
# 2. 해당 커피를 만들 때 드는 리소스 비용을 현재 리소스 비용과 비교해야함.
# -> 어떤 커피인지 체크 후에 리소스 얼마 남았는 지 비교
# 2.1 비교해서 리소스 비용이 더 많으면 진행 적으면 return false
def make_menu(user_input, resources):
dict_resources = resources
dict_ingre = menu[user_input]['ingredients']
if user_input == 'espresso':
elif user_input == 'latte' or user_input == 'cappuccino' :
elif user_input == 'report':
## 돈계산 로직 재 정리
# 만약
def check_all_take(quaters_input, dimes_input, nickels_input, cents_input) :
all_cost = (quaters_input * 0.01) + (dimes_input * 0.1) + (nickels_input * 0.05) + (cents_input * 0.25)
while True :
# 오늘 번 돈
user_input = input("What would you like? (espresso/latte/cappuccino): ")
print("Please insert coins.")
quaters_input = input("how many quarters?: ")
dimes_input = input("how many dimes?: ")
nickels_input = input("how many nickels?: ")
cents_input = input("how many cents?: ")
check_all_take(quaters_input, dimes_input, nickels_input, cents_input)
print(f"Here is ${} in change.")
print(f"Here is your espresso ☕. Enjoy!")
굳이 파일을 나눠놓을 필요가 없을 것 같아 하나로 합치고 머리속에 로직은 들어 왔으나 구현하는 데 조금 어려움이 있어 컨닝 살짝하고 완성했다. 그럼에도 불구하고 너무 지저분하게 완성 된 감이 있다.
## 정의
# 뜨거운 커피를 뽑는 기계를 디지털로 만들자
# 커피의 종류 별로 가격, 재료가 다르다
# 커피 머신에 들어가는 원재료는 수시로 채워줘야한다.
# 커피 머신을 동작하기 위해 동전이 필요한데 Penny : 1 cent ($0.01) Dime : 10 cents ($0.10) Nickel : 5 cents ($0.05) Quagrter : 25 cents ($0.25) 이다.
## 로직
# 필요한 것
# 1. 보고서를 출력할 수 있어야 한다.
# -> 어떤 재료가 얼마나 남았는 지 , 물은 얼마나 있고, 우유는 얼마나 남았는 지를 알 수 있어야 한다.
# -> input에 report 를 입력하면 Water, Milk, Coffee, Money 를 출력하고 인풋 다시 받기 # espresso/latte/cappuccino
# 2. 사용자가 커피를 주문할 때 재료가 충분한지 확인하는 기능도 필요하다.
# -> 사용자가 라떼를 주문했다고 가정했을 때 동전을 넣으면 거스름돈이 나오고 라떼도 나온다. 보고서를 확인하면 물이 100ml 밖에 없는 것 확인 가능
# -> 이런 경우에서 물이 필요한데 채워 넣지 않고 주문을 하면 죄송합니다 문구 출력
# 3. 동전을 처리할 수 있어야 한다.
# -> 동전을 종류별로 넣어서 커피의 가격보다 낮은 가격의 동전을 넣게 되면 커피는 나오지 않고 동전은 반환 된다.
# -> 커피의 가격보다 높은 가격의 동전을 넣게 되면 커피 가격을 기준으로 거스름돈을 주게 된다.
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,
}
}
# 현재 남은 리소스 선언
resources = {
"water": 300, # ml
"milk": 200, # ml
"coffee": 100, # g
}
# 오늘 매출액
today_take = 0
## 커피 만드는 로직 재 정리
# 1. 어떤 커피인지 알아야 함 -> 함수 선언 시 input 값 파라미터로 받아서 함수 안에서 체크
# 2. 해당 커피를 만들 때 드는 리소스 비용을 현재 리소스 비용과 비교해야함.
# -> 어떤 커피인지 체크 후에 리소스 얼마 남았는 지 비교
# 2.1 비교해서 리소스 비용이 더 많으면 진행 적으면 return false
def can_make(user_input):
for item in user_input:
if user_input[item] > resources[item]:
print(f"Sorry there is not enough {item}.")
return False
return True
def make_coffee(items, user_input):
for item in items:
resources[item] -= items[item]
print(f"Here is your {user_input} ☕. Enjoy!")
def check_changes(ingre_coffee, user_input, quaters_input, dimes_input, nickels_input, cents_input):
cost = menu[user_input]['cost']
all_cost = (quaters_input * 0.01) + (dimes_input * 0.1) + (nickels_input * 0.05) + (cents_input * 0.25)
result_cost = all_cost - cost
if all_cost > cost :
print(f"Here is ${result_cost} in change.")
make_coffee(ingre_coffee, user_input)
global today_take
today_take += cost
else :
print("Sorry that's not enough money. Money refunded.")
return False
while True :
# 오늘 번 돈
user_input = input("What would you like? (espresso/latte/cappuccino): ")
if user_input == "report":
print(f"Water: {resources['water']}ml")
print(f"Milk: {resources['milk']}ml")
print(f"Coffee: {resources['water']}g")
print(f"Money: ${today_take}")
else:
coffee = menu[user_input]
if can_make(coffee['ingredients']) :
print("Please insert coins.")
quaters_input = int(input("how many quarters?: "))
dimes_input = int(input("how many dimes?: "))
nickels_input = int(input("how many nickels?: "))
cents_input = int(input("how many cents?: "))
check_changes(coffee['ingredients'], user_input, quaters_input, dimes_input, nickels_input, cents_input)
3줄 요약
작성하면 할 수록 원리에 대한 이해가 부족한 상태로 작성하는 것 같다. 일단 dict 의 비교를 할 때는 for 문으로 하면 되고 dict_name[item] - another_dict_name[item] 이런 방법으로 값을 수정 할 수도 있구나 싶다. 그래도 로직을 완성 했으니 안심하긴 하지만 코드를 좀 더 이쁘게 정리할 순 없는 지 생각 해봐야겠다.
반응형
'프로그래밍 > Python' 카테고리의 다른 글
Python 부트 캠프 - OOP를 이용한 퀴즈 생성기 (0) | 2023.05.23 |
---|---|
Python 부트 캠프 - OOP를 이용한 커피 머신 생성 (0) | 2023.05.21 |
Python 부트 캠프 - 계산기 만들기 (0) | 2023.04.30 |
Python 부트 캠프 - 경매 게임 만들기 (0) | 2023.04.26 |
Python 부트 캠프 - hangman 게임 만들기 (0) | 2023.04.18 |