python

python 도서관리프로그램(difine)(2)

class="song" 2023. 11. 20.
728x90

2023.11.20 - [python] - python 도서관리프로그램(define)(1)

이전글에 이어서 작성한다.

 

이번에는 도서 관련 기능들을 만들어보자.

 

전글에서 작성했던것 처럼 이용자가 키워드를 입력하여 동작하는 형태로 코드를 구현하였다.

 

도서의 데이터 형태는 dictionary를 사용하였다 book = {}

도서들을 묶은 데이터의 형태는 list를 사용하였다. book_list = []

 

우선 이용자가 키워드를 입력할 수 있도록 함수를 정의하였다.

 

def input_menu():
    return input("""
    원하시는 메뉴를 눌러주세요.
    I : 도서 입고
    R : 도서 반납
    L : 도서 대출
    C : 도서 상태 확인
    B : 전체 도서 목록
    Q : 프로그램 종료
    """).upper()

소문자로 입력하여도 대문자로 인식될 수 있게 upper() 함수를 사용하였다.

 

그리고 입력 받은 키워드에 따라 기능이 실행되는 함수도 정의하였다.

def Main() :
    #입고
    while True :
        menu = input_menu()
        if menu == 'I' :
            do_I()
        #반납
        elif menu == 'R' :
            do_R()
        #대출
        elif menu == 'L' :
            do_L()
        #도서 상태 확인
        elif menu == 'C' :
            do_C()
        # 전체 도서 목록 확인
        elif menu == 'B' :
            do_B()
    
        elif menu == 'Q' :
            check = input('종료하시겠습니까? (Y/N)').upper()
            if check == "Y" :
                break
        else :
            print('잘못입력하셨습니다.')

회원 관련 기능과 같이 종료에는 함수를 따로 정의하지 않고, 체크를 한번 더 받고 종료할 수 있도록 바로 코드를 작성했다.

 

이제 각 기능들을 만들어보자

 

 

* 도서 입고 기능

def do_I() :
    book = {}
    book['번호'] = input('도서번호을 입력해주세요. : ')
    book['제목'] = input('도서제목을 입력해주세요. : ')
    book['수량'] = int(input('도서수량을 입력해주세요. : '))
    book['대출중'] = 0
    book['전체권수'] = book['수량']

    while True :
        if len(book_list) == 0 :
            book_list.append(book)
            print(book_list)
            break
        else :
            i = 0
            while True :
                if i >= len(book_list) :
                    book_list.append(book)
                    print(book_list)
                    break
                else :
                    if book['번호'] == book_list[i]['번호'] :
                        book_list[i]['전체권수'] += book['수량']
                        book_list[i]['수량'] += book['수량']
                        print(book_list)
                        break
                    else :
                        i += 1
                        continue
            break

도서의 데이터들은 도서번호, 도서제목, 도서수량(현재 있는 재고), 대출 중인 도서 수량, 도서의 전체권수를 가지고 있다.

대출 중인 도서는 대출기능을 실행해야 값이 변경되므로 초기 값은 0으로 할당했다.

 

전체권수는 중복으로 도서를 등록할 때 수량이 +되도록 할당하였다.

 

우선 book_list의 데이터의 길이가 0일 경우 아무것도 데이터가 들어있지 않아, 중복될 수 없으므로 바로 append 시켜주었다.

 

그러고 난후 리스트 안에 중복된 도서가 있는지 확인하기 위해 list의 인덱스 기능을 사용할 것이다.

인덱스의 번호는 i를 사용하여 제어문 while을 사용하여 중복도서를 찾으려고 생각했다.

 

i가 book_list의 길이보다 값이 커진다면, list의 인덱스 범위를 벗어나 중복되지 않는 것을 의미하므로 append 시켜주었다.

 

중복되는 도서는 번호로 찾았는데 제목으로 체크하여도 무방하다.

중복된다면, 전체권수에 추가되는 수량을 추가해 주었다.

