언어 자료구조 알고리즘/프로그래밍 실습

[python] 도서 관리 프로그램 - 클래스 및 파일 입출력 포함

언제나휴일 2020. 10. 28. 15:49
반응형

시나리오

도서 관리 프로그램은 콘솔 응용 프로그램이다. 
응용에서는 사용자와 상호작용을 담당한다. 
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다. 
메뉴에는 장르 추가, 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다. 
장르 추가를 선택하면 추가할 장르 명을 입력받아 추가한다. 
도서 추가를 선택하면 장르를 선택하고 도서 정보를 입력받아 추가한다. 
도서는 ISBN(주요키), 도서명, 저자, 출판사, 가격 정보를 사용자로부터 입력받는다. 
도서 삭제 기능에서는 도서의 ISBN을 사용자로부터 입력받아 삭제한다. 
도서 검색 기능에서는 도서의 ISBN을 사용자로부터 입력받아 검색한다. 
전체 보기에서는 전체 도서 정보를 출력한다. 

프로그램 종료할 때 데이터를 파일에 저장하고 프로그램 시작할 때 로딩한다.

 

 

클래스 다이어그램


common.py

#common.py - 공통적으로 사용할 만한 기능

def input_int(msg=''):
    try:
        ns = input(msg)
        return int(ns)
    except:
        return 0
def tryinput_int(msg=''):
    try:
        ns = input(msg)
        return int(ns),True
    except:
        return 0,False

Book.py

class Book:
    def __init__(self,isbn,title,gn,author,publisher,price):
        self.isbn = isbn
        self.title = title
        self.gn = gn
        self.author = author
        self.publisher = publisher
        self.price = price
    def Write(self,fs):
        fs.write(self.isbn+",")
        fs.write(self.title+",")
        fs.write(str(self.gn)+",")
        fs.write(self.author+",")
        fs.write(self.publisher+",")
        fs.write(str(self.price)+"\n")
    @staticmethod
    def LoadBook(fs):
        data = fs.readline()
        elems = data.split(",")
        if len(elems)<6:
            return None
        isbn = elems[0]
        title = elems[1]
        gn = int(elems[2])
        author = elems[3]
        publisher = elems[4]
        price = int(elems[5][:-1])
        return Book(isbn,title,gn,author,publisher,price)


Applicataion.py

import os
from Book import Book
from common import input_int
from common import tryinput_int
class Application:
    def __init__(self):
        self.genres= list()
        self.books = list()
    def Run(self):
        self.Load()
        while True:
            key = self.SelectMenu()
            if key == '0':
                break
            elif key ==  '1':
                self.AddGenre()
            elif key =='2':
                self.AddBook()
            elif key == '3':
                self.RemoveBook()
            elif key == '4':
                self.FindBook()
            elif key =='5':
                self.ViewAll()
            else:
                print("잘못 선택하였습니다.")
            input("엔터 키를 누르세요.")
        self.Save()
    def Load(self):
        print("===Load===")
        try:
            self.LoadGenres()
            self.LoadBooks()
        except:
            print("환영합니다. 즐~")
        input("엔터 키를 누르세요.")
    def LoadGenres(self):
        fs = open("genres.csv","r")
        datas = fs.read()
        #datas:["시\n수필\n소설\n"]
        ds_gs = datas.split("\n")#개행 문자를 기준으로 분리
        #dg_gs:["시","수필","소설",""]
        fs.close()
        ds_gs.pop()#맨 마지막 원소 삭제
        #ds_gs:["시","수필","소설"]
        self.genres.extend(ds_gs)
    def LoadBooks(self):
        fs = open("books.csv","r")
        while True:
            book = Book.LoadBook(fs)
            if book == None:
                break
            self.books.append(book)
        fs.close()
    def Save(self):
        print("===Save===")
        self.SaveGenres()
        self.SaveBooks()
    def SaveGenres(self):
        fs = open("genres.csv","w")
        for genre in self.genres:
            fs.write(genre+"\n")
        fs.close()
    def SaveBooks(self):
        fs = open("books.csv","w")
        for book in self.books:
            book.Write(fs)
        fs.close()
    def SelectMenu(self):
        os.system("cls")
        print("==  도서 관리 프로그램 ==")
        print("1:장르 추가")
        print("2:도서 추가")
        print("3:도서 삭제")
        print("4:도서 검색")
        print("5:전체 보기")
        return input("\n메뉴 입력 ◀:")
    def AddGenre(self):
        print("===장르 추가===")
        self.ViewGenres()
        genre = input("추가할 장르 명:")
        self.genres.append(genre)
    def ViewGenres(self):
        sz = len(self.genres)
        for i in range(0,sz):
            print("{0}:{1}".format(i+1, self.genres[i]),end='  ')
        print()
    def AddBook(self):
        print("===도서 추가===")
        gn = self.SelectGenre()#장르를 선택한다.
        if gn == 0:#잘못 선택하였을 때
            print("잘못 선택하였습니다.")
            return
        isbn = input("ISBN:")#ISBN을 입력받는다.
        sbook = self.Find(isbn)#ISBN으로 도서를 검색한다.
        if sbook != None:#검색한 도서가 존재하면
            print("이미 존재하는 ISBN입니다.")
            return
        book = self.MakeBook(isbn,gn)#도서 개체를 만든다.
        self.books.append(book)#도서 컬렉션에 추가한다.
    def SelectGenre(self):
        self.ViewGenres()
        gn = input_int("선택할 장르 번호:")
        if gn>0 and gn<=len(self.genres):
            return gn
        return 0
    def Find(self,isbn):
        for book in self.books:
            if book.isbn == isbn:
                return book
        return None
    def MakeBook(self,isbn,gn):
        title = input("제목:")
        author = input("저자:")
        publisher = input("출판사:")
        price = input_int("가격:")
        return Book(isbn,title,gn,author,publisher,price)
    def RemoveBook(self):
        print("===도서 삭제===")
        isbn = input("isbn:")
        book =self.Find(isbn)
        if book == None:
            print("존재하지 않는 도서입니다.")
            return
        self.books.remove(book)
        del book #메모리에서 제거
        print("삭제하였습니다.")
    def FindBook(self):
        print("===도서 검색===")
        isbn = input("isbn:")
        book =self.Find(isbn)
        if book == None:
            print("존재하지 않는 도서입니다.")
            return
        self.ViewBook(book)
    def ViewAll(self):
        print("===전체 보기===")
        self.ViewGenres()
        self.ViewBooks()
    def ViewBooks(self):
        print("===도서 목록:{0}권".format(len(self.books)))
        for book in self.books:
            self.ViewBook(book)
    def ViewBook(self,book):
        print("{0}:{1}".format(book.isbn,book.title))
        print("\t장르 번호:",book.gn)
        print("\t저자:",book.author)
        print("\t출판사:",book.publisher)
        print("\t가격:",book.price)
        

main.py

import Application
def main():
    app = Application.Application()
    app.Run()
if __name__ == '__main__':
    main()

기술 포트폴리오 예

[기술 포트폴리오]도서 관리 프로그램- 캡슐화, 파일 입출력.docx
0.19MB

반응형