소연의_개발일지
article thumbnail

문제 요구사항

1. 유저에게 바로 뭐 마실지 물어보기(에스프레소, 라떼, 프라프치노)

2. report를 입력하면 자판기에 얼마나 재료가 있는지 알려주기

  • off를 누르면 바로 종료

3. 유저가 선택한 음료와 자판기에 있는 재료와 비교해서 충분한지 체크하기

  • 부족하면 부족한 재료 알려주기
  • 충분하면 그대로 진행

4. 동전 넣기(쿼터, 다임, 니켈, 페니 미국 동전 사용)

5. 돈이 충분한지 비교하기

  • 돈이 부족하면 충분한 돈이 아니라고 설명 및 자판기 종료
  • 돈이 충분하면 그대로 진행

6. 음료 주기 및 잔금 출력

 

 

코드

커피 메뉴판 (coffe_menu.py)

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,
    "milk": 200,
    "coffee": 100,
}

# resources['water'] -= 100
# print(resources)

main.py

from coffe_menu import resources, MENU


# TODO 사용자에게 뭘 마실지 질문하기
# 사용자 선택: 에스프레소, 라떼, 카푸치노, off, report

# def machine_report():
#     """기계의 상태를 알려주는 함수"""
#     print(f"water: {resources['water']}")
#     print(f"resources: {resources['milk']}")
#     print(f"coffe: {resources['coffee']}")

def check_enough_resources(choice):
    """커피머신에서 쟤료가 충분한지 확인하는 함수"""
    if resources['water'] >= MENU[choice]['ingredients']['water']:
        resources['water'] -= MENU[choice]['ingredients']['water']
    else:
        print("there is no water")
        return False
    if resources['coffee'] >= MENU[choice]['ingredients']['coffee']:
        resources['coffee'] -= MENU[choice]['ingredients']['coffee']
    else:
        print("there is no ingredients")
        return False
    if resources['milk'] >= MENU[choice]['ingredients']['milk']:
        resources['milk'] -= MENU[choice]['ingredients']['milk']
    else:
        print("there is no water")
        return False



def insert_coin():
    """사용자가 자판기에 동전 넣는 함수"""
    print("please put in coins")
    quarters_coin = float(input("quarters: "))
    dimes_coin = float(input("dimes: "))
    nickles_coin = float(input("nickles: "))
    pennies_coin = float(input("pennies: "))
    sum_coin = quarters_coin * 0.25 + dimes_coin * 0.10 + nickles_coin * 0.05 + pennies_coin * 0.01
    return sum_coin


def user_change(user_sum_coin, user_choice_coffee):
    """돈이 충분한지 확인하는 함수"""
    if user_sum_coin == MENU[user_choice_coffee]['cost']:
        print(f"Here is your {user_choice_coffee}☕. Enjoy!")
    elif user_sum_coin >= MENU[user_choice_coffee]['cost']:
        change = user_sum_coin - MENU[user_choice_coffee]['cost']
        print(f"Here is your {user_choice_coffee}☕. Enjoy!")
        print(f"Here is ${change} dollars in change")
    else:
        print("not enough money!")


while True:
    user_choice = input("What would you like? (espresso/latte/cappuccino): ")

    # TODO 사용자의 선택에 따라 보여주기
    # 사용자 선택이 report라면 현재 커피머신 상태 보여주기
    if user_choice == 'report':
        print(f"water: {resources['water']}")
        print(f"resources: {resources['milk']}")
        print(f"coffe: {resources['coffee']}")
        continue
    if user_choice == 'off':
        break

    # TODO 사용자 선택이 음료라면, 자판기는 충분한 재료가 있는지 확인해야 함
    check_enough_resources(user_choice)

    # TODO 동전 넣기
    # quarters = $0.25, dimes = $0.10, nickles = $0.05, pennies = $0.01

    # TODO 사용자가 충분한 돈 넣었는지 확인하기
    # 아니라면 “Sorry that's not enough money. Money refunded.” 출력하고 돈 반환해줌
    # 만약 충분한 돈 넣었으면 커피머신 돈 추가됨
    # 만약 돈을 초과하면 잔돈 반환해 줌 “Here is $2.45 dollars in change.”

    # TODO 커피 만들기 & 리포트 보여주기
    # 그리고 커피 만들어주기 “Here is your latte. Enjoy!”
    user_change(insert_coin(), user_choice)

코드 실행사진

 

어떤 음료를 마실지 질문

report 입력시 자판기 상태 알려줌

그리고 다시 질문

재료가 충분하면 코인을 넣으라고 함

그리고 돈을 차례로 넣으면 계산한 뒤 음료를 마시라고 준다.

그리고 잔돈도 계산해 준다.

다시 report를 입력하면 재료가 줄어듬을 확인할 수 있다.

off를 누르고 종료하기

개발일지

함수를 많이 쓰려고 노력했는데 기계 상태를 알려주는 걸 함수로 만들었더니(report누르면 나오는 정보)

정보가 업데이트되지 않았다.. 이걸 어떻게 해결하는 방법이 있을까?

그리고 파이참을 사용하니까 스펠링 틀린 부분이 잘 나와서 좋다. 변수명 설정할때 좀 더 명시적으로 바꾸는 연습을 해야겠다. 

또한 의사코드를 자세하게 쓰니까 코드를 짤 때 순서대로 술술 풀린다. 이번 코드는 딱히 순서도를 짜진 않았으나 여기서 더 추가하고 싶은 기능(예를 들어 얼마라고 알려준다던가, 쟤료를 추가하는 부분을 넣던가..)를 넣는다면 순서도를 그려서 해결해야겠다. 

 

오늘 만난 오류

TypeError: 'str' object is not callable

이 오류는 문자열에 대해서 함수 호출을 시도했을 때 발생하는 오류이다. 문자열은 함수가 아니기 때문에 호출될 수 없다.  다음과 같은 상황에서 발생할 가능성이 높다.

  • 함수나 변수 이름을 잘못 입력한 경우
  • 함수나 변수 이름이 이미 사용되었는데 다른 형식(문자열 등)으로 재할당한 경우

나는 변수명을 두 번써서 나타난 오류였다. 바로 해결할 수 있는 문제여서 다행~

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!