현재가지고 있는 재고도(수량) 함께 추가해 주었다.

 

반복문이 돌아가면서 번호가 중복되지 않으면 그 다음번의 인덱스를 확인하기 위해서 i의 값을 1씩 더해주었다.

 

 

 

 

 

* 도서 대출 기능

def do_L() :
    while True :
        if len(book_list) == 0:
            print('데이터가 없습니다.')
        else:
            i = -1
            name = input('도서제목을 입력해주세요')
            while True :
                i += 1
                if i == len(book_list):
                    print('등록되지 않은 도서입니다.')
                    break
                else :
                    
                    if book_list[i].get('제목') == name :
                        if book_list[i].get('대출중') == book_list[i].get('전체권수') :
                            print('재고가 없습니다.')
                            break
                        else :
                            book_list[i]['수량'] -= 1
                            book_list[i]['대출중'] += 1
                            print(book_list)
                            break
            break

도서를 대출하는 기능도 입고와 비슷한 형태로 코드를 작성하였다.

리스트의 길이가 0 이라면 데이터가 없어 이용자에게 입력받기 전에 데이터가 없다고 알려주었다.

 

list에 데이터가 있다면 i를 -1부터 시작했는데 입고처럼 0부터 시작해도 무방하다.

도서의 제목으로 리스트에 원하는 도서가 있는지 먼저 체크한다.

제어문 while을 사용하였고, i가 list의 길이보다 크다면 중복되는 게 없으므로 등록되지 않는 도서라고 print 하였다.

그리고 난 후 책의 수량(재고)이 없을 때 == 대출 중인 도서의 수량이 전체권수와 같다면 재고가 없다고 print 하였다.

재고가 있다면 수량을 -1해 주고, 대출 중에 +1 해주었다.

 

 

 

 

 

* 도서 반납 기능

def do_R() :
    while True :
        if len(book_list) == 0:
            print('데이터가 없습니다.')
        else:
            i = -1
            name = input('도서제목을 입력해주세요')
            while True :
                i += 1
                if i == len(book_list):
                    print('등록되지 않은 도서입니다.')
                    break
                else :
                    if book_list[i].get('제목') == name :
                        if book_list[i].get('대출중') == 0 :
                            print('대출중인 도서가 없습니다.')
                            break
                        else :
                            book_list[i]['수량'] += 1
                            book_list[i]['대출중'] -= 1
                            print(book_list)
                            break
            break

반납은 대출에 반대로 작성하였다.

도서의 대출 중이 0이라면 반납할 수 없다.

 

 

 

 

 

* 도서의 현재 상태 확인 기능

def do_C() :
    while True :
        if len(book_list) == 0:
            print('데이터가 없습니다.')
        else:
            i = -1
            name = input('도서제목을 입력해주세요')
            while True :
                i += 1
                if i == len(book_list):
                    print('등록되지 않은 도서입니다.')
                    break
                else :
                    if book_list[i].get('제목') == name :
                        print(book_list[i])
                        break
            break

똑같은 형태로 현재 도서의 상태를 확인할 수 있다.

조건이 맞다면 book_list[i]를 print 하여 특정 도서의 현재 상태를 볼 수 있다.

 

 

 

* 전체 도서 확인 기능

def do_B() :
    print(book_list)

 

 

 

종료

 

중복되는 코드를 사용하여 생각보다 편하게 기능들을 만들 수 있었다.

 

이번 프로그램을 만들면서 while문에 break를 사용하는 것이 중요한 것을 크게 느꼈다.

 

로직을 잘 만들어 두어도 break를 빼먹으면 기능이 정상적으로 동작하지 않았다. 

 

 

728x90

'python' 카테고리의 다른 글

Django 시작하기  (0) 2024.02.05
python 도서관리프로그램(define)(1)  (0) 2023.11.20
python 기초 (함수(function))  (4) 2023.11.20
python 기초(정규식(Regular Expression))  (1) 2023.11.16
python 기초 (예외 처리)  (5) 2023.11.16

댓글