파이썬

도서 입고/대출반납 관리를 위한 키오스크 파이썬 프로그램 실습

초롱씨 2023. 11. 13. 16:52
728x90
반응형

오늘 학습내용

# 기능을 수행할 클래스 (모듈 or 라이브러리)생성
class LibraryKiosk:
    ### 클래스 생성자 정의
    def __init__(self):
        ### 도서 목록을 저장할 딕셔너리 변수 생성
        # - 도서 번호, 도서 제목, 도서 재고 수량 정보 담기
        self.books = {}
        print("클래스가 생성되었습니다")
    #도서 입고 정의하기    
    def add_book(self, book_id, title, quantity):
        ## 입고할 도서번호가 존재하는 지 확인
        ## 존재한다면 수량만 증가시키기
        if book_id in self.books:
            # self.books[book_id][quantity] = self.books[book_id][quantity] + quantity
            self.books[book_id]["quantity"] += quantity
        else: ##존재하지 않는다면
            #{ 001 : {'title': 파이썬기초, "quantity:5}}
            self.books[book_id] ={ "title": title, "quantity": quantity}
        print (f"도서번호 :{book_id} / 제목 / : {title} / 입고수량 : {quantity} / 입고확인")
        print(self.books)

    #대출 기능 정의하기
    def borrow_book(self, book_id):
        # 대출하고자하는 해당하는 재고 수량확인하기
        if (book_id in self.books) and (self.books[book_id]["quantity"]>0) :
            # ["quantity"] = self.books[book_id]["quantity"]-1
            self.books[book_id]["quantity"]-=1
            print(f"제목: {self.books[book_id]['title']} / 남은 재고 수량: {self.books[book_id]['quantity']}")
            #해당 도서가 없거나 재고가 없다면
        else:
             print("도서가 존재하지 않거나 , 대출할 재고가 없습니다.")

    #반납기능 정의하기
    def return_book(self, book_id):
            # 빈닙히고자하는 해당하는 재고 수량확인하기
            if (book_id in self.books):
                self.books[book_id]["quantity"]+=1
                print(f"제목: {self.books[book_id]['title']} / 남은 재고 수량: {self.books[book_id]['quantity']}")
                # 해당 도서가 없다면
            else:
                print("해당 도서가 존재하지 않습니다.")            

 

#### 최초에 실행할 기능(함수 ) 정의
def main():
    print("main 함수 호출")
    kiosk= LibraryKiosk()
    ##3. 메뉴 선택 보여주기
    while True:
        print("< 도서 키오스크 메뉴 >")
        print("1. 도서 입고")
        print("2. 도서 대출")
        print("3. 도서 반납")
        print("4. 종료")

        choice = input("원하는 번호(1~4)를 선택하세요")

        if choice =="1":
            #print("입고선택")
            book_id = input("도서 번호를 입력해주세요")
            title = input("도서 제목을 입력해주세요")
            quantity = int(input("입고할 권수를 입력해주세요"))
            # print(f"{book_id}, {title}, {quantity}")
            ### 클래스 내의 입고 기능 호출하기
            kiosk.add_book(book_id, title, quantity)

        elif choice =="2":
            book_id = input("대출할 도서 번호를 입력해주세요")
            ### 클래스 내의 대출 기능 호출하기
            kiosk.borrow_book(book_id)

        elif choice =="3":
            ### 클래스 내의 반납 기능 호출하기
            book_id= input("반납할 도서 번호를 입력해주세요")
            kiosk.return_book(book_id)

        elif choice =="4":
            print("종료되었습니다.")
            break
        else:
            print("잘못선택했습니다")



# 최초 코드 시작
if __name__ == "__main__":
    ## 최초에 실행할 기능 (함수 호출)
    main()
    

 

문제

# <도서 입고/대출반납 관리를 위한 키오스크 파이썬 프로그램 실습>

[미션]
- 도서목록 : 새로운 책이 도서관에 [입고]되었을 때 프로그램 작성
- 도서 대출 : 도서 목록에서 임의 책을 빌리고자 할 때 [대출] 프로그램 작성
- 도서 반납 : 대출한 도서를 [반납]하고자 할 때 프로그램 작성
- 종료하기 : 종료하기에 대한 프로그램 작성
- 도서 입고/대출/반납/종료 중 원하는 것을 선택했을 때 위 내용 수행합니다.
- 프로그램을 종료하기 전까지는 위 내용은 누구든지 서비스를 받을 수 있도록 반복 실행
- 도서에 대한 확인 값은 자유롭게 정의하셔서 진행
- [조건]
- class 생성하여 처리
  

 

자습내용

