파이썬 예제 (자동판매기)

파이썬을 이용해 간단한 자동판매기를 콘솔로 구현해 보았습니다.



파이썬 자료형 중 튜플의 개념과, if, for, while 제어문, 함수의 개념만 이해하고 있다면 별로 어렵지 않을 것 같습니다.

클래스보다는 절차지향위주로 코드를 만들어 보았으며, 동작원리는 다음과 같습니다.

1. 판매 메뉴, 가격 변수 설정 (튜플)

2. 메뉴와 가격을 출력한 후, 돈 투입

3. 무한 반복문을 통해 메뉴를 보여주고, 구입 시 잔액 표시

4. 0 번 메뉴 선택 시 반복문 탈출하여, 프로그램 종료


그럼 전체적인 코드를 한 번 살펴보겠습니다.

def showmenu():   
    print()
    print("[자판기 판매 메뉴]")
    for i in range(0, len(menu)):
        print(i+1, ".", menu[i], "\t가격 : ", price[i])
    print()

def buy(num):    
    if money < price[num]:
        print("잔액이 부족합니다. 잔액 : %d" %money) 
        return money
    else:
        print(menu[num], " 구입완료")
        balance = money - price[num]
        print("잔액 : ", balance)
        return balance


if __name__ == '__main__':

    menu = ("콜라", "사이다", "생수", "커피")
    price = (500, 400, 300, 700)
    money = 0
    money = int( input("돈을 투입하세요 : ") )

    while True:
        showmenu()
        sel = int(input("메뉴 번호를 선택하세요 (종료 : 0) : "))
        if sel == 0:
           break;
        elif(sel>=1 and sel <= len(menu)):
           money = buy(sel-1)
        else:
           print("잘못된 메뉴 번호입니다")

    print("자판기 종료, 잔액 %d 반환"%money)

전체 코드는 크게 세 부분으로 나누어져 있으며,

1. 메인 함수는 19~36라인 까지 입니다.

메인 함수는 메뉴 4개, 가격 4개를 가지는 튜플 변수를 각각 생성합니다.

예를 들면, menu 튜플의 0번째 요소는 콜라, 1번째는 사이다 입니다.

그리고 투입금액을 저장할 money 변수를 만들고 input을 통해 투입 금액을 입력 받습니다.

이후 while 반복문이 나오는데 조건식이 True이므로 무한 반복입니다.

반복문 안에서 showmenu()함수를 호출해 메뉴를 출력하고, 사용자가 메뉴 번호를 선택하면, 선택된 번호가 sel 변수에 저장됩니다.

만약 선택된 메뉴 번호가 0번 (자판기 종료) 이면 break 키워드를 통해 반복문을 빠져나가 36라인으로 이동합니다.

선택된 메뉴 번호가 1번 ~ 4번 사이 값이면 buy() 함수의 전달 인자로 선택된 메뉴 번호를 넘겨 구입절차가 시작됩니다.


2. showmenu() 함수는 1~6 라인 까지 입니다.

showmenu() 함수는 함수의 이름에서 바로 뭐하는지 감이 옵니다. 메뉴의 수만큼 for 반복문을 통해 해당메뉴의 이름과 가격을 출력해주는 함수입니다.

3. buy() 함수는 8~16 라인 까지 입니다.

메인함수의 무한루프에서 사용자가 입력한 메뉴 번호를 함수의 전달인자로 대입받아, 현재 가진 돈으로 음료를 살 수 있는지 if 조건문을 통해 판단한 후 잔액이 부족하다면, 잔액이 부족하다고 한 후 바로 리턴하여 함수가 종료됩니다.

만약 잔액이 선택한 음료를 살 수 있을만큼 남아 있다면, 해당 음료를 구매하였다는 메시지를 출력하고 현재 잔액에서 음료 가격을 차감하여 처리합니다.

간단하지 않나요?

모든 내용이 이해가 된다면, 여기서 그치지 말고 자동판매기를 클래스(객체지향적)로 만들어 보는 것도 도움이 되리라 생각합니다.



감사합니다.


[개발환경]
Windows 10 Pro 64bit, VS2017 with PTVS, Python 3.6 64bit

댓글

  1. 절차지향, 객체지향을 비교하면서 쉽게 알 수 있는 예제네요.
    감사합니다. ^^

    답글삭제
  2. 안녕하세요. 질문이 있는데요, 13번 라인의 menu[num]을 제가 만든 것에다가 적용시키니까 num이 정의 안 되어 있다고 하는데....메뉴 번호를 선택했지만 메뉴명을 프린트 하고 싶을 떄는 어찌 해야할까요...
    그리고 저는 잔액이 아니라 합계 금액을 만들고 싶어서 price * 갯수를 만들려고 하는데...
    이럴땐 어찌 하는지요 ㅠㅠ 한번만 도와주세요오오

    답글삭제
    답글
    1. menu=("avocado salad","green mix salad","egg&tomato salad","salad pasta")
      price=(15,12,15,14)
      howmany=0
      total = howmany * price
      def buy(num):
      total = howmany * price[num]

      select=1
      while select !=2:
      select=int(input("번호를 선택 해 주세요.\n 1.주문하기 2.나가기 : "))
      if select ==1:
      print("====George`s Restaurant menu====")
      for i in range(0, len(menu)):
      print(i+1,".",menu[i],"\t가격 : ","$", price[i])
      print()
      foodname=int(input("메뉴 번호를 선택해 주세요 : "))
      print()
      howmany=int(input("갯수를 선택 해 주세요 : "))
      print()
      print(foodname,"를", howmany," 개 구입하셨습니다.")
      print()
      print("합계금액 : %s" %total )


      elif select ==2:
      print("종료합니다")
      print()
      print()
      break

      삭제
    2. 저는 num 대신 menu[foodname] 를 하면 되는거였군요..ㅋㅋㅋ 감사합니다.

      삭제
    3. 예제의 코드를 재미있게 응용하셨네요.

      판매 물건에 판매 갯수까지 더해 총 가격을 계산하는 방식이군요.

      좀 더 응용해 딕셔너리를 이용해 메뉴를 구성하는 방법도 공부에 도움이 됩니다.

      즉 menu와 price를 튜플을 합쳐 딕셔너리로 아래와 같이 구성하는 것이죠.

      menu = {'salad':3000, 'coffee':1500, 'pasta':7500}

      두개의 분리된 메뉴와 가격을 하나로 통합해 딕셔니리 자료형으로 만들어 보아도 좋을 것 같습니다.

      감사합니다.

      삭제
  3. 여기에 continue 문까지 적절하게 추가하려면 어디에 어떤 문장을 추가해야 하나요 ㅠㅠ?

    답글삭제
    답글
    1. continue 구문은 반복문에서 사용 가능하므로, 26번 라인 while 반복문안에 구현해야 되겠죠.

      continue 구문의 역할은 반복문은 처음으로 이동하게 하므로, 어떤 용도도 사용할 것인지는 직접 고민해 보세요.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)