728x90
반응형
import unicodedata
menu={'라떼':1000, '민트초콜렛':1500, '딸기스무디':5000, '아이스티':3000, '아메리카노':2000}
str_max = max(list(map(len, menu.keys())))
def fmt(string, width, align='<', fill=' '): # 한글 넓이를 맞추기 위한 함수
count = (width - sum(1 + (unicodedata.east_asian_width(c) in "WF") for c in string))
return {
'>': lambda s: fill * count + s, # lambda 매개변수 : 표현식
'<': lambda s: s + fill * count,
'^': lambda s: fill * (count / 2)
+ s
+ fill * (count / 2 + count % 2)
}[align](string)
def show_menu(): # 메뉴 출력. 메뉴를 보여주기 위함
print('+'*30)
for i, key in enumerate(sorted(list(menu.keys()))):
print("[{:>}] {} : {:>}".format(fmt(str(i+1),2), fmt(key,10), fmt(str(menu[key]),5)))
print('+'*30)
def show_order(order_dic): # 주문 받은 내용 출력
sum_money = 0
print('-'*30)
for i,key in enumerate(sorted(list(order_dic.keys()))):
print("[{:>}] {} : {:>}".format(fmt(str(i+1),2), fmt(key, 10), fmt(str(order_dic[key]),5)))
sum_money += menu[key] * order_dic[key]
print('주문금액 :{:,}'.format(sum_money))
print('-'*30)
return sum_money
def show_order_report(order_dic, order_money, money, changes): # 주문 받은 내용 및 입력금액, 잔액 등 출력
print('='*30)
for i, key in enumerate(sorted(list(order_dic.keys()))):
print("[{:>} {} : {:>}".format(fmt(str(i+1),2), fmt(key, 10), fmt(str(order_dic[key]),5)))
print('-'*30)
print(f"총 커피값 : {order_money:,}, 입력금액 : {money:,}, 잔액:{changes:,}")
print('='*30)
while True: # 1번 while. 주문 받기 무한 반복.
show_menu() # 메뉴 보여주기 함수
order = {} # 주문 받는 딕셔너리 변수. 빈 딕셔너리로 선언
while True: # 2번 while. 한번 주문 받을때 여러 커피 주문 받기 위한 반복
choice = input('커피: ') # 커피면 입력 받기
if choice.upper() == '': # 아무겂도 입력하지 않으면 입력 종료
break
num = int(input('잔수: ')) # 커피수 입력 받음
if choice in order.keys(): # 주문 받은 커피명이 기존 입력 받은 커피명에 있다면
order[choice] += num # 기존 커피잔 수에 더함
else: # 기존 주문에 없다면 신규 커피
order[choice] = num # 주문 딕셔너리에 추가
if choice.upper() == 'E' or choice == 'ㅂ': # 주문의 커피명이 E or ㅂ 이면 키오스크 종료
break
if len(order.keys()) == 0: # 주문 받은게 없이 취소했다면 처음 whle로 돌아감
continue
order_money = show_order(order) # 주문 받은 내용 출력
money = 0
while money < order_money: # 3번 while. 입력 받은 커피값이 주문값보다 작으면 반복
money = input('커피값 입력(Q:주문취소): ')
if money.upper() == 'Q': # 커피값 입력시 주문취소하면 커피값 입력 반복문 종료
break
money = int(money) # 입력 받은 커피값이 주문값보다 크면 정수로 변환
if money != 'Q': # 커피값 입력에서 취소한 것이 아니면
changes = money - order_money # 잔돈 계산
show_order_report(order, order_money, money, changes) # 커피종류, 커피값, 입력금액, 잔액 출력
order_end = input('다시 주문 받기(E:키오스크 종료): ') # 키오스크 종료 여부
if order_end.upper() == 'E':
break
728x90
반응형
'프로그램' 카테고리의 다른 글
[파이썬] 문제 : datascience Table 처리(nba데이터) (0) | 2023.05.22 |
---|---|
[파이썬] 문제 : tkinter 이미지 축소,확대 (event 인수전달) (0) | 2023.05.22 |
[파이썬] 문제 : 1~100까지의 정수 난수 10개를 만들어 최소값, 최대값 찾기 (0) | 2023.05.20 |
[파이썬] 문제 : 방정식 함수 만들기 (0) | 2023.05.19 |
[파이썬] 문제 : 가변 매개변수 사용 문자열 출력 코드 채우기 (0) | 2023.05.19 |
댓글