import pickle
class Library:

    def __init__(self):
        # self.book_list = {}    # 전체 도서 목록
        self.book_list= self.load()

    def load(self):
        book_list = {}
        try:
            with open('./book_list.pickle', 'rb') as file:
                data = pickle.load(file)
                if data:
                    print("저장된 도서 데이터를 불러왔습니다.")
                    book_list = data
                    for code, book_info in book_list.items():
                        print(f"도서코드:{code}-도서이름:{book_info['name']}-저자:{book_info['writer']}-수량:{book_info['quantity']}")

        except FileNotFoundError:
            print("파일이 존재하지 않습니다.")

        return book_list

    def add_book(self, code, name, writer, quantity):
        ## 입고할 도서번호가 존재하는 지 확인
        ## 존재한다면 수량만 증가시키기
        if code in self.book_list:
            self.book_list[book_id]["quantity"] += quantity
        else: ##존재하지 않는다면
            self.book_list[code] ={ "name": name, "writer":writer, "quantity": quantity}
        # print(self.book_list)

    def print_menu(self):         # 반복문 안내문 
        return input('''
            다음 중에서 하실 작업의 메뉴를 입력하세요.
            I - 도서 입고
            N - 모든 도서 상태
            L - 도서 대출
            R - 도서 반납
            S - 저장
            Q - 프로그램 종료
        ''').upper()


    def chk_input_data(self, msg, func):     # 도서 등록시 유효성 검사
        while True:
            x = input(msg).upper()
            if func(x):
                break
            else:
                print('잘못입력하셨습니다. 다시 입력 해 주세요.')
        return x



    def book_insert(self):
        print ("도서 등록")
        book = { 'code' : '' , 'name' : '', 'writer': '', 'status':1, 'quantity':0}
        while True:
            code = input('신규 책 번호를 입력하세요 ')
            if code.isdigit():
                break
            else:
                print("잘못입력하였습니다")
        name = self.chk_input_data("신규 책 이름을 입력하세요.", lambda x: True if len(x) > 0 else False)
        writer = self.chk_input_data("신규 책의 저자를 입력하세요.", lambda x: True if len(x)>0 else False)
        quantity= int(self.chk_input_data("입고할 량을 입력하세요", lambda x: True if x.isdigit() else False))
        self.add_book(code, name, writer, quantity)
        print(self.book_list)



    def book_loan(self,book_list):
        print("도서대출")
        if len(book_list)==0:
            print("등록된 책이 없습니다.")

        else:
            loan_code = input("빌리실 책의 코드를 입력하세요")


            if (loan_code in self.book_list) and (self.book_list[loan_code]["quantity"]>0) :
                # ["quantity"] = self.books[book_id]["quantity"]-1
                self.book_list[loan_code]["quantity"]-=1
                print(f"제목: {self.book_list[loan_code]['name']} / 남은 재고 수량: {self.book_list[loan_code]['quantity']}")
                #해당 도서가 없거나 재고가 없다면
            else:
                print("도서가 존재하지 않거나 , 대출할 재고가 없습니다.")


    def now_book_list(self, book_list):
        print("현재 도서 목록입니다.")
        if len(book_list)==0:
            print("입력된 도서가 없습니다")
        else:
            for code, book_info in book_list.items():
                print(f"도서코드:{code}-도서이름:{book_info['name']}-저자:{book_info['writer']}-수량:{book_info['quantity']}")

    def book_return(self,book_list):
        print("도서반납")
        if len(book_list)==0:
            print("등록된 도서가 없습니다")

        else:
            return_code = input("반납하실 책의 코드를 입력하세요")
            if (return_code in self.book_list):
                self.book_list[return_code]["quantity"]+=1
                print(f"제목: {self.book_list[return_code]['name']} / 남은 재고 수량: {self.book_list[return_code]['quantity']}")
                # 해당 도서가 없다면
            else:
                print("해당 도서가 존재하지 않습니다.")


    def save(self, book_list):
        try:
            with open('./book_list.pickle', 'wb') as file:
                pickle.dump(book_list, file)
                print("고객정보를 저장했습니다.")
        except Exception as e:
            print("저장 오류", e)


    def main(self):
        while True:
            menu = self.print_menu()
            if menu=='I':        #도서 입고
                self.book_insert()
            elif menu=='N':          #현재 도서 목록, 상태 조회
                self.now_book_list(self.book_list)
            elif menu=='L':          # 도서 대출
                self.book_loan(self.book_list)
            elif menu=='R':          #도서 반납
                self.book_return(self.book_list)
            elif menu=='S':          #도서 목록저장
                self.save(self.book_list)
            elif menu=='Q':          #종료 버튼
                self.save(self.book_list)
                print('종료합니다.')
                break
            else:
                print("잘못누르셨습니다")


if __name__ == '__main__':
    a = Library()
    a.main()                
            
        
        

저장, 불러오기,조회 기능 추가

728x90
반응형