고객정보 관리 시스템에 이어 두번째 실습은 도서관리 프로그램이다.
주어진 조건은 다음과 같았다.
[미션]
- 도서 목록 : 새로운 책이 도서관에 [입고]되었을 때 프로그램 작성
- 도서 대출 : 도서 목록에서 임의 책을 빌리고자 할 때 [대출] 프로그램 작성
- 도서 반납 : 대출한 도서를 [반납]하고자 할 때 프로그램 작성
- 상태 확인 : 대출하고자 하는 도서가 도서 목록에 있는지?(생략)
- 종료하기 : 종료하기에 대한 프로그램 작성
- 도서 입고/대출/반납/종료 중 원하는 것을 선택했을 때 위 내용 수행합니다.
- 프로그램을 종료하기 전까지는 위 내용은 누구든지 서비스를 받을 수 있도록...반복 실행
- 도서에 대한 확인 값은 자유롭게 정의하셔서 진행
[조건]
- class 생성하여 처리
내가 적어본 코드
우선 내가 무엇을 만들어야 할지 크게 틀을 먼저 잡고 시작하였다. (클래스 명, 함수 명 등등)
1. class 생성(Library)
2. 메뉴 함수 : def menu
3. 입고 함수 : def store
4. 대출 함수 : def borrow
5. 반납 함수 : def returned
6. 종료 함수 : def exit
7. 변수 : 책(book)list, 고객(?)
8. 책 : 넘버, 책이름, 작가, 전체 수량, 빌려간 수량, 남아있는 수량
class Library:
def __init__(self):
self.customers = list()
self.books = list()
def print_menu(self):
return input('''
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
''').lower()
def store(self, books):
print('새로운 책 정보를 입력하세요')
book = {'number':'','title':'','author':'','totalcount':'', 'borrowcount':'', 'remaincount':''}
book['number'] = input('책 넘버를 입력하세요 : ')
book['title'] = input('책 이름을 입력하세요 : ')
book['author'] = input('책 저자를 입력하세요 : ')
book['totalcount'] = input('총 수량을 입력하세요 : ')
book['borrowcount'] = int(input('빌려간 수량을 입력하세요 : '))
book['remaincount'] = int(book['totalcount'])-int(book['borrowcount'])
books.append(book)
print('책 등록이 완료되었습니다.')
print(books)
def borrow(self, books):
print('도서 대출')
print(f'도서 리스트 : {books}')
num_book = input('대출할 책 넘버를 입력하세요 : ')
nums = [book['number'] for book in books]
if num_book in nums:
for book in books:
if book['number'] == num_book:
remaincount_book = int(book['remaincount'])
print(f'해당 {num_book}번의 책이 {remaincount_book}권 남아있습니다.')
if remaincount_book > 0:
borrow_check = input('대여하시겠습니까? Y/N').upper()
if borrow_check == 'Y':
print('대여 완료되었습니다.')
book['borrowcount'] += 1
book['remaincount'] -= 1
print(f'대여 후 : {books}')
else:
print('대여를 취소합니다.')
else:
print('대여할 수량이 없습니다.')
break
else:
print('해당 넘버에 해당하는 책이 없습니다.')
def returned(self, books):
print('도서 반납')
returned_num = input('반납할 책 넘버를 입력하세요 : ')
nums = [book['number'] for book in books]
for book in books:
if returned_num in nums:
returned_check = input('반납하시겠습니까? Y/N').upper()
if returned_check == 'Y':
print('반납이 완료되었습니다.')
book['borrowcount'] -= 1
book['remaincount'] += 1
print(f'대여 후 : {books}')
else:
print('반납을 취소합니다.')
else:
print('해당 책이 없습니다.')
break
def main(self):
while True:
menu = self.print_menu()
if menu == 'store':
self.store(self.books)
elif menu == 'borrow':
self.borrow(self.books)
elif menu == 'return':
self.returned(self.books)
elif menu == 'exit':
print('안녕히가세요 :)')
break
else:
print('잘못 입력하셨습니다. 다시 입력 해주세요.')
if __name__ == '__main__':
a = Library()
a.main()
실행 결과:
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
store
새로운 책 정보를 입력하세요
책 넘버를 입력하세요 : 1
책 이름을 입력하세요 : 파이썬기초
책 저자를 입력하세요 : 호이
총 수량을 입력하세요 : 5
빌려간 수량을 입력하세요 : 2
책 등록이 완료되었습니다.
[{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}]
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
store
새로운 책 정보를 입력하세요
책 넘버를 입력하세요 : 2
책 이름을 입력하세요 : 정보처리기능사
책 저자를 입력하세요 : 영진
총 수량을 입력하세요 : 1
빌려간 수량을 입력하세요 : 0
책 등록이 완료되었습니다.
[{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 0, 'remaincount': 1}]
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
Borrow
도서 대출
도서 리스트 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 0, 'remaincount': 1}]
대출할 책 넘버를 입력하세요 : 2
해당 2번의 책이 1권 남아있습니다.
대여하시겠습니까? Y/N y
대여 완료되었습니다.
대여 후 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 1, 'remaincount': 0}]
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
borro
잘못 입력하셨습니다. 다시 입력 해주세요.
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
borrow
도서 대출
도서 리스트 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 2, 'remaincount': 3}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 1, 'remaincount': 0}]
대출할 책 넘버를 입력하세요 : 2
해당 2번의 책이 0권 남아있습니다.
대여할 수량이 없습니다.
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
return
도서 반납
반납할 책 넘버를 입력하세요 : 2
반납하시겠습니까? Y/N y
반납이 완료되었습니다.
대여 후 : [{'number': '1', 'title': '파이썬기초', 'author': '호이', 'totalcount': '5', 'borrowcount': 1, 'remaincount': 4}, {'number': '2', 'title': '정보처리기능사', 'author': '영진', 'totalcount': '1', 'borrowcount': 1, 'remaincount': 0}]
(왜 count가 안변하지...?)
다음 중 하실 작업을 입력하세요.
store - 새로운 책 등록
borrow - 도서 대출
return - 도서 반납
exit - 프로그램 종료
안녕히가세요 :)
교수님 코드
### 기능을 수행할 클래스(모듈 or 라이브러리) 정의 =>메모리 공간 생성 >메모리영역에 저장해서 따로 관리 가능
class LibraryKiosk:
### 클래스 생성자 정의
def __init__(self):
### 도서 목록을 저장할 딕셔너리 변수 생성
# - 도서번호, 도서제목, 도서재고수량 정보 담기
self.books = {}
print('클래스 생성 되었습니다.')
### 도서입고 기능 정의하기
def add_book(self, book_id, title, quantity):
### 입고할 도서번호가 존재하는지 확인
# - 존재한다면 수량만 증가시키기
# - self.books : books의 key값을 모두 가져옴(리스트 형태로)
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':4} }
self.books[book_id] = {'title':title, 'quantity':quantity}
print(f"도서번호 : {book_id} /제목 : {title} / 입고수량 : {quantity} 입고 성공!!")
### 도서 대출 기능 정의하기
def borrow_book(self, book_id):
### 대출하고자 하는 도서번호에 해당하는 재고수량 확인
if (book_id in self.books) and (self.books[book_id]['quantity']) > 0 :
self.books[book_id]['quantity'] -= 1
print("대출이 완료되었습니다.")
print(f"도서번호:{book_id} / 제목:{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"도서번호:{book_id} / 제목:{self.books[book_id]['title']} / 남은재고수량:{self.books[book_id]['quantity']}")
# - 해당 도서가 목록에 없다면
else:
print("해당 도서가 존재하지 않습니다.")
### 2. 최초에 실행할 기능(함수) 정의
def main():
### 클래스 생성하기
# - 최초 한번 : 프로그램이 종료되면 클래스는 소멸(메모리 공간 삭제)됩니다.
kiosk = LibraryKiosk()
print(kiosk)
#print('성공!')
###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':
# print('대출 선택')
book_id = input("대출할 도서번호를 입력해주세요 : ")
# - 클래스 내부의 대출 기능 호출하기
kiosk.borrow_book(book_id)
elif choice == '3':
# print('반납 선택')
book_id = input("반납할 도서번호를 입력해주세요 : ")
# - 클래스 내부의 반납 기능 호출하기
kiosk.return_book(book_id)
elif choice == '4':
print('종료 선택')
break
else:
print('잘못 선택하였습니다. 다시 선택해 주세요!')
### 1. 최초 코드 시작
if __name__ == "__main__":
### 최초에 실행할 기능(함수) 호출
main()
결과
클래스 생성 되었습니다.
<__main__.LibraryKiosk object at 0x000001D0CA163350>
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 : 1
도서 번호를 입력해 주세요 : 1
도서 제목을 입력해 주세요 : vkdlTjs
입고할 권수를 입력해 주세요 : 5
도서번호 : 1 /제목 : vkdlTjs / 입고수량 : 5 입고 성공!!
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 : 2
대출할 도서번호를 입력해주세요 : 1
대출이 완료되었습니다.
도서번호:1 / 제목:vkdlTjs / 남은재고수량:4
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 : 3
반납할 도서번호를 입력해주세요 : 1
도서번호:1 / 제목:vkdlTjs / 남은재고수량:5
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 : 3
반납할 도서번호를 입력해주세요 : 1
도서번호:1 / 제목:vkdlTjs / 남은재고수량:6
<도서 키오스크 메뉴>
1. 도서 입고
2. 도서 대출
3. 도서 반납
4. 종료
원하는 번호(1~4)를 선택하세요 : 4
종료 선택
※ 해결해야할 문제 : 반납을 계속시도하면 반납 count가 계속 늘어남, 유저 정보 넣지 않은 상태라서 누가 빌렸는지 모른다.
'Back-End > Python' 카테고리의 다른 글
파이썬 실습2 - 도서 입고/대출/반납 관리를 위한 키오스크 만들기 (데코레이터) (1) | 2023.11.14 |
---|---|
[Python] 파이썬 알고리즘 - 유니코드, 클로저(closure), 데코레이터 (3) | 2023.11.14 |
[Python] 파이썬 환경 설정 - anaconda3, jupyter notebook (2) | 2023.11.13 |
[Python] 인터프리터와 컴파일러 (3) | 2023.11.13 |
[Python][파이썬] 고객 정보 관리 시스템 만들기 실습 6 - class,mvc (2) | 2023.11.10 |