반응형
시나리오
도서 관리 프로그램은 콘솔 응용 프로그램이다.
응용에서는 사용자와 상호작용을 담당한다.
응용은 사용자에게 메뉴를 보여주고 선택한 메뉴를 수행하는 것을 반복한다.
메뉴에는 장르 추가, 도서 추가,도서 삭제, 도서 검색, 전체 도서 보기, 프로그램 종료가 있다.
장르 추가를 선택하면 추가할 장르 명을 입력받아 추가한다.
도서 추가를 선택하면 장르를 선택하고 도서 정보를 입력받아 추가한다.
도서는 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()
기술 포트폴리오 예
반응형
'언어 자료구조 알고리즘 > 프로그래밍 실습' 카테고리의 다른 글
[python] 상속 실습 - 음악가, 피아니스트 (0) | 2020.10.30 |
---|---|
[python] 캡슐화 실습 - 음악가 정의하기 (0) | 2020.10.29 |
[python] 캡슐화 실습 - 직사각형 클래스 정의하기 (0) | 2020.10.29 |
[python] 캡슐화 실습 - 생성자(초기화) 정의하기 (0) | 2020.10.29 |
[python] 캡슐화 실습 - 학생 유닛 키우기 (0) | 2020.10.29 |
[python] 도서 관리 프로그램 - 파일 입출력 포함 (0) | 2020.10.27 |
[python] 도서 관리 프로그램 (리스트 사용, 클래스 사용X) (0) | 2020.10.26 |
[python] 함수 실습 (0) | 2020.10.23 |
[python] 제어문 실습 (0) | 2020.10.22 |
[C# 실습,통신 제어] 반도체 증착공정 및 Burn in 테스트 설비 시뮬레이션 (0) | 2020.10.13